blob: 3e7e3326a23699ecec391aa5851271a22a6dffe8 [file] [log] [blame]
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11001/*
2 * SAX Reader implementation
3 *
4 * Copyright 2008 Alistair Leslie-Hughes
Piotr Caband3e9ca72008-07-17 00:40:32 +02005 * Copyright 2008 Piotr Caban
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11006 *
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.
11 *
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.
16 *
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
20 */
21#define COBJMACROS
22
23#include "config.h"
24
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"
37
38#include "wine/debug.h"
39
40#include "msxml_private.h"
41
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +110042WINE_DEFAULT_DEBUG_CHANNEL(msxml);
43
44#ifdef HAVE_LIBXML2
45
Lei Zhang724d4b12008-03-25 13:59:46 -070046#include <libxml/SAX2.h>
Piotr Cabandf5e40e2008-07-31 16:45:30 +020047#include <libxml/parserInternals.h>
Lei Zhang724d4b12008-03-25 13:59:46 -070048
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +110049typedef struct _saxreader
50{
Piotr Caban4c69e862008-07-31 16:47:26 +020051 const struct IVBSAXXMLReaderVtbl *lpVBSAXXMLReaderVtbl;
Piotr Caban19267602008-07-08 20:52:04 +020052 const struct ISAXXMLReaderVtbl *lpSAXXMLReaderVtbl;
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +110053 LONG ref;
Piotr Caban3fa75f42008-07-08 21:00:20 +020054 struct ISAXContentHandler *contentHandler;
Piotr Cabanc52e0912008-07-31 16:48:03 +020055 struct IVBSAXContentHandler *vbcontentHandler;
Piotr Cabanbe89ee12008-07-08 20:52:41 +020056 struct ISAXErrorHandler *errorHandler;
Piotr Cabanc52e0912008-07-31 16:48:03 +020057 struct IVBSAXErrorHandler *vberrorHandler;
Piotr Cabanc7fc9262008-10-01 19:52:36 +020058 struct ISAXLexicalHandler *lexicalHandler;
59 struct IVBSAXLexicalHandler *vblexicalHandler;
60 struct ISAXDeclHandler *declHandler;
61 struct IVBSAXDeclHandler *vbdeclHandler;
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +110062 xmlSAXHandler sax;
Piotr Cabanc7fc9262008-10-01 19:52:36 +020063 BOOL isParsing;
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +110064} saxreader;
65
Piotr Caband3e9ca72008-07-17 00:40:32 +020066typedef struct _saxlocator
67{
Piotr Caban4c69e862008-07-31 16:47:26 +020068 const struct IVBSAXLocatorVtbl *lpVBSAXLocatorVtbl;
Piotr Caband3e9ca72008-07-17 00:40:32 +020069 const struct ISAXLocatorVtbl *lpSAXLocatorVtbl;
70 LONG ref;
71 saxreader *saxreader;
Piotr Caban51c95272008-07-17 00:40:53 +020072 HRESULT ret;
73 xmlParserCtxtPtr pParserCtxt;
Piotr Caban60ca0a72008-07-17 00:42:01 +020074 WCHAR *publicId;
Piotr Caban3196f782008-07-17 00:42:07 +020075 WCHAR *systemId;
Piotr Cabanbb849dc2008-07-23 16:39:04 +020076 xmlChar *lastCur;
77 int line;
Piotr Cabanc801c182008-10-07 22:10:43 +020078 int realLine;
Piotr Cabanbb849dc2008-07-23 16:39:04 +020079 int column;
Piotr Cabanc801c182008-10-07 22:10:43 +020080 int realColumn;
Piotr Cabanc52e0912008-07-31 16:48:03 +020081 BOOL vbInterface;
Piotr Caban03f79092008-08-20 18:20:50 +020082 int nsStackSize;
83 int nsStackLast;
84 int *nsStack;
Piotr Caband3e9ca72008-07-17 00:40:32 +020085} saxlocator;
86
Piotr Caban5816c382008-07-27 19:55:05 +020087typedef struct _saxattributes
88{
Piotr Caban4c69e862008-07-31 16:47:26 +020089 const struct IVBSAXAttributesVtbl *lpVBSAXAttributesVtbl;
Piotr Caban5816c382008-07-27 19:55:05 +020090 const struct ISAXAttributesVtbl *lpSAXAttributesVtbl;
91 LONG ref;
Piotr Caban6df49d52008-07-30 20:24:12 +020092 int nb_attributes;
93 BSTR *szLocalname;
Piotr Caban6df49d52008-07-30 20:24:12 +020094 BSTR *szURI;
95 BSTR *szValue;
Piotr Caban6818cc62008-07-31 16:45:42 +020096 BSTR *szQName;
Piotr Caban5816c382008-07-27 19:55:05 +020097} saxattributes;
98
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +110099static inline saxreader *impl_from_IVBSAXXMLReader( IVBSAXXMLReader *iface )
100{
Piotr Caban4c69e862008-07-31 16:47:26 +0200101 return (saxreader *)((char*)iface - FIELD_OFFSET(saxreader, lpVBSAXXMLReaderVtbl));
Andrew Talbot7142fc12008-03-31 20:42:18 +0100102}
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +1100103
Piotr Caban19267602008-07-08 20:52:04 +0200104static inline saxreader *impl_from_ISAXXMLReader( ISAXXMLReader *iface )
105{
106 return (saxreader *)((char*)iface - FIELD_OFFSET(saxreader, lpSAXXMLReaderVtbl));
107}
108
Piotr Caban4c69e862008-07-31 16:47:26 +0200109static inline saxlocator *impl_from_IVBSAXLocator( IVBSAXLocator *iface )
110{
111 return (saxlocator *)((char*)iface - FIELD_OFFSET(saxlocator, lpVBSAXLocatorVtbl));
112}
113
Piotr Caband3e9ca72008-07-17 00:40:32 +0200114static inline saxlocator *impl_from_ISAXLocator( ISAXLocator *iface )
115{
116 return (saxlocator *)((char*)iface - FIELD_OFFSET(saxlocator, lpSAXLocatorVtbl));
117}
118
Piotr Caban4c69e862008-07-31 16:47:26 +0200119static inline saxattributes *impl_from_IVBSAXAttributes( IVBSAXAttributes *iface )
120{
121 return (saxattributes *)((char*)iface - FIELD_OFFSET(saxattributes, lpVBSAXAttributesVtbl));
122}
123
Piotr Caban5816c382008-07-27 19:55:05 +0200124static inline saxattributes *impl_from_ISAXAttributes( ISAXAttributes *iface )
125{
126 return (saxattributes *)((char*)iface - FIELD_OFFSET(saxattributes, lpSAXAttributesVtbl));
127}
128
Piotr Cabanbb849dc2008-07-23 16:39:04 +0200129
Piotr Caban03f79092008-08-20 18:20:50 +0200130static HRESULT namespacePush(saxlocator *locator, int ns)
131{
132 if(locator->nsStackLast>=locator->nsStackSize)
133 {
134 int *new_stack;
135
136 new_stack = HeapReAlloc(GetProcessHeap(), 0,
137 locator->nsStack, locator->nsStackSize*2);
138 if(!new_stack) return E_OUTOFMEMORY;
139 locator->nsStack = new_stack;
140 locator->nsStackSize *= 2;
141 }
142 locator->nsStack[locator->nsStackLast++] = ns;
143
144 return S_OK;
145}
146
147static int namespacePop(saxlocator *locator)
148{
149 if(locator->nsStackLast == 0) return 0;
150 return locator->nsStack[--locator->nsStackLast];
151}
152
Piotr Caban319d86c2008-08-03 14:37:37 +0200153static BSTR bstr_from_xmlCharN(const xmlChar *buf, int len)
Piotr Caban6df49d52008-07-30 20:24:12 +0200154{
155 DWORD dLen;
156 LPWSTR str;
157 BSTR bstr;
158
159 if (!buf)
160 return NULL;
161
162 dLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, NULL, 0);
163 if(len != -1) dLen++;
164 str = (LPWSTR)HeapAlloc(GetProcessHeap(), 0, dLen * sizeof (WCHAR));
165 if (!str)
166 return NULL;
167 MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, str, dLen);
168 if(len != -1) str[dLen-1] = '\0';
169 bstr = SysAllocString(str);
170 HeapFree(GetProcessHeap(), 0, str);
171
172 return bstr;
173}
174
Piotr Caban319d86c2008-08-03 14:37:37 +0200175static BSTR QName_from_xmlChar(const xmlChar *prefix, const xmlChar *name)
176{
177 DWORD dLen, dLast;
178 LPWSTR str;
179 BSTR bstr;
180
181 if(!name) return NULL;
182
183 if(!prefix || *prefix=='\0')
184 return bstr_from_xmlChar(name);
185
186 dLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)prefix, -1, NULL, 0)
187 + MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1, NULL, 0);
188 str = HeapAlloc(GetProcessHeap(), 0, dLen * sizeof(WCHAR));
189 if(!str)
190 return NULL;
191
192 dLast = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)prefix, -1, str, dLen);
193 str[dLast-1] = ':';
194 MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)name, -1, &str[dLast], dLen-dLast);
195 bstr = SysAllocString(str);
196
197 HeapFree(GetProcessHeap(), 0, str);
198
199 return bstr;
200}
201
Piotr Cabanbba7eb52008-07-19 22:32:10 +0200202static void format_error_message_from_id(saxlocator *This, HRESULT hr)
203{
204 xmlStopParser(This->pParserCtxt);
205 This->ret = hr;
206
Piotr Caban7b7a1872008-08-20 18:32:23 +0200207 if((This->vbInterface && This->saxreader->vberrorHandler)
208 || (!This->vbInterface && This->saxreader->errorHandler))
Piotr Cabanbba7eb52008-07-19 22:32:10 +0200209 {
210 WCHAR msg[1024];
211 if(!FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM,
212 NULL, hr, 0, msg, sizeof(msg), NULL))
213 {
214 FIXME("MSXML errors not yet supported.\n");
215 msg[0] = '\0';
216 }
217
Piotr Cabanc52e0912008-07-31 16:48:03 +0200218 if(This->vbInterface)
219 {
220 BSTR bstrMsg = SysAllocString(msg);
221 IVBSAXErrorHandler_fatalError(This->saxreader->vberrorHandler,
222 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl, &bstrMsg, hr);
223 }
224 else
225 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
226 (ISAXLocator*)&This->lpSAXLocatorVtbl, msg, hr);
Piotr Cabanbba7eb52008-07-19 22:32:10 +0200227 }
228}
229
Piotr Cabanbb849dc2008-07-23 16:39:04 +0200230static void update_position(saxlocator *This, xmlChar *end)
231{
232 if(This->lastCur == NULL)
233 {
234 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
Piotr Cabanc801c182008-10-07 22:10:43 +0200235 This->realLine = 1;
236 This->realColumn = 1;
Piotr Cabanbb849dc2008-07-23 16:39:04 +0200237 }
Piotr Cabandf5e40e2008-07-31 16:45:30 +0200238 else if(This->lastCur < This->pParserCtxt->input->base)
239 {
240 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
Piotr Cabanc801c182008-10-07 22:10:43 +0200241 This->realLine = 1;
242 This->realColumn = 1;
243 }
244
245 if(This->pParserCtxt->input->cur<This->lastCur)
246 {
247 This->lastCur = (xmlChar*)This->pParserCtxt->input->base;
248 This->realLine -= 1;
249 This->realColumn = 1;
Piotr Cabandf5e40e2008-07-31 16:45:30 +0200250 }
Piotr Cabanbb849dc2008-07-23 16:39:04 +0200251
252 if(!end) end = (xmlChar*)This->pParserCtxt->input->cur;
253
254 while(This->lastCur < end)
255 {
256 if(*(This->lastCur) == '\n')
257 {
Piotr Cabanc801c182008-10-07 22:10:43 +0200258 This->realLine++;
259 This->realColumn = 1;
Piotr Cabanbb849dc2008-07-23 16:39:04 +0200260 }
Piotr Cabanc801c182008-10-07 22:10:43 +0200261 else if(*(This->lastCur) == '\r' &&
262 (This->lastCur==This->pParserCtxt->input->end ||
263 *(This->lastCur+1)!='\n'))
Piotr Cabanbb849dc2008-07-23 16:39:04 +0200264 {
Piotr Cabanc801c182008-10-07 22:10:43 +0200265 This->realLine++;
266 This->realColumn = 1;
Piotr Cabanbb849dc2008-07-23 16:39:04 +0200267 }
Piotr Cabanc801c182008-10-07 22:10:43 +0200268 else This->realColumn++;
Piotr Cabanbb849dc2008-07-23 16:39:04 +0200269
270 This->lastCur++;
Piotr Cabanc801c182008-10-07 22:10:43 +0200271
272 /* Count multibyte UTF8 encoded characters once */
273 while((*(This->lastCur)&0xC0) == 0x80) This->lastCur++;
Piotr Cabanbb849dc2008-07-23 16:39:04 +0200274 }
Piotr Cabanc801c182008-10-07 22:10:43 +0200275
276 This->line = This->realLine;
277 This->column = This->realColumn;
Piotr Cabanbb849dc2008-07-23 16:39:04 +0200278}
279
Piotr Cabancafbf852008-07-31 16:47:41 +0200280/*** IVBSAXAttributes interface ***/
281/*** IUnknown methods ***/
282static HRESULT WINAPI ivbsaxattributes_QueryInterface(
283 IVBSAXAttributes* iface,
284 REFIID riid,
285 void **ppvObject)
286{
287 saxattributes *This = impl_from_IVBSAXAttributes(iface);
288
289 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
290
291 *ppvObject = NULL;
292
293 if (IsEqualGUID(riid, &IID_IUnknown) ||
294 IsEqualGUID(riid, &IID_IDispatch) ||
295 IsEqualGUID(riid, &IID_IVBSAXAttributes))
296 {
297 *ppvObject = iface;
298 }
299 else
300 {
301 FIXME("interface %s not implemented\n", debugstr_guid(riid));
302 return E_NOINTERFACE;
303 }
304
305 IVBSAXAttributes_AddRef(iface);
306
307 return S_OK;
308}
309
310static ULONG WINAPI ivbsaxattributes_AddRef(IVBSAXAttributes* iface)
311{
312 saxattributes *This = impl_from_IVBSAXAttributes(iface);
313 return ISAXAttributes_AddRef((ISAXAttributes*)&This->lpSAXAttributesVtbl);
314}
315
316static ULONG WINAPI ivbsaxattributes_Release(IVBSAXAttributes* iface)
317{
318 saxattributes *This = impl_from_IVBSAXAttributes(iface);
319 return ISAXAttributes_Release((ISAXAttributes*)&This->lpSAXAttributesVtbl);
320}
321
322/*** IDispatch methods ***/
323static HRESULT WINAPI ivbsaxattributes_GetTypeInfoCount( IVBSAXAttributes *iface, UINT* pctinfo )
324{
325 saxattributes *This = impl_from_IVBSAXAttributes( iface );
326
327 TRACE("(%p)->(%p)\n", This, pctinfo);
328
329 *pctinfo = 1;
330
331 return S_OK;
332}
333
334static HRESULT WINAPI ivbsaxattributes_GetTypeInfo(
335 IVBSAXAttributes *iface,
336 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
337{
338 saxattributes *This = impl_from_IVBSAXAttributes( iface );
339 HRESULT hr;
340
341 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
342
343 hr = get_typeinfo(IVBSAXAttributes_tid, ppTInfo);
344
345 return hr;
346}
347
348static HRESULT WINAPI ivbsaxattributes_GetIDsOfNames(
349 IVBSAXAttributes *iface,
350 REFIID riid,
351 LPOLESTR* rgszNames,
352 UINT cNames,
353 LCID lcid,
354 DISPID* rgDispId)
355{
356 saxattributes *This = impl_from_IVBSAXAttributes( iface );
357 ITypeInfo *typeinfo;
358 HRESULT hr;
359
360 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
361 lcid, rgDispId);
362
363 if(!rgszNames || cNames == 0 || !rgDispId)
364 return E_INVALIDARG;
365
366 hr = get_typeinfo(IVBSAXAttributes_tid, &typeinfo);
367 if(SUCCEEDED(hr))
368 {
369 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
370 ITypeInfo_Release(typeinfo);
371 }
372
373 return hr;
374}
375
376static HRESULT WINAPI ivbsaxattributes_Invoke(
377 IVBSAXAttributes *iface,
378 DISPID dispIdMember,
379 REFIID riid,
380 LCID lcid,
381 WORD wFlags,
382 DISPPARAMS* pDispParams,
383 VARIANT* pVarResult,
384 EXCEPINFO* pExcepInfo,
385 UINT* puArgErr)
386{
387 saxattributes *This = impl_from_IVBSAXAttributes( iface );
388 ITypeInfo *typeinfo;
389 HRESULT hr;
390
391 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
392 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
393
394 hr = get_typeinfo(IVBSAXAttributes_tid, &typeinfo);
395 if(SUCCEEDED(hr))
396 {
397 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXAttributesVtbl), dispIdMember, wFlags, pDispParams,
398 pVarResult, pExcepInfo, puArgErr);
399 ITypeInfo_Release(typeinfo);
400 }
401
402 return hr;
403}
404
405/*** IVBSAXAttributes methods ***/
406static HRESULT WINAPI ivbsaxattributes_get_length(
407 IVBSAXAttributes* iface,
408 int *nLength)
409{
410 saxattributes *This = impl_from_IVBSAXAttributes( iface );
411 return ISAXAttributes_getLength(
412 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
413 nLength);
414}
415
416static HRESULT WINAPI ivbsaxattributes_getURI(
417 IVBSAXAttributes* iface,
418 int nIndex,
419 BSTR *uri)
420{
421 int len;
422 saxattributes *This = impl_from_IVBSAXAttributes( iface );
423 return ISAXAttributes_getURI(
424 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
425 nIndex, (const WCHAR**)uri, &len);
426}
427
428static HRESULT WINAPI ivbsaxattributes_getLocalName(
429 IVBSAXAttributes* iface,
430 int nIndex,
431 BSTR *localName)
432{
433 int len;
434 saxattributes *This = impl_from_IVBSAXAttributes( iface );
435 return ISAXAttributes_getLocalName(
436 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
437 nIndex, (const WCHAR**)localName, &len);
438}
439
440static HRESULT WINAPI ivbsaxattributes_getQName(
441 IVBSAXAttributes* iface,
442 int nIndex,
443 BSTR *QName)
444{
445 int len;
446 saxattributes *This = impl_from_IVBSAXAttributes( iface );
447 return ISAXAttributes_getQName(
448 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
449 nIndex, (const WCHAR**)QName, &len);
450}
451
452static HRESULT WINAPI ivbsaxattributes_getIndexFromName(
453 IVBSAXAttributes* iface,
454 BSTR uri,
455 BSTR localName,
456 int *index)
457{
458 saxattributes *This = impl_from_IVBSAXAttributes( iface );
459 return ISAXAttributes_getIndexFromName(
460 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
461 (const WCHAR*)uri, SysStringLen(uri),
462 (const WCHAR*)localName, SysStringLen(localName), index);
463}
464
465static HRESULT WINAPI ivbsaxattributes_getIndexFromQName(
466 IVBSAXAttributes* iface,
467 BSTR QName,
468 int *index)
469{
470 saxattributes *This = impl_from_IVBSAXAttributes( iface );
471 return ISAXAttributes_getIndexFromQName(
472 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
473 (const WCHAR*)QName, SysStringLen(QName), index);
474}
475
476static HRESULT WINAPI ivbsaxattributes_getType(
477 IVBSAXAttributes* iface,
478 int nIndex,
479 BSTR *type)
480{
481 int len;
482 saxattributes *This = impl_from_IVBSAXAttributes( iface );
483 return ISAXAttributes_getType(
484 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
485 nIndex, (const WCHAR**)type, &len);
486}
487
488static HRESULT WINAPI ivbsaxattributes_getTypeFromName(
489 IVBSAXAttributes* iface,
490 BSTR uri,
491 BSTR localName,
492 BSTR *type)
493{
494 int len;
495 saxattributes *This = impl_from_IVBSAXAttributes( iface );
496 return ISAXAttributes_getTypeFromName(
497 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
498 (const WCHAR*)uri, SysStringLen(uri),
499 (const WCHAR*)localName, SysStringLen(localName),
500 (const WCHAR**)type, &len);
501}
502
503static HRESULT WINAPI ivbsaxattributes_getTypeFromQName(
504 IVBSAXAttributes* iface,
505 BSTR QName,
506 BSTR *type)
507{
508 int len;
509 saxattributes *This = impl_from_IVBSAXAttributes( iface );
510 return ISAXAttributes_getTypeFromQName(
511 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
512 (const WCHAR*)QName, SysStringLen(QName),
513 (const WCHAR**)type, &len);
514}
515
516static HRESULT WINAPI ivbsaxattributes_getValue(
517 IVBSAXAttributes* iface,
518 int nIndex,
519 BSTR *value)
520{
521 int len;
522 saxattributes *This = impl_from_IVBSAXAttributes( iface );
523 return ISAXAttributes_getValue(
524 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
525 nIndex, (const WCHAR**)value, &len);
526}
527
528static HRESULT WINAPI ivbsaxattributes_getValueFromName(
529 IVBSAXAttributes* iface,
530 BSTR uri,
531 BSTR localName,
532 BSTR *value)
533{
534 int len;
535 saxattributes *This = impl_from_IVBSAXAttributes( iface );
536 return ISAXAttributes_getValueFromName(
537 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
538 (const WCHAR*)uri, SysStringLen(uri),
539 (const WCHAR*)localName, SysStringLen(localName),
540 (const WCHAR**)value, &len);
541}
542
543static HRESULT WINAPI ivbsaxattributes_getValueFromQName(
544 IVBSAXAttributes* iface,
545 BSTR QName,
546 BSTR *value)
547{
548 int len;
549 saxattributes *This = impl_from_IVBSAXAttributes( iface );
550 return ISAXAttributes_getValueFromQName(
551 (ISAXAttributes*)&This->lpSAXAttributesVtbl,
552 (const WCHAR*)QName, SysStringLen(QName),
553 (const WCHAR**)value, &len);
554}
555
556static const struct IVBSAXAttributesVtbl ivbsaxattributes_vtbl =
557{
558 ivbsaxattributes_QueryInterface,
559 ivbsaxattributes_AddRef,
560 ivbsaxattributes_Release,
561 ivbsaxattributes_GetTypeInfoCount,
562 ivbsaxattributes_GetTypeInfo,
563 ivbsaxattributes_GetIDsOfNames,
564 ivbsaxattributes_Invoke,
565 ivbsaxattributes_get_length,
566 ivbsaxattributes_getURI,
567 ivbsaxattributes_getLocalName,
568 ivbsaxattributes_getQName,
569 ivbsaxattributes_getIndexFromName,
570 ivbsaxattributes_getIndexFromQName,
571 ivbsaxattributes_getType,
572 ivbsaxattributes_getTypeFromName,
573 ivbsaxattributes_getTypeFromQName,
574 ivbsaxattributes_getValue,
575 ivbsaxattributes_getValueFromName,
576 ivbsaxattributes_getValueFromQName
577};
578
Piotr Caban5816c382008-07-27 19:55:05 +0200579/*** ISAXAttributes interface ***/
580/*** IUnknown methods ***/
581static HRESULT WINAPI isaxattributes_QueryInterface(
582 ISAXAttributes* iface,
583 REFIID riid,
584 void **ppvObject)
585{
586 saxattributes *This = impl_from_ISAXAttributes(iface);
587
588 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
589
590 *ppvObject = NULL;
591
592 if (IsEqualGUID(riid, &IID_IUnknown) ||
593 IsEqualGUID(riid, &IID_ISAXAttributes))
594 {
595 *ppvObject = iface;
596 }
597 else
598 {
599 FIXME("interface %s not implemented\n", debugstr_guid(riid));
600 return E_NOINTERFACE;
601 }
602
603 ISAXAttributes_AddRef(iface);
604
605 return S_OK;
606}
607
608static ULONG WINAPI isaxattributes_AddRef(ISAXAttributes* iface)
609{
610 saxattributes *This = impl_from_ISAXAttributes(iface);
611 TRACE("%p\n", This);
612 return InterlockedIncrement(&This->ref);
613}
614
615static ULONG WINAPI isaxattributes_Release(ISAXAttributes* iface)
616{
617 saxattributes *This = impl_from_ISAXAttributes(iface);
618 LONG ref;
619
620 TRACE("%p\n", This);
621
622 ref = InterlockedDecrement(&This->ref);
623 if (ref==0)
624 {
Piotr Caban6df49d52008-07-30 20:24:12 +0200625 int index;
626 for(index=0; index<This->nb_attributes; index++)
627 {
628 SysFreeString(This->szLocalname[index]);
Piotr Caban6df49d52008-07-30 20:24:12 +0200629 SysFreeString(This->szURI[index]);
630 SysFreeString(This->szValue[index]);
Piotr Caban319d86c2008-08-03 14:37:37 +0200631 SysFreeString(This->szQName[index]);
Piotr Caban6df49d52008-07-30 20:24:12 +0200632 }
633
634 HeapFree(GetProcessHeap(), 0, This->szLocalname);
Piotr Caban6df49d52008-07-30 20:24:12 +0200635 HeapFree(GetProcessHeap(), 0, This->szURI);
636 HeapFree(GetProcessHeap(), 0, This->szValue);
Piotr Caban319d86c2008-08-03 14:37:37 +0200637 HeapFree(GetProcessHeap(), 0, This->szQName);
Piotr Caban6df49d52008-07-30 20:24:12 +0200638
Piotr Caban5816c382008-07-27 19:55:05 +0200639 HeapFree(GetProcessHeap(), 0, This);
640 }
641
642 return ref;
643}
644
645/*** ISAXAttributes methods ***/
646static HRESULT WINAPI isaxattributes_getLength(
647 ISAXAttributes* iface,
648 int *length)
649{
650 saxattributes *This = impl_from_ISAXAttributes( iface );
651
Piotr Caban58b26f32008-07-30 20:26:50 +0200652 *length = This->nb_attributes;
653 TRACE("Length set to %d\n", *length);
654 return S_OK;
Piotr Caban5816c382008-07-27 19:55:05 +0200655}
656
657static HRESULT WINAPI isaxattributes_getURI(
658 ISAXAttributes* iface,
659 int nIndex,
660 const WCHAR **pUrl,
661 int *pUriSize)
662{
663 saxattributes *This = impl_from_ISAXAttributes( iface );
Piotr Caban7be136b2008-08-03 14:37:52 +0200664 TRACE("(%p)->(%d)\n", This, nIndex);
Piotr Caban5816c382008-07-27 19:55:05 +0200665
Piotr Caban7be136b2008-08-03 14:37:52 +0200666 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
667 if(!pUrl || !pUriSize) return E_POINTER;
668
669 *pUriSize = SysStringLen(This->szURI[nIndex]);
670 *pUrl = This->szURI[nIndex];
671
672 return S_OK;
Piotr Caban5816c382008-07-27 19:55:05 +0200673}
674
675static HRESULT WINAPI isaxattributes_getLocalName(
676 ISAXAttributes* iface,
677 int nIndex,
678 const WCHAR **pLocalName,
679 int *pLocalNameLength)
680{
681 saxattributes *This = impl_from_ISAXAttributes( iface );
Piotr Caban421a9a62008-07-30 20:27:07 +0200682 TRACE("(%p)->(%d)\n", This, nIndex);
Piotr Caban5816c382008-07-27 19:55:05 +0200683
Piotr Caban7a5a7812008-08-03 14:37:45 +0200684 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
685 if(!pLocalName || !pLocalNameLength) return E_POINTER;
Piotr Caban421a9a62008-07-30 20:27:07 +0200686
687 *pLocalNameLength = SysStringLen(This->szLocalname[nIndex]);
688 *pLocalName = This->szLocalname[nIndex];
689
690 return S_OK;
Piotr Caban5816c382008-07-27 19:55:05 +0200691}
692
693static HRESULT WINAPI isaxattributes_getQName(
694 ISAXAttributes* iface,
695 int nIndex,
696 const WCHAR **pQName,
697 int *pQNameLength)
698{
699 saxattributes *This = impl_from_ISAXAttributes( iface );
Piotr Caban6818cc62008-07-31 16:45:42 +0200700 TRACE("(%p)->(%d)\n", This, nIndex);
Piotr Caban5816c382008-07-27 19:55:05 +0200701
Piotr Caban7a5a7812008-08-03 14:37:45 +0200702 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
703 if(!pQName || !pQNameLength) return E_POINTER;
Piotr Caban6818cc62008-07-31 16:45:42 +0200704
705 *pQNameLength = SysStringLen(This->szQName[nIndex]);
706 *pQName = This->szQName[nIndex];
707
708 return S_OK;
Piotr Caban5816c382008-07-27 19:55:05 +0200709}
710
711static HRESULT WINAPI isaxattributes_getName(
712 ISAXAttributes* iface,
713 int nIndex,
714 const WCHAR **pUri,
715 int *pUriLength,
716 const WCHAR **pLocalName,
717 int *pLocalNameSize,
718 const WCHAR **pQName,
719 int *pQNameLength)
720{
721 saxattributes *This = impl_from_ISAXAttributes( iface );
Piotr Caban5e1af9b2008-08-20 18:30:16 +0200722 TRACE("(%p)->(%d)\n", This, nIndex);
Piotr Caban5816c382008-07-27 19:55:05 +0200723
Piotr Caban5e1af9b2008-08-20 18:30:16 +0200724 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
725 if(!pUri || !pUriLength || !pLocalName || !pLocalNameSize
726 || !pQName || !pQNameLength) return E_POINTER;
727
728 *pUriLength = SysStringLen(This->szURI[nIndex]);
729 *pUri = This->szURI[nIndex];
730 *pLocalNameSize = SysStringLen(This->szLocalname[nIndex]);
731 *pLocalName = This->szLocalname[nIndex];
732 *pQNameLength = SysStringLen(This->szQName[nIndex]);
733 *pQName = This->szQName[nIndex];
734
735 return S_OK;
Piotr Caban5816c382008-07-27 19:55:05 +0200736}
737
738static HRESULT WINAPI isaxattributes_getIndexFromName(
739 ISAXAttributes* iface,
740 const WCHAR *pUri,
741 int cUriLength,
742 const WCHAR *pLocalName,
743 int cocalNameLength,
744 int *index)
745{
746 saxattributes *This = impl_from_ISAXAttributes( iface );
Piotr Caban0afbcd52008-08-20 18:30:34 +0200747 int i;
748 TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), cUriLength,
Piotr Caban5816c382008-07-27 19:55:05 +0200749 debugstr_w(pLocalName), cocalNameLength);
Piotr Caban0afbcd52008-08-20 18:30:34 +0200750
751 if(!pUri || !pLocalName || !index) return E_POINTER;
752
753 for(i=0; i<This->nb_attributes; i++)
754 {
755 if(cUriLength!=SysStringLen(This->szURI[i])
756 || cocalNameLength!=SysStringLen(This->szLocalname[i]))
757 continue;
758 if(cUriLength && memcmp(pUri, This->szURI[i],
759 sizeof(WCHAR)*cUriLength))
760 continue;
761 if(cocalNameLength && memcmp(pLocalName, This->szLocalname[i],
762 sizeof(WCHAR)*cocalNameLength))
763 continue;
764
765 *index = i;
766 return S_OK;
767 }
768
769 return E_INVALIDARG;
Piotr Caban5816c382008-07-27 19:55:05 +0200770}
771
772static HRESULT WINAPI isaxattributes_getIndexFromQName(
773 ISAXAttributes* iface,
774 const WCHAR *pQName,
775 int nQNameLength,
776 int *index)
777{
778 saxattributes *This = impl_from_ISAXAttributes( iface );
Piotr Cabanfa221f52008-08-20 18:30:58 +0200779 int i;
780 TRACE("(%p)->(%s, %d)\n", This, debugstr_w(pQName), nQNameLength);
Piotr Caban5816c382008-07-27 19:55:05 +0200781
Piotr Cabanfa221f52008-08-20 18:30:58 +0200782 if(!pQName || !index) return E_POINTER;
783 if(!nQNameLength) return E_INVALIDARG;
784
785 for(i=0; i<This->nb_attributes; i++)
786 {
787 if(nQNameLength!=SysStringLen(This->szQName[i])) continue;
788 if(memcmp(pQName, This->szQName, sizeof(WCHAR)*nQNameLength)) continue;
789
790 *index = i;
791 return S_OK;
792 }
793
794 return E_INVALIDARG;
Piotr Caban5816c382008-07-27 19:55:05 +0200795}
796
797static HRESULT WINAPI isaxattributes_getType(
798 ISAXAttributes* iface,
799 int nIndex,
800 const WCHAR **pType,
801 int *pTypeLength)
802{
803 saxattributes *This = impl_from_ISAXAttributes( iface );
804
805 FIXME("(%p)->(%d) stub\n", This, nIndex);
806 return E_NOTIMPL;
807}
808
809static HRESULT WINAPI isaxattributes_getTypeFromName(
810 ISAXAttributes* iface,
811 const WCHAR *pUri,
812 int nUri,
813 const WCHAR *pLocalName,
814 int nLocalName,
815 const WCHAR **pType,
816 int *nType)
817{
818 saxattributes *This = impl_from_ISAXAttributes( iface );
819
820 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This, debugstr_w(pUri), nUri,
821 debugstr_w(pLocalName), nLocalName);
822 return E_NOTIMPL;
823}
824
825static HRESULT WINAPI isaxattributes_getTypeFromQName(
826 ISAXAttributes* iface,
827 const WCHAR *pQName,
828 int nQName,
829 const WCHAR **pType,
830 int *nType)
831{
832 saxattributes *This = impl_from_ISAXAttributes( iface );
833
834 FIXME("(%p)->(%s, %d) stub\n", This, debugstr_w(pQName), nQName);
835 return E_NOTIMPL;
836}
837
838static HRESULT WINAPI isaxattributes_getValue(
839 ISAXAttributes* iface,
840 int nIndex,
841 const WCHAR **pValue,
842 int *nValue)
843{
844 saxattributes *This = impl_from_ISAXAttributes( iface );
Piotr Caban25168402008-07-30 20:27:25 +0200845 TRACE("(%p)->(%d)\n", This, nIndex);
Piotr Caban5816c382008-07-27 19:55:05 +0200846
Piotr Caban7a5a7812008-08-03 14:37:45 +0200847 if(nIndex>=This->nb_attributes || nIndex<0) return E_INVALIDARG;
848 if(!pValue || !nValue) return E_POINTER;
Piotr Caban25168402008-07-30 20:27:25 +0200849
850 *nValue = SysStringLen(This->szValue[nIndex]);
851 *pValue = This->szValue[nIndex];
852
853 return S_OK;
Piotr Caban5816c382008-07-27 19:55:05 +0200854}
855
856static HRESULT WINAPI isaxattributes_getValueFromName(
857 ISAXAttributes* iface,
858 const WCHAR *pUri,
859 int nUri,
860 const WCHAR *pLocalName,
861 int nLocalName,
862 const WCHAR **pValue,
863 int *nValue)
864{
Piotr Cabanc9893d12008-08-20 18:31:17 +0200865 HRESULT hr;
866 int index;
Piotr Caban5816c382008-07-27 19:55:05 +0200867 saxattributes *This = impl_from_ISAXAttributes( iface );
Piotr Cabanc9893d12008-08-20 18:31:17 +0200868 TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), nUri,
Piotr Caban5816c382008-07-27 19:55:05 +0200869 debugstr_w(pLocalName), nLocalName);
Piotr Cabanc9893d12008-08-20 18:31:17 +0200870
871 hr = ISAXAttributes_getIndexFromName(iface,
872 pUri, nUri, pLocalName, nLocalName, &index);
873 if(hr==S_OK) hr = ISAXAttributes_getValue(iface, index, pValue, nValue);
874
875 return hr;
Piotr Caban5816c382008-07-27 19:55:05 +0200876}
877
878static HRESULT WINAPI isaxattributes_getValueFromQName(
879 ISAXAttributes* iface,
880 const WCHAR *pQName,
881 int nQName,
882 const WCHAR **pValue,
883 int *nValue)
884{
Piotr Caban655155f2008-08-20 18:31:39 +0200885 HRESULT hr;
886 int index;
Piotr Caban5816c382008-07-27 19:55:05 +0200887 saxattributes *This = impl_from_ISAXAttributes( iface );
Piotr Caban655155f2008-08-20 18:31:39 +0200888 TRACE("(%p)->(%s, %d)\n", This, debugstr_w(pQName), nQName);
Piotr Caban5816c382008-07-27 19:55:05 +0200889
Piotr Caban655155f2008-08-20 18:31:39 +0200890 hr = ISAXAttributes_getIndexFromQName(iface, pQName, nQName, &index);
891 if(hr==S_OK) hr = ISAXAttributes_getValue(iface, index, pValue, nValue);
892
893 return hr;
Piotr Caban5816c382008-07-27 19:55:05 +0200894}
895
896static const struct ISAXAttributesVtbl isaxattributes_vtbl =
897{
898 isaxattributes_QueryInterface,
899 isaxattributes_AddRef,
900 isaxattributes_Release,
901 isaxattributes_getLength,
902 isaxattributes_getURI,
903 isaxattributes_getLocalName,
904 isaxattributes_getQName,
905 isaxattributes_getName,
906 isaxattributes_getIndexFromName,
907 isaxattributes_getIndexFromQName,
908 isaxattributes_getType,
909 isaxattributes_getTypeFromName,
910 isaxattributes_getTypeFromQName,
911 isaxattributes_getValue,
912 isaxattributes_getValueFromName,
913 isaxattributes_getValueFromQName
914};
915
Piotr Caban6df49d52008-07-30 20:24:12 +0200916static HRESULT SAXAttributes_create(saxattributes **attr,
Piotr Cabana94e4c12008-08-03 14:38:10 +0200917 int nb_namespaces, const xmlChar **xmlNamespaces,
Piotr Caban6df49d52008-07-30 20:24:12 +0200918 int nb_attributes, const xmlChar **xmlAttributes)
Piotr Caban5816c382008-07-27 19:55:05 +0200919{
920 saxattributes *attributes;
Piotr Caban6df49d52008-07-30 20:24:12 +0200921 int index;
Piotr Cabana94e4c12008-08-03 14:38:10 +0200922 static const xmlChar xmlns[] = "xmlns";
Piotr Caban5816c382008-07-27 19:55:05 +0200923
924 attributes = HeapAlloc(GetProcessHeap(), 0, sizeof(*attributes));
925 if(!attributes)
926 return E_OUTOFMEMORY;
927
Piotr Cabancafbf852008-07-31 16:47:41 +0200928 attributes->lpVBSAXAttributesVtbl = &ivbsaxattributes_vtbl;
Piotr Caban5816c382008-07-27 19:55:05 +0200929 attributes->lpSAXAttributesVtbl = &isaxattributes_vtbl;
930 attributes->ref = 1;
931
Piotr Cabana94e4c12008-08-03 14:38:10 +0200932 attributes->nb_attributes = nb_namespaces+nb_attributes;
Piotr Caban5816c382008-07-27 19:55:05 +0200933
Piotr Caban6df49d52008-07-30 20:24:12 +0200934 attributes->szLocalname =
Piotr Cabana94e4c12008-08-03 14:38:10 +0200935 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes);
Piotr Caban6df49d52008-07-30 20:24:12 +0200936 attributes->szURI =
Piotr Cabana94e4c12008-08-03 14:38:10 +0200937 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes);
Piotr Caban6df49d52008-07-30 20:24:12 +0200938 attributes->szValue =
Piotr Cabana94e4c12008-08-03 14:38:10 +0200939 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes);
Piotr Caban6818cc62008-07-31 16:45:42 +0200940 attributes->szQName =
Piotr Cabana94e4c12008-08-03 14:38:10 +0200941 HeapAlloc(GetProcessHeap(), 0, sizeof(BSTR)*attributes->nb_attributes);
Piotr Caban6df49d52008-07-30 20:24:12 +0200942
Piotr Caban319d86c2008-08-03 14:37:37 +0200943 if(!attributes->szLocalname || !attributes->szURI
944 || !attributes->szValue || !attributes->szQName)
Piotr Caban6df49d52008-07-30 20:24:12 +0200945 {
Michael Stefaniuc0f5d6822008-08-01 21:50:51 +0200946 HeapFree(GetProcessHeap(), 0, attributes->szLocalname);
Michael Stefaniuc0f5d6822008-08-01 21:50:51 +0200947 HeapFree(GetProcessHeap(), 0, attributes->szURI);
948 HeapFree(GetProcessHeap(), 0, attributes->szValue);
949 HeapFree(GetProcessHeap(), 0, attributes->szQName);
950 HeapFree(GetProcessHeap(), 0, attributes);
Piotr Caban6df49d52008-07-30 20:24:12 +0200951 return E_FAIL;
952 }
953
Piotr Cabana94e4c12008-08-03 14:38:10 +0200954 for(index=0; index<nb_namespaces; index++)
955 {
956 attributes->szLocalname[index] = SysAllocStringLen(NULL, 0);
957 attributes->szURI[index] = SysAllocStringLen(NULL, 0);
958 attributes->szValue[index] = bstr_from_xmlChar(xmlNamespaces[2*index+1]);
959 attributes->szQName[index] = QName_from_xmlChar(xmlns, xmlNamespaces[2*index]);
960 }
961
Piotr Caban6df49d52008-07-30 20:24:12 +0200962 for(index=0; index<nb_attributes; index++)
963 {
Piotr Cabana94e4c12008-08-03 14:38:10 +0200964 attributes->szLocalname[nb_namespaces+index] =
Piotr Caban6df49d52008-07-30 20:24:12 +0200965 bstr_from_xmlChar(xmlAttributes[index*5]);
Piotr Cabana94e4c12008-08-03 14:38:10 +0200966 attributes->szURI[nb_namespaces+index] =
Piotr Caban6df49d52008-07-30 20:24:12 +0200967 bstr_from_xmlChar(xmlAttributes[index*5+2]);
Piotr Cabana94e4c12008-08-03 14:38:10 +0200968 attributes->szValue[nb_namespaces+index] =
Piotr Caban6df49d52008-07-30 20:24:12 +0200969 bstr_from_xmlCharN(xmlAttributes[index*5+3],
970 xmlAttributes[index*5+4]-xmlAttributes[index*5+3]);
Piotr Cabana94e4c12008-08-03 14:38:10 +0200971 attributes->szQName[nb_namespaces+index] =
Piotr Caban319d86c2008-08-03 14:37:37 +0200972 QName_from_xmlChar(xmlAttributes[index*5+1], xmlAttributes[index*5]);
Piotr Caban6df49d52008-07-30 20:24:12 +0200973 }
974
975 *attr = attributes;
976
977 TRACE("returning %p\n", *attr);
Piotr Caban5816c382008-07-27 19:55:05 +0200978
979 return S_OK;
980}
981
Piotr Caban072383e2008-07-17 00:41:01 +0200982/*** LibXML callbacks ***/
983static void libxmlStartDocument(void *ctx)
984{
985 saxlocator *This = ctx;
986 HRESULT hr;
987
Piotr Cabanf3ab2282008-08-20 18:26:25 +0200988 if((This->vbInterface && This->saxreader->vbcontentHandler)
989 || (!This->vbInterface && This->saxreader->contentHandler))
Piotr Caban072383e2008-07-17 00:41:01 +0200990 {
Piotr Cabanc52e0912008-07-31 16:48:03 +0200991 if(This->vbInterface)
992 hr = IVBSAXContentHandler_startDocument(This->saxreader->vbcontentHandler);
993 else
994 hr = ISAXContentHandler_startDocument(This->saxreader->contentHandler);
995
Piotr Cabanbba7eb52008-07-19 22:32:10 +0200996 if(hr != S_OK)
997 format_error_message_from_id(This, hr);
Piotr Caban072383e2008-07-17 00:41:01 +0200998 }
Piotr Caban4cdcc022008-07-17 00:41:11 +0200999
Piotr Cabanbb849dc2008-07-23 16:39:04 +02001000 update_position(This, NULL);
Piotr Caban072383e2008-07-17 00:41:01 +02001001}
1002
Piotr Cabanc58b24b2008-07-17 00:41:19 +02001003static void libxmlEndDocument(void *ctx)
1004{
1005 saxlocator *This = ctx;
1006 HRESULT hr;
1007
Piotr Cabanbb849dc2008-07-23 16:39:04 +02001008 This->column = 0;
1009 This->line = 0;
Piotr Cabanc58b24b2008-07-17 00:41:19 +02001010
Piotr Caban2cb215b2008-07-19 22:31:56 +02001011 if(This->ret != S_OK) return;
1012
Piotr Cabanf3ab2282008-08-20 18:26:25 +02001013 if((This->vbInterface && This->saxreader->vbcontentHandler)
1014 || (!This->vbInterface && This->saxreader->contentHandler))
Piotr Cabanc58b24b2008-07-17 00:41:19 +02001015 {
Piotr Cabanc52e0912008-07-31 16:48:03 +02001016 if(This->vbInterface)
1017 hr = IVBSAXContentHandler_endDocument(This->saxreader->vbcontentHandler);
1018 else
1019 hr = ISAXContentHandler_endDocument(This->saxreader->contentHandler);
1020
Piotr Cabanbba7eb52008-07-19 22:32:10 +02001021 if(hr != S_OK)
1022 format_error_message_from_id(This, hr);
Piotr Cabanc58b24b2008-07-17 00:41:19 +02001023 }
1024}
1025
Piotr Caban965a2ea2008-07-17 00:41:27 +02001026static void libxmlStartElementNS(
1027 void *ctx,
1028 const xmlChar *localname,
1029 const xmlChar *prefix,
1030 const xmlChar *URI,
1031 int nb_namespaces,
1032 const xmlChar **namespaces,
1033 int nb_attributes,
1034 int nb_defaulted,
1035 const xmlChar **attributes)
1036{
Piotr Cabane9d34b72008-08-03 17:03:28 +02001037 BSTR NamespaceUri, LocalName, QName, Prefix, Uri;
Piotr Caban965a2ea2008-07-17 00:41:27 +02001038 saxlocator *This = ctx;
1039 HRESULT hr;
Piotr Caban6df49d52008-07-30 20:24:12 +02001040 saxattributes *attr;
Piotr Cabane9d34b72008-08-03 17:03:28 +02001041 int index;
Piotr Caban965a2ea2008-07-17 00:41:27 +02001042
Piotr Caban1596a1a2008-10-07 22:10:56 +02001043 if(*(This->pParserCtxt->input->cur) == '/')
1044 update_position(This, (xmlChar*)This->pParserCtxt->input->cur+2);
1045 else
1046 update_position(This, (xmlChar*)This->pParserCtxt->input->cur+1);
Piotr Caban965a2ea2008-07-17 00:41:27 +02001047
Piotr Caban03f79092008-08-20 18:20:50 +02001048 hr = namespacePush(This, nb_namespaces);
Piotr Cabanf3ab2282008-08-20 18:26:25 +02001049 if(hr==S_OK && ((This->vbInterface && This->saxreader->vbcontentHandler)
1050 || (!This->vbInterface && This->saxreader->contentHandler)))
Piotr Caban965a2ea2008-07-17 00:41:27 +02001051 {
Piotr Cabane9d34b72008-08-03 17:03:28 +02001052 for(index=0; index<nb_namespaces; index++)
1053 {
1054 Prefix = bstr_from_xmlChar(namespaces[2*index]);
1055 Uri = bstr_from_xmlChar(namespaces[2*index+1]);
1056
1057 if(This->vbInterface)
1058 hr = IVBSAXContentHandler_startPrefixMapping(
1059 This->saxreader->vbcontentHandler,
1060 &Prefix, &Uri);
1061 else
1062 hr = ISAXContentHandler_startPrefixMapping(
1063 This->saxreader->contentHandler,
1064 Prefix, SysStringLen(Prefix),
1065 Uri, SysStringLen(Uri));
1066
1067 SysFreeString(Prefix);
1068 SysFreeString(Uri);
1069
1070 if(hr != S_OK)
1071 {
1072 format_error_message_from_id(This, hr);
1073 return;
1074 }
1075 }
1076
Piotr Caban965a2ea2008-07-17 00:41:27 +02001077 NamespaceUri = bstr_from_xmlChar(URI);
1078 LocalName = bstr_from_xmlChar(localname);
Piotr Caban319d86c2008-08-03 14:37:37 +02001079 QName = QName_from_xmlChar(prefix, localname);
Piotr Caban965a2ea2008-07-17 00:41:27 +02001080
Piotr Cabana94e4c12008-08-03 14:38:10 +02001081 hr = SAXAttributes_create(&attr, nb_namespaces, namespaces, nb_attributes, attributes);
Piotr Caban6df49d52008-07-30 20:24:12 +02001082 if(hr == S_OK)
1083 {
Piotr Cabanc52e0912008-07-31 16:48:03 +02001084 if(This->vbInterface)
1085 hr = IVBSAXContentHandler_startElement(
1086 This->saxreader->vbcontentHandler,
1087 &NamespaceUri, &LocalName, &QName,
1088 (IVBSAXAttributes*)&attr->lpVBSAXAttributesVtbl);
1089 else
1090 hr = ISAXContentHandler_startElement(
1091 This->saxreader->contentHandler,
1092 NamespaceUri, SysStringLen(NamespaceUri),
1093 LocalName, SysStringLen(LocalName),
1094 QName, SysStringLen(QName),
1095 (ISAXAttributes*)&attr->lpSAXAttributesVtbl);
Piotr Caban5816c382008-07-27 19:55:05 +02001096
Piotr Caban6df49d52008-07-30 20:24:12 +02001097 ISAXAttributes_Release((ISAXAttributes*)&attr->lpSAXAttributesVtbl);
1098 }
Piotr Caban965a2ea2008-07-17 00:41:27 +02001099
1100 SysFreeString(NamespaceUri);
1101 SysFreeString(LocalName);
1102 SysFreeString(QName);
Piotr Caban965a2ea2008-07-17 00:41:27 +02001103 }
Piotr Caban03f79092008-08-20 18:20:50 +02001104
1105 if(hr != S_OK)
1106 format_error_message_from_id(This, hr);
Piotr Caban965a2ea2008-07-17 00:41:27 +02001107}
1108
Piotr Caban66932632008-07-17 00:41:34 +02001109static void libxmlEndElementNS(
1110 void *ctx,
1111 const xmlChar *localname,
1112 const xmlChar *prefix,
1113 const xmlChar *URI)
1114{
Piotr Caban03f79092008-08-20 18:20:50 +02001115 BSTR NamespaceUri, LocalName, QName, Prefix;
Piotr Caban66932632008-07-17 00:41:34 +02001116 saxlocator *This = ctx;
1117 HRESULT hr;
Piotr Cabanbb849dc2008-07-23 16:39:04 +02001118 xmlChar *end;
Piotr Caban03f79092008-08-20 18:20:50 +02001119 int nsNr, index;
Piotr Caban66932632008-07-17 00:41:34 +02001120
Piotr Cabanc801c182008-10-07 22:10:43 +02001121 end = (xmlChar*)This->pParserCtxt->input->cur;
1122 if(*(end-1) != '>' || *(end-2) != '/')
1123 while(*(end-2)!='<' && *(end-1)!='/') end--;
1124
1125 update_position(This, end);
Piotr Caban66932632008-07-17 00:41:34 +02001126
Piotr Caban03f79092008-08-20 18:20:50 +02001127 nsNr = namespacePop(This);
1128
Piotr Cabanf3ab2282008-08-20 18:26:25 +02001129 if((This->vbInterface && This->saxreader->vbcontentHandler)
1130 || (!This->vbInterface && This->saxreader->contentHandler))
Piotr Caban66932632008-07-17 00:41:34 +02001131 {
1132 NamespaceUri = bstr_from_xmlChar(URI);
1133 LocalName = bstr_from_xmlChar(localname);
Piotr Caban319d86c2008-08-03 14:37:37 +02001134 QName = QName_from_xmlChar(prefix, localname);
Piotr Caban66932632008-07-17 00:41:34 +02001135
Piotr Cabanc52e0912008-07-31 16:48:03 +02001136 if(This->vbInterface)
1137 hr = IVBSAXContentHandler_endElement(
1138 This->saxreader->vbcontentHandler,
1139 &NamespaceUri, &LocalName, &QName);
1140 else
1141 hr = ISAXContentHandler_endElement(
1142 This->saxreader->contentHandler,
1143 NamespaceUri, SysStringLen(NamespaceUri),
1144 LocalName, SysStringLen(LocalName),
1145 QName, SysStringLen(QName));
Piotr Caban66932632008-07-17 00:41:34 +02001146
1147 SysFreeString(NamespaceUri);
1148 SysFreeString(LocalName);
1149 SysFreeString(QName);
1150
Piotr Cabanbba7eb52008-07-19 22:32:10 +02001151 if(hr != S_OK)
Piotr Caban03f79092008-08-20 18:20:50 +02001152 {
Piotr Cabanbba7eb52008-07-19 22:32:10 +02001153 format_error_message_from_id(This, hr);
Piotr Caban03f79092008-08-20 18:20:50 +02001154 return;
1155 }
1156
1157 for(index=This->pParserCtxt->nsNr-2;
1158 index>=This->pParserCtxt->nsNr-nsNr*2; index-=2)
1159 {
1160 Prefix = bstr_from_xmlChar(This->pParserCtxt->nsTab[index]);
1161
1162 if(This->vbInterface)
1163 hr = IVBSAXContentHandler_endPrefixMapping(
1164 This->saxreader->vbcontentHandler, &Prefix);
1165 else
1166 hr = ISAXContentHandler_endPrefixMapping(
1167 This->saxreader->contentHandler,
1168 Prefix, SysStringLen(Prefix));
1169
1170 SysFreeString(Prefix);
1171 }
Piotr Caban66932632008-07-17 00:41:34 +02001172 }
Piotr Cabanc801c182008-10-07 22:10:43 +02001173
1174 update_position(This, NULL);
Piotr Caban66932632008-07-17 00:41:34 +02001175}
1176
Piotr Caban40388632008-07-17 00:41:40 +02001177static void libxmlCharacters(
1178 void *ctx,
1179 const xmlChar *ch,
1180 int len)
1181{
Piotr Caban40388632008-07-17 00:41:40 +02001182 saxlocator *This = ctx;
Piotr Cabanc801c182008-10-07 22:10:43 +02001183 BSTR Chars;
Piotr Caban40388632008-07-17 00:41:40 +02001184 HRESULT hr;
Piotr Cabanc801c182008-10-07 22:10:43 +02001185 xmlChar *cur;
Piotr Cabanbb849dc2008-07-23 16:39:04 +02001186 xmlChar *end;
Piotr Cabanc801c182008-10-07 22:10:43 +02001187 BOOL lastEvent = FALSE;
Piotr Caban3d4ad642008-07-23 16:39:12 +02001188
Piotr Cabanc801c182008-10-07 22:10:43 +02001189 if((This->vbInterface && !This->saxreader->vbcontentHandler)
1190 || (!This->vbInterface && !This->saxreader->contentHandler))
1191 return;
Piotr Caban40388632008-07-17 00:41:40 +02001192
Piotr Cabanc801c182008-10-07 22:10:43 +02001193 cur = (xmlChar*)ch;
1194 if(*(ch-1)=='\r') cur--;
1195 end = cur;
1196
1197 if(ch<This->pParserCtxt->input->base || ch>This->pParserCtxt->input->end)
1198 This->column++;
1199
1200 while(1)
Piotr Caban40388632008-07-17 00:41:40 +02001201 {
Piotr Cabanc801c182008-10-07 22:10:43 +02001202 while(end-ch<len && *end!='\r') end++;
1203 if(end-ch==len)
Piotr Caban3d4ad642008-07-23 16:39:12 +02001204 {
Piotr Cabanc801c182008-10-07 22:10:43 +02001205 end--;
1206 lastEvent = TRUE;
Piotr Caban3d4ad642008-07-23 16:39:12 +02001207 }
1208
Piotr Cabanc801c182008-10-07 22:10:43 +02001209 if(!lastEvent) *end = '\n';
1210
1211 Chars = bstr_from_xmlCharN(cur, end-cur+1);
1212 if(This->vbInterface)
1213 hr = IVBSAXContentHandler_characters(
1214 This->saxreader->vbcontentHandler, &Chars);
1215 else
1216 hr = ISAXContentHandler_characters(
1217 This->saxreader->contentHandler,
1218 Chars, SysStringLen(Chars));
1219 SysFreeString(Chars);
1220
1221 This->column += end-cur+1;
1222
1223 if(lastEvent)
1224 break;
1225
1226 *end = '\r';
1227 end++;
1228 if(*end == '\n')
1229 {
1230 end++;
1231 This->column++;
1232 }
1233 cur = end;
1234
1235 if(end-ch == len) break;
Piotr Caban40388632008-07-17 00:41:40 +02001236 }
Piotr Cabanc801c182008-10-07 22:10:43 +02001237
1238 if(ch<This->pParserCtxt->input->base || ch>This->pParserCtxt->input->end)
1239 This->column = This->realColumn
1240 +This->pParserCtxt->input->cur-This->lastCur;
Piotr Caban40388632008-07-17 00:41:40 +02001241}
1242
Piotr Cabane47cbd12008-07-17 00:41:52 +02001243static void libxmlSetDocumentLocator(
1244 void *ctx,
1245 xmlSAXLocatorPtr loc)
1246{
1247 saxlocator *This = ctx;
1248 HRESULT hr;
1249
Piotr Cabanc52e0912008-07-31 16:48:03 +02001250 if(This->vbInterface)
1251 hr = IVBSAXContentHandler_putref_documentLocator(
1252 This->saxreader->vbcontentHandler,
1253 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl);
1254 else
1255 hr = ISAXContentHandler_putDocumentLocator(
1256 This->saxreader->contentHandler,
1257 (ISAXLocator*)&This->lpSAXLocatorVtbl);
Piotr Cabane47cbd12008-07-17 00:41:52 +02001258
1259 if(FAILED(hr))
Piotr Cabanbba7eb52008-07-19 22:32:10 +02001260 format_error_message_from_id(This, hr);
1261}
1262
Piotr Cabandb2761a2008-10-07 22:11:04 +02001263static void libxmlComment(void *ctx, const xmlChar *value)
1264{
1265 saxlocator *This = ctx;
1266 BSTR bValue;
1267 HRESULT hr;
1268 xmlChar *beg = (xmlChar*)This->pParserCtxt->input->cur;
1269
1270 while(memcmp(beg-4, "<!--", sizeof(char[4]))) beg--;
1271 update_position(This, beg);
1272
1273 if(!This->vbInterface && !This->saxreader->lexicalHandler) return;
1274 if(This->vbInterface && !This->saxreader->vblexicalHandler) return;
1275
1276 bValue = bstr_from_xmlChar(value);
1277
1278 if(This->vbInterface)
1279 hr = IVBSAXLexicalHandler_comment(
1280 This->saxreader->vblexicalHandler, &bValue);
1281 else
1282 hr = ISAXLexicalHandler_comment(
1283 This->saxreader->lexicalHandler,
1284 bValue, SysStringLen(bValue));
1285
1286 SysFreeString(bValue);
1287
1288 if(FAILED(hr))
1289 format_error_message_from_id(This, hr);
1290
1291 update_position(This, NULL);
1292}
1293
Piotr Cabanc801c182008-10-07 22:10:43 +02001294static void libxmlFatalError(void *ctx, const char *msg, ...)
Piotr Cabanbba7eb52008-07-19 22:32:10 +02001295{
1296 saxlocator *This = ctx;
1297 char message[1024];
1298 WCHAR *wszError;
1299 DWORD len;
1300 va_list args;
1301
Piotr Caban7b7a1872008-08-20 18:32:23 +02001302 if((This->vbInterface && !This->saxreader->vberrorHandler)
1303 || (!This->vbInterface && !This->saxreader->errorHandler))
Piotr Cabane47cbd12008-07-17 00:41:52 +02001304 {
1305 xmlStopParser(This->pParserCtxt);
Piotr Cabanbba7eb52008-07-19 22:32:10 +02001306 This->ret = E_FAIL;
1307 return;
Piotr Cabane47cbd12008-07-17 00:41:52 +02001308 }
Piotr Cabanbba7eb52008-07-19 22:32:10 +02001309
1310 FIXME("Error handling is not compatible.\n");
1311
1312 va_start(args, msg);
1313 vsprintf(message, msg, args);
1314 va_end(args);
1315
Rob Shearmanfd75c212008-08-26 20:06:09 +01001316 len = MultiByteToWideChar(CP_UNIXCP, 0, message, -1, NULL, 0);
Piotr Cabanbba7eb52008-07-19 22:32:10 +02001317 wszError = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*len);
Piotr Caban7b7a1872008-08-20 18:32:23 +02001318 if(wszError)
Rob Shearmanfd75c212008-08-26 20:06:09 +01001319 MultiByteToWideChar(CP_UNIXCP, 0, message, -1, (LPWSTR)wszError, len);
Piotr Cabanbba7eb52008-07-19 22:32:10 +02001320
Piotr Cabanc52e0912008-07-31 16:48:03 +02001321 if(This->vbInterface)
1322 {
1323 BSTR bstrError = SysAllocString(wszError);
1324 IVBSAXErrorHandler_fatalError(This->saxreader->vberrorHandler,
1325 (IVBSAXLocator*)&This->lpVBSAXLocatorVtbl, &bstrError, E_FAIL);
1326 }
1327 else
1328 ISAXErrorHandler_fatalError(This->saxreader->errorHandler,
1329 (ISAXLocator*)&This->lpSAXLocatorVtbl, wszError, E_FAIL);
Piotr Cabanbba7eb52008-07-19 22:32:10 +02001330
1331 HeapFree(GetProcessHeap(), 0, wszError);
1332
1333 xmlStopParser(This->pParserCtxt);
1334 This->ret = E_FAIL;
Piotr Cabane47cbd12008-07-17 00:41:52 +02001335}
1336
Piotr Caband439ca52008-07-31 16:48:11 +02001337/*** IVBSAXLocator interface ***/
1338/*** IUnknown methods ***/
1339static HRESULT WINAPI ivbsaxlocator_QueryInterface(IVBSAXLocator* iface, REFIID riid, void **ppvObject)
1340{
1341 saxlocator *This = impl_from_IVBSAXLocator( iface );
1342
1343 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject);
1344
1345 *ppvObject = NULL;
1346
1347 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1348 IsEqualGUID( riid, &IID_IDispatch) ||
1349 IsEqualGUID( riid, &IID_IVBSAXLocator ))
1350 {
1351 *ppvObject = iface;
1352 }
1353 else
1354 {
1355 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1356 return E_NOINTERFACE;
1357 }
1358
1359 IVBSAXLocator_AddRef( iface );
1360
1361 return S_OK;
1362}
1363
1364static ULONG WINAPI ivbsaxlocator_AddRef(IVBSAXLocator* iface)
1365{
1366 saxlocator *This = impl_from_IVBSAXLocator( iface );
1367 TRACE("%p\n", This );
1368 return InterlockedIncrement( &This->ref );
1369}
1370
1371static ULONG WINAPI ivbsaxlocator_Release(
1372 IVBSAXLocator* iface)
1373{
1374 saxlocator *This = impl_from_IVBSAXLocator( iface );
1375 return ISAXLocator_Release((ISAXLocator*)&This->lpVBSAXLocatorVtbl);
1376}
1377
1378/*** IDispatch methods ***/
1379static HRESULT WINAPI ivbsaxlocator_GetTypeInfoCount( IVBSAXLocator *iface, UINT* pctinfo )
1380{
1381 saxlocator *This = impl_from_IVBSAXLocator( iface );
1382
1383 TRACE("(%p)->(%p)\n", This, pctinfo);
1384
1385 *pctinfo = 1;
1386
1387 return S_OK;
1388}
1389
1390static HRESULT WINAPI ivbsaxlocator_GetTypeInfo(
1391 IVBSAXLocator *iface,
1392 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
1393{
1394 saxlocator *This = impl_from_IVBSAXLocator( iface );
1395 HRESULT hr;
1396
1397 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
1398
1399 hr = get_typeinfo(IVBSAXLocator_tid, ppTInfo);
1400
1401 return hr;
1402}
1403
1404static HRESULT WINAPI ivbsaxlocator_GetIDsOfNames(
1405 IVBSAXLocator *iface,
1406 REFIID riid,
1407 LPOLESTR* rgszNames,
1408 UINT cNames,
1409 LCID lcid,
1410 DISPID* rgDispId)
1411{
1412 saxlocator *This = impl_from_IVBSAXLocator( iface );
1413 ITypeInfo *typeinfo;
1414 HRESULT hr;
1415
1416 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
1417 lcid, rgDispId);
1418
1419 if(!rgszNames || cNames == 0 || !rgDispId)
1420 return E_INVALIDARG;
1421
1422 hr = get_typeinfo(IVBSAXLocator_tid, &typeinfo);
1423 if(SUCCEEDED(hr))
1424 {
1425 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
1426 ITypeInfo_Release(typeinfo);
1427 }
1428
1429 return hr;
1430}
1431
1432static HRESULT WINAPI ivbsaxlocator_Invoke(
1433 IVBSAXLocator *iface,
1434 DISPID dispIdMember,
1435 REFIID riid,
1436 LCID lcid,
1437 WORD wFlags,
1438 DISPPARAMS* pDispParams,
1439 VARIANT* pVarResult,
1440 EXCEPINFO* pExcepInfo,
1441 UINT* puArgErr)
1442{
1443 saxlocator *This = impl_from_IVBSAXLocator( iface );
1444 ITypeInfo *typeinfo;
1445 HRESULT hr;
1446
1447 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
1448 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1449
1450 hr = get_typeinfo(IVBSAXLocator_tid, &typeinfo);
1451 if(SUCCEEDED(hr))
1452 {
1453 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXLocatorVtbl), dispIdMember, wFlags, pDispParams,
1454 pVarResult, pExcepInfo, puArgErr);
1455 ITypeInfo_Release(typeinfo);
1456 }
1457
1458 return hr;
1459}
1460
1461/*** IVBSAXLocator methods ***/
1462static HRESULT WINAPI ivbsaxlocator_get_columnNumber(
1463 IVBSAXLocator* iface,
1464 int *pnColumn)
1465{
1466 saxlocator *This = impl_from_IVBSAXLocator( iface );
1467 return ISAXLocator_getColumnNumber(
1468 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1469 pnColumn);
1470}
1471
1472static HRESULT WINAPI ivbsaxlocator_get_lineNumber(
1473 IVBSAXLocator* iface,
1474 int *pnLine)
1475{
1476 saxlocator *This = impl_from_IVBSAXLocator( iface );
1477 return ISAXLocator_getLineNumber(
1478 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1479 pnLine);
1480}
1481
1482static HRESULT WINAPI ivbsaxlocator_get_publicId(
1483 IVBSAXLocator* iface,
1484 BSTR* publicId)
1485{
1486 saxlocator *This = impl_from_IVBSAXLocator( iface );
1487 return ISAXLocator_getPublicId(
1488 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1489 (const WCHAR**)publicId);
1490}
1491
1492static HRESULT WINAPI ivbsaxlocator_get_systemId(
1493 IVBSAXLocator* iface,
1494 BSTR* systemId)
1495{
1496 saxlocator *This = impl_from_IVBSAXLocator( iface );
1497 return ISAXLocator_getSystemId(
1498 (ISAXLocator*)&This->lpVBSAXLocatorVtbl,
1499 (const WCHAR**)systemId);
1500}
1501
1502static const struct IVBSAXLocatorVtbl ivbsaxlocator_vtbl =
1503{
1504 ivbsaxlocator_QueryInterface,
1505 ivbsaxlocator_AddRef,
1506 ivbsaxlocator_Release,
1507 ivbsaxlocator_GetTypeInfoCount,
1508 ivbsaxlocator_GetTypeInfo,
1509 ivbsaxlocator_GetIDsOfNames,
1510 ivbsaxlocator_Invoke,
1511 ivbsaxlocator_get_columnNumber,
1512 ivbsaxlocator_get_lineNumber,
1513 ivbsaxlocator_get_publicId,
1514 ivbsaxlocator_get_systemId
1515};
1516
Piotr Caband3e9ca72008-07-17 00:40:32 +02001517/*** ISAXLocator interface ***/
1518/*** IUnknown methods ***/
1519static HRESULT WINAPI isaxlocator_QueryInterface(ISAXLocator* iface, REFIID riid, void **ppvObject)
1520{
1521 saxlocator *This = impl_from_ISAXLocator( iface );
1522
1523 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
1524
1525 *ppvObject = NULL;
1526
1527 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
1528 IsEqualGUID( riid, &IID_ISAXLocator ))
1529 {
1530 *ppvObject = iface;
1531 }
1532 else
1533 {
1534 FIXME("interface %s not implemented\n", debugstr_guid(riid));
1535 return E_NOINTERFACE;
1536 }
1537
1538 ISAXLocator_AddRef( iface );
1539
1540 return S_OK;
1541}
1542
1543static ULONG WINAPI isaxlocator_AddRef(ISAXLocator* iface)
1544{
1545 saxlocator *This = impl_from_ISAXLocator( iface );
1546 TRACE("%p\n", This );
1547 return InterlockedIncrement( &This->ref );
1548}
1549
1550static ULONG WINAPI isaxlocator_Release(
1551 ISAXLocator* iface)
1552{
1553 saxlocator *This = impl_from_ISAXLocator( iface );
1554 LONG ref;
1555
1556 TRACE("%p\n", This );
1557
1558 ref = InterlockedDecrement( &This->ref );
1559 if ( ref == 0 )
1560 {
Detlef Riekenbergf4558c62008-09-21 15:56:18 +02001561 SysFreeString(This->publicId);
1562 SysFreeString(This->systemId);
Piotr Caban03f79092008-08-20 18:20:50 +02001563 HeapFree(GetProcessHeap(), 0, This->nsStack);
Piotr Caban60ca0a72008-07-17 00:42:01 +02001564
Piotr Caband3e9ca72008-07-17 00:40:32 +02001565 ISAXXMLReader_Release((ISAXXMLReader*)&This->saxreader->lpSAXXMLReaderVtbl);
1566 HeapFree( GetProcessHeap(), 0, This );
1567 }
1568
1569 return ref;
1570}
1571
1572/*** ISAXLocator methods ***/
1573static HRESULT WINAPI isaxlocator_getColumnNumber(
1574 ISAXLocator* iface,
1575 int *pnColumn)
1576{
1577 saxlocator *This = impl_from_ISAXLocator( iface );
1578
Piotr Cabanbb849dc2008-07-23 16:39:04 +02001579 *pnColumn = This->column;
Piotr Caban4cdcc022008-07-17 00:41:11 +02001580 return S_OK;
Piotr Caband3e9ca72008-07-17 00:40:32 +02001581}
1582
1583static HRESULT WINAPI isaxlocator_getLineNumber(
1584 ISAXLocator* iface,
1585 int *pnLine)
1586{
1587 saxlocator *This = impl_from_ISAXLocator( iface );
1588
Piotr Cabanbb849dc2008-07-23 16:39:04 +02001589 *pnLine = This->line;
Piotr Caban4cdcc022008-07-17 00:41:11 +02001590 return S_OK;
Piotr Caband3e9ca72008-07-17 00:40:32 +02001591}
1592
1593static HRESULT WINAPI isaxlocator_getPublicId(
1594 ISAXLocator* iface,
1595 const WCHAR ** ppwchPublicId)
1596{
Piotr Caban60ca0a72008-07-17 00:42:01 +02001597 BSTR publicId;
Piotr Caband3e9ca72008-07-17 00:40:32 +02001598 saxlocator *This = impl_from_ISAXLocator( iface );
1599
Detlef Riekenbergf4558c62008-09-21 15:56:18 +02001600 SysFreeString(This->publicId);
Piotr Caban60ca0a72008-07-17 00:42:01 +02001601
1602 publicId = bstr_from_xmlChar(xmlSAX2GetPublicId(This->pParserCtxt));
1603 if(SysStringLen(publicId))
1604 This->publicId = (WCHAR*)&publicId;
1605 else
1606 {
1607 SysFreeString(publicId);
1608 This->publicId = NULL;
1609 }
1610
1611 *ppwchPublicId = This->publicId;
1612 return S_OK;
Piotr Caband3e9ca72008-07-17 00:40:32 +02001613}
1614
1615static HRESULT WINAPI isaxlocator_getSystemId(
1616 ISAXLocator* iface,
1617 const WCHAR ** ppwchSystemId)
1618{
Piotr Caban3196f782008-07-17 00:42:07 +02001619 BSTR systemId;
Piotr Caband3e9ca72008-07-17 00:40:32 +02001620 saxlocator *This = impl_from_ISAXLocator( iface );
1621
Detlef Riekenbergf4558c62008-09-21 15:56:18 +02001622 SysFreeString(This->systemId);
Piotr Caban3196f782008-07-17 00:42:07 +02001623
1624 systemId = bstr_from_xmlChar(xmlSAX2GetSystemId(This->pParserCtxt));
1625 if(SysStringLen(systemId))
1626 This->systemId = (WCHAR*)&systemId;
1627 else
1628 {
1629 SysFreeString(systemId);
1630 This->systemId = NULL;
1631 }
1632
1633 *ppwchSystemId = This->systemId;
1634 return S_OK;
Piotr Caband3e9ca72008-07-17 00:40:32 +02001635}
1636
1637static const struct ISAXLocatorVtbl isaxlocator_vtbl =
1638{
1639 isaxlocator_QueryInterface,
1640 isaxlocator_AddRef,
1641 isaxlocator_Release,
1642 isaxlocator_getColumnNumber,
1643 isaxlocator_getLineNumber,
1644 isaxlocator_getPublicId,
1645 isaxlocator_getSystemId
1646};
1647
Piotr Cabanc52e0912008-07-31 16:48:03 +02001648static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, BOOL vbInterface)
Piotr Caband3e9ca72008-07-17 00:40:32 +02001649{
1650 saxlocator *locator;
1651
1652 locator = HeapAlloc( GetProcessHeap(), 0, sizeof (*locator) );
1653 if( !locator )
1654 return E_OUTOFMEMORY;
1655
Piotr Caband439ca52008-07-31 16:48:11 +02001656 locator->lpVBSAXLocatorVtbl = &ivbsaxlocator_vtbl;
Piotr Caband3e9ca72008-07-17 00:40:32 +02001657 locator->lpSAXLocatorVtbl = &isaxlocator_vtbl;
1658 locator->ref = 1;
Piotr Cabanc52e0912008-07-31 16:48:03 +02001659 locator->vbInterface = vbInterface;
Piotr Caband3e9ca72008-07-17 00:40:32 +02001660
1661 locator->saxreader = reader;
1662 ISAXXMLReader_AddRef((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
1663
Piotr Caban51c95272008-07-17 00:40:53 +02001664 locator->pParserCtxt = NULL;
Piotr Caban60ca0a72008-07-17 00:42:01 +02001665 locator->publicId = NULL;
Piotr Caban3196f782008-07-17 00:42:07 +02001666 locator->systemId = NULL;
Piotr Cabanbb849dc2008-07-23 16:39:04 +02001667 locator->lastCur = NULL;
1668 locator->line = 0;
1669 locator->column = 0;
Piotr Caban51c95272008-07-17 00:40:53 +02001670 locator->ret = S_OK;
Piotr Caban03f79092008-08-20 18:20:50 +02001671 locator->nsStackSize = 8;
1672 locator->nsStackLast = 0;
1673 locator->nsStack = HeapAlloc(GetProcessHeap(), 0, locator->nsStackSize);
1674 if(!locator->nsStack)
1675 {
1676 ISAXXMLReader_Release((ISAXXMLReader*)&reader->lpSAXXMLReaderVtbl);
1677 HeapFree(GetProcessHeap(), 0, locator);
1678 return E_OUTOFMEMORY;
1679 }
Piotr Caban51c95272008-07-17 00:40:53 +02001680
Piotr Caband3e9ca72008-07-17 00:40:32 +02001681 *ppsaxlocator = locator;
1682
1683 TRACE("returning %p\n", *ppsaxlocator);
1684
1685 return S_OK;
1686}
1687
Piotr Cabancb6bcd02008-07-31 16:48:20 +02001688/*** SAXXMLReader internal functions ***/
1689static HRESULT internal_parseBuffer(saxreader *This, const char *buffer, int size, BOOL vbInterface)
1690{
1691 saxlocator *locator;
1692 HRESULT hr;
1693
1694 hr = SAXLocator_create(This, &locator, vbInterface);
1695 if(FAILED(hr))
1696 return E_FAIL;
1697
1698 locator->pParserCtxt = xmlCreateMemoryParserCtxt(buffer, size);
1699 if(!locator->pParserCtxt)
1700 {
1701 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1702 return E_FAIL;
1703 }
1704
1705 locator->pParserCtxt->sax = &locator->saxreader->sax;
1706 locator->pParserCtxt->userData = locator;
1707
Piotr Cabanc7fc9262008-10-01 19:52:36 +02001708 This->isParsing = TRUE;
Piotr Cabancb6bcd02008-07-31 16:48:20 +02001709 if(xmlParseDocument(locator->pParserCtxt)) hr = E_FAIL;
1710 else hr = locator->ret;
Piotr Cabanc7fc9262008-10-01 19:52:36 +02001711 This->isParsing = FALSE;
Piotr Cabancb6bcd02008-07-31 16:48:20 +02001712
1713 if(locator->pParserCtxt)
1714 {
1715 locator->pParserCtxt->sax = NULL;
1716 xmlFreeParserCtxt(locator->pParserCtxt);
1717 locator->pParserCtxt = NULL;
1718 }
1719
1720 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1721 return S_OK;
1722}
1723
Piotr Caban38b05732008-09-08 15:07:46 +02001724static HRESULT internal_parseStream(saxreader *This, IStream *stream, BOOL vbInterface)
1725{
1726 saxlocator *locator;
1727 HRESULT hr;
1728 ULONG dataRead;
1729 char data[1024];
1730
1731 hr = IStream_Read(stream, data, sizeof(data), &dataRead);
1732 if(hr != S_OK)
1733 return hr;
1734
1735 hr = SAXLocator_create(This, &locator, vbInterface);
1736 if(FAILED(hr))
1737 return E_FAIL;
1738
1739 locator->pParserCtxt = xmlCreatePushParserCtxt(
1740 &locator->saxreader->sax, locator,
1741 data, dataRead, NULL);
1742 if(!locator->pParserCtxt)
1743 {
1744 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1745 return E_FAIL;
1746 }
1747
Piotr Cabanc7fc9262008-10-01 19:52:36 +02001748 This->isParsing = TRUE;
Piotr Caban38b05732008-09-08 15:07:46 +02001749 while(1)
1750 {
1751 hr = IStream_Read(stream, data, sizeof(data), &dataRead);
1752 if(hr != S_OK)
1753 break;
1754
1755 if(xmlParseChunk(locator->pParserCtxt, data, dataRead, 0)) hr = E_FAIL;
1756 else hr = locator->ret;
1757
1758 if(hr != S_OK) break;
1759
1760 if(dataRead != sizeof(data))
1761 {
1762 if(xmlParseChunk(locator->pParserCtxt, data, 0, 1)) hr = E_FAIL;
1763 else hr = locator->ret;
1764
1765 break;
1766 }
1767 }
Piotr Cabanc7fc9262008-10-01 19:52:36 +02001768 This->isParsing = FALSE;
Piotr Caban38b05732008-09-08 15:07:46 +02001769
1770 locator->pParserCtxt->sax = NULL;
1771 xmlFreeParserCtxt(locator->pParserCtxt);
1772 locator->pParserCtxt = NULL;
1773 ISAXLocator_Release((ISAXLocator*)&locator->lpSAXLocatorVtbl);
1774 return hr;
1775}
1776
Piotr Cabancb6bcd02008-07-31 16:48:20 +02001777static HRESULT WINAPI internal_getEntityResolver(
1778 saxreader *This,
1779 void *pEntityResolver,
1780 BOOL vbInterface)
1781{
1782 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1783 return E_NOTIMPL;
1784}
1785
1786static HRESULT WINAPI internal_putEntityResolver(
1787 saxreader *This,
1788 void *pEntityResolver,
1789 BOOL vbInterface)
1790{
1791 FIXME("(%p)->(%p) stub\n", This, pEntityResolver);
1792 return E_NOTIMPL;
1793}
1794
1795static HRESULT WINAPI internal_getContentHandler(
1796 saxreader* This,
1797 void *pContentHandler,
1798 BOOL vbInterface)
1799{
1800 TRACE("(%p)->(%p)\n", This, pContentHandler);
1801 if(pContentHandler == NULL)
1802 return E_POINTER;
Piotr Cabanf3ab2282008-08-20 18:26:25 +02001803 if((vbInterface && This->vbcontentHandler)
1804 || (!vbInterface && This->contentHandler))
Piotr Cabancb6bcd02008-07-31 16:48:20 +02001805 {
1806 if(vbInterface)
1807 IVBSAXContentHandler_AddRef(This->vbcontentHandler);
1808 else
1809 ISAXContentHandler_AddRef(This->contentHandler);
1810 }
1811 if(vbInterface) *(IVBSAXContentHandler**)pContentHandler =
1812 This->vbcontentHandler;
1813 else *(ISAXContentHandler**)pContentHandler = This->contentHandler;
1814
1815 return S_OK;
1816}
1817
1818static HRESULT WINAPI internal_putContentHandler(
1819 saxreader* This,
1820 void *contentHandler,
1821 BOOL vbInterface)
1822{
1823 TRACE("(%p)->(%p)\n", This, contentHandler);
1824 if(contentHandler)
1825 {
1826 if(vbInterface)
1827 IVBSAXContentHandler_AddRef((IVBSAXContentHandler*)contentHandler);
1828 else
1829 ISAXContentHandler_AddRef((ISAXContentHandler*)contentHandler);
1830 }
Piotr Cabanf3ab2282008-08-20 18:26:25 +02001831 if((vbInterface && This->vbcontentHandler)
1832 || (!vbInterface && This->contentHandler))
Piotr Cabancb6bcd02008-07-31 16:48:20 +02001833 {
1834 if(vbInterface)
1835 IVBSAXContentHandler_Release(This->vbcontentHandler);
1836 else
1837 ISAXContentHandler_Release(This->contentHandler);
1838 }
1839 if(vbInterface)
1840 This->vbcontentHandler = contentHandler;
1841 else
1842 This->contentHandler = contentHandler;
1843
1844 return S_OK;
1845}
1846
1847static HRESULT WINAPI internal_getDTDHandler(
1848 saxreader* This,
1849 void *pDTDHandler,
1850 BOOL vbInterface)
1851{
1852 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1853 return E_NOTIMPL;
1854}
1855
1856static HRESULT WINAPI internal_putDTDHandler(
1857 saxreader* This,
1858 void *pDTDHandler,
1859 BOOL vbInterface)
1860{
1861 FIXME("(%p)->(%p) stub\n", This, pDTDHandler);
1862 return E_NOTIMPL;
1863}
1864
1865static HRESULT WINAPI internal_getErrorHandler(
1866 saxreader* This,
1867 void *pErrorHandler,
1868 BOOL vbInterface)
1869{
1870 TRACE("(%p)->(%p)\n", This, pErrorHandler);
1871 if(pErrorHandler == NULL)
1872 return E_POINTER;
Piotr Caban7b7a1872008-08-20 18:32:23 +02001873
1874 if(vbInterface && This->vberrorHandler)
1875 IVBSAXErrorHandler_AddRef(This->vberrorHandler);
1876 else if(!vbInterface && This->errorHandler)
1877 ISAXErrorHandler_AddRef(This->errorHandler);
1878
Piotr Cabancb6bcd02008-07-31 16:48:20 +02001879 if(vbInterface)
1880 *(IVBSAXErrorHandler**)pErrorHandler = This->vberrorHandler;
1881 else
1882 *(ISAXErrorHandler**)pErrorHandler = This->errorHandler;
1883
1884 return S_OK;
1885
1886}
1887
1888static HRESULT WINAPI internal_putErrorHandler(
1889 saxreader* This,
1890 void *errorHandler,
1891 BOOL vbInterface)
1892{
1893 TRACE("(%p)->(%p)\n", This, errorHandler);
1894 if(errorHandler)
1895 {
1896 if(vbInterface)
1897 IVBSAXErrorHandler_AddRef((IVBSAXErrorHandler*)errorHandler);
1898 else
1899 ISAXErrorHandler_AddRef((ISAXErrorHandler*)errorHandler);
1900 }
Piotr Caban7b7a1872008-08-20 18:32:23 +02001901
1902 if(vbInterface && This->vberrorHandler)
1903 IVBSAXErrorHandler_Release(This->vberrorHandler);
1904 else if(!vbInterface && This->errorHandler)
1905 ISAXErrorHandler_Release(This->errorHandler);
1906
Piotr Cabancb6bcd02008-07-31 16:48:20 +02001907 if(vbInterface)
1908 This->vberrorHandler = errorHandler;
1909 else
1910 This->errorHandler = errorHandler;
1911
1912 return S_OK;
1913
1914}
1915
1916static HRESULT WINAPI internal_parse(
1917 saxreader* This,
1918 VARIANT varInput,
1919 BOOL vbInterface)
1920{
1921 HRESULT hr;
1922
1923 TRACE("(%p)\n", This);
1924
1925 hr = S_OK;
1926 switch(V_VT(&varInput))
1927 {
1928 case VT_BSTR:
1929 hr = internal_parseBuffer(This, (const char*)V_BSTR(&varInput),
1930 SysStringByteLen(V_BSTR(&varInput)), vbInterface);
1931 break;
1932 case VT_ARRAY|VT_UI1: {
1933 void *pSAData;
1934 LONG lBound, uBound;
1935 ULONG dataRead;
1936
1937 hr = SafeArrayGetLBound(V_ARRAY(&varInput), 1, &lBound);
1938 if(hr != S_OK) break;
1939 hr = SafeArrayGetUBound(V_ARRAY(&varInput), 1, &uBound);
1940 if(hr != S_OK) break;
1941 dataRead = (uBound-lBound)*SafeArrayGetElemsize(V_ARRAY(&varInput));
1942 hr = SafeArrayAccessData(V_ARRAY(&varInput), (void**)&pSAData);
1943 if(hr != S_OK) break;
1944 hr = internal_parseBuffer(This, pSAData, dataRead, vbInterface);
1945 SafeArrayUnaccessData(V_ARRAY(&varInput));
1946 break;
1947 }
1948 case VT_UNKNOWN:
1949 case VT_DISPATCH: {
1950 IPersistStream *persistStream;
1951 IStream *stream = NULL;
1952 IXMLDOMDocument *xmlDoc;
1953
1954 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
Piotr Cabana28b6042008-09-19 16:01:03 +02001955 &IID_IXMLDOMDocument, (void**)&xmlDoc) == S_OK)
1956 {
1957 BSTR bstrData;
1958
1959 IXMLDOMDocument_get_xml(xmlDoc, &bstrData);
1960 hr = internal_parseBuffer(This, (const char*)bstrData,
1961 SysStringByteLen(bstrData), vbInterface);
1962 IXMLDOMDocument_Release(xmlDoc);
1963 break;
1964 }
1965 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
Piotr Cabancb6bcd02008-07-31 16:48:20 +02001966 &IID_IPersistStream, (void**)&persistStream) == S_OK)
1967 {
1968 hr = IPersistStream_Save(persistStream, stream, TRUE);
1969 IPersistStream_Release(persistStream);
1970 if(hr != S_OK) break;
1971 }
1972 if(stream || IUnknown_QueryInterface(V_UNKNOWN(&varInput),
1973 &IID_IStream, (void**)&stream) == S_OK)
1974 {
Piotr Caban38b05732008-09-08 15:07:46 +02001975 hr = internal_parseStream(This, stream, vbInterface);
Piotr Cabancb6bcd02008-07-31 16:48:20 +02001976 IStream_Release(stream);
1977 break;
1978 }
Piotr Cabancb6bcd02008-07-31 16:48:20 +02001979 }
1980 default:
1981 WARN("vt %d not implemented\n", V_VT(&varInput));
1982 hr = E_INVALIDARG;
1983 }
1984
1985 return hr;
1986}
1987
1988static HRESULT internal_vbonDataAvailable(void *obj, char *ptr, DWORD len)
1989{
1990 saxreader *This = obj;
1991
1992 return internal_parseBuffer(This, ptr, len, TRUE);
1993}
1994
1995static HRESULT internal_onDataAvailable(void *obj, char *ptr, DWORD len)
1996{
1997 saxreader *This = obj;
1998
1999 return internal_parseBuffer(This, ptr, len, FALSE);
2000}
2001
2002static HRESULT WINAPI internal_parseURL(
2003 saxreader* This,
2004 const WCHAR *url,
2005 BOOL vbInterface)
2006{
2007 bsc_t *bsc;
2008 HRESULT hr;
2009
2010 TRACE("(%p)->(%s)\n", This, debugstr_w(url));
2011
2012 if(vbInterface) hr = bind_url(url, internal_vbonDataAvailable, This, &bsc);
2013 else hr = bind_url(url, internal_onDataAvailable, This, &bsc);
2014
2015 if(FAILED(hr))
2016 return hr;
2017
2018 detach_bsc(bsc);
2019
2020 return S_OK;
2021}
2022
Piotr Cabanc7fc9262008-10-01 19:52:36 +02002023static HRESULT WINAPI internal_putProperty(
2024 saxreader* This,
2025 const WCHAR *pProp,
2026 VARIANT value,
2027 BOOL vbInterface)
2028{
2029 static const WCHAR wszCharset[] = {
2030 'c','h','a','r','s','e','t',0
2031 };
2032 static const WCHAR wszDeclarationHandler[] = {
2033 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
2034 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
2035 'd','e','c','l','a','r','a','t','i','o','n',
2036 '-','h','a','n','d','l','e','r',0
2037 };
2038 static const WCHAR wszDomNode[] = {
2039 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
2040 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
2041 'd','o','m','-','n','o','d','e',0
2042 };
2043 static const WCHAR wszInputSource[] = {
2044 'i','n','p','u','t','-','s','o','u','r','c','e',0
2045 };
2046 static const WCHAR wszLexicalHandler[] = {
2047 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
2048 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
2049 'l','e','x','i','c','a','l','-','h','a','n','d','l','e','r',0
2050 };
2051 static const WCHAR wszMaxElementDepth[] = {
2052 'm','a','x','-','e','l','e','m','e','n','t','-','d','e','p','t','h',0
2053 };
2054 static const WCHAR wszMaxXMLSize[] = {
2055 'm','a','x','-','x','m','l','-','s','i','z','e',0
2056 };
2057 static const WCHAR wszSchemaDeclarationHandler[] = {
2058 's','c','h','e','m','a','-',
2059 'd','e','c','l','a','r','a','t','i','o','n','-',
2060 'h','a','n','d','l','e','r',0
2061 };
2062 static const WCHAR wszXMLDeclEncoding[] = {
2063 'x','m','l','d','e','c','l','-','e','n','c','o','d','i','n','g',0
2064 };
2065 static const WCHAR wszXMLDeclStandalone[] = {
2066 'x','m','l','d','e','c','l',
2067 '-','s','t','a','n','d','a','l','o','n','e',0
2068 };
2069 static const WCHAR wszXMLDeclVersion[] = {
2070 'x','m','l','d','e','c','l','-','v','e','r','s','i','o','n',0
2071 };
2072
2073 FIXME("(%p)->(%s): semi-stub\n", This, debugstr_w(pProp));
2074
2075 if(!memcmp(pProp, wszCharset, sizeof(wszCharset)))
2076 return E_NOTIMPL;
2077
2078 if(!memcmp(pProp, wszDeclarationHandler, sizeof(wszDeclarationHandler)))
2079 {
2080 if(This->isParsing) return E_FAIL;
2081
2082 if(V_UNKNOWN(&value))
2083 {
2084 if(vbInterface)
2085 IVBSAXDeclHandler_AddRef((IVBSAXDeclHandler*)V_UNKNOWN(&value));
2086 else
2087 ISAXDeclHandler_AddRef((ISAXDeclHandler*)V_UNKNOWN(&value));
2088 }
2089 if((vbInterface && This->vbdeclHandler)
2090 || (!vbInterface && This->declHandler))
2091 {
2092 if(vbInterface)
2093 IVBSAXDeclHandler_Release(This->vbdeclHandler);
2094 else
2095 ISAXDeclHandler_Release(This->declHandler);
2096 }
2097 if(vbInterface)
2098 This->vbdeclHandler = (IVBSAXDeclHandler*)V_UNKNOWN(&value);
2099 else
2100 This->declHandler = (ISAXDeclHandler*)V_UNKNOWN(&value);
2101 return S_OK;
2102 }
2103
2104 if(!memcmp(pProp, wszDomNode, sizeof(wszDomNode)))
2105 return E_FAIL;
2106
2107 if(!memcmp(pProp, wszInputSource, sizeof(wszInputSource)))
2108 return E_NOTIMPL;
2109
2110 if(!memcmp(pProp, wszLexicalHandler, sizeof(wszLexicalHandler)))
2111 {
2112 if(This->isParsing) return E_FAIL;
2113
2114 if(V_UNKNOWN(&value))
2115 {
2116 if(vbInterface)
2117 IVBSAXLexicalHandler_AddRef(
2118 (IVBSAXLexicalHandler*)V_UNKNOWN(&value));
2119 else
2120 ISAXLexicalHandler_AddRef(
2121 (ISAXLexicalHandler*)V_UNKNOWN(&value));
2122 }
2123 if((vbInterface && This->vblexicalHandler)
2124 || (!vbInterface && This->lexicalHandler))
2125 {
2126 if(vbInterface)
2127 IVBSAXLexicalHandler_Release(This->vblexicalHandler);
2128 else
2129 ISAXLexicalHandler_Release(This->lexicalHandler);
2130 }
2131 if(vbInterface)
2132 This->vblexicalHandler = (IVBSAXLexicalHandler*)V_UNKNOWN(&value);
2133 else
2134 This->lexicalHandler = (ISAXLexicalHandler*)V_UNKNOWN(&value);
2135 return S_OK;
2136 }
2137
2138 if(!memcmp(pProp, wszMaxElementDepth, sizeof(wszMaxElementDepth)))
2139 return E_NOTIMPL;
2140
2141 if(!memcmp(pProp, wszMaxXMLSize, sizeof(wszMaxXMLSize)))
2142 return E_NOTIMPL;
2143
2144 if(!memcmp(pProp, wszSchemaDeclarationHandler,
2145 sizeof(wszSchemaDeclarationHandler)))
2146 return E_NOTIMPL;
2147
2148 if(!memcmp(pProp, wszXMLDeclEncoding, sizeof(wszXMLDeclEncoding)))
2149 return E_FAIL;
2150
2151 if(!memcmp(pProp, wszXMLDeclStandalone, sizeof(wszXMLDeclStandalone)))
2152 return E_FAIL;
2153
2154 if(!memcmp(pProp, wszXMLDeclVersion, sizeof(wszXMLDeclVersion)))
2155 return E_FAIL;
2156
2157 return E_INVALIDARG;
2158}
2159
Piotr Caban19267602008-07-08 20:52:04 +02002160/*** IVBSAXXMLReader interface ***/
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002161/*** IUnknown methods ***/
2162static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID riid, void **ppvObject)
2163{
2164 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2165
2166 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
2167
2168 *ppvObject = NULL;
2169
2170 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
2171 IsEqualGUID( riid, &IID_IDispatch ) ||
2172 IsEqualGUID( riid, &IID_IVBSAXXMLReader ))
2173 {
2174 *ppvObject = iface;
2175 }
Piotr Caban19267602008-07-08 20:52:04 +02002176 else if( IsEqualGUID( riid, &IID_ISAXXMLReader ))
2177 {
2178 *ppvObject = (ISAXXMLReader*)&This->lpSAXXMLReaderVtbl;
2179 }
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002180 else
2181 {
2182 FIXME("interface %s not implemented\n", debugstr_guid(riid));
2183 return E_NOINTERFACE;
2184 }
2185
2186 IVBSAXXMLReader_AddRef( iface );
2187
2188 return S_OK;
2189}
2190
2191static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader* iface)
2192{
2193 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2194 TRACE("%p\n", This );
2195 return InterlockedIncrement( &This->ref );
2196}
2197
2198static ULONG WINAPI saxxmlreader_Release(
2199 IVBSAXXMLReader* iface)
2200{
2201 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2202 LONG ref;
2203
2204 TRACE("%p\n", This );
2205
2206 ref = InterlockedDecrement( &This->ref );
2207 if ( ref == 0 )
2208 {
Piotr Caban3fa75f42008-07-08 21:00:20 +02002209 if(This->contentHandler)
2210 ISAXContentHandler_Release(This->contentHandler);
2211
Piotr Caban7b7a1872008-08-20 18:32:23 +02002212 if(This->vbcontentHandler)
2213 IVBSAXContentHandler_Release(This->vbcontentHandler);
2214
Piotr Cabanbe89ee12008-07-08 20:52:41 +02002215 if(This->errorHandler)
2216 ISAXErrorHandler_Release(This->errorHandler);
2217
Piotr Caban7b7a1872008-08-20 18:32:23 +02002218 if(This->vberrorHandler)
2219 IVBSAXErrorHandler_Release(This->vberrorHandler);
2220
Piotr Cabanc7fc9262008-10-01 19:52:36 +02002221 if(This->lexicalHandler)
2222 ISAXLexicalHandler_Release(This->lexicalHandler);
2223
2224 if(This->vblexicalHandler)
2225 IVBSAXLexicalHandler_Release(This->vblexicalHandler);
2226
2227 if(This->declHandler)
2228 ISAXDeclHandler_Release(This->declHandler);
2229
2230 if(This->vbdeclHandler)
2231 IVBSAXDeclHandler_Release(This->vbdeclHandler);
2232
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002233 HeapFree( GetProcessHeap(), 0, This );
2234 }
2235
2236 return ref;
2237}
2238/*** IDispatch ***/
2239static HRESULT WINAPI saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader *iface, UINT* pctinfo )
2240{
2241 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2242
2243 TRACE("(%p)->(%p)\n", This, pctinfo);
2244
2245 *pctinfo = 1;
2246
2247 return S_OK;
2248}
2249
2250static HRESULT WINAPI saxxmlreader_GetTypeInfo(
2251 IVBSAXXMLReader *iface,
2252 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
2253{
2254 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2255 HRESULT hr;
2256
2257 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
2258
2259 hr = get_typeinfo(IVBSAXXMLReader_tid, ppTInfo);
2260
2261 return hr;
2262}
2263
2264static HRESULT WINAPI saxxmlreader_GetIDsOfNames(
2265 IVBSAXXMLReader *iface,
2266 REFIID riid,
2267 LPOLESTR* rgszNames,
2268 UINT cNames,
2269 LCID lcid,
2270 DISPID* rgDispId)
2271{
2272 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2273 ITypeInfo *typeinfo;
2274 HRESULT hr;
2275
2276 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
2277 lcid, rgDispId);
2278
2279 if(!rgszNames || cNames == 0 || !rgDispId)
2280 return E_INVALIDARG;
2281
2282 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
2283 if(SUCCEEDED(hr))
2284 {
2285 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
2286 ITypeInfo_Release(typeinfo);
2287 }
2288
2289 return hr;
2290}
2291
2292static HRESULT WINAPI saxxmlreader_Invoke(
2293 IVBSAXXMLReader *iface,
2294 DISPID dispIdMember,
2295 REFIID riid,
2296 LCID lcid,
2297 WORD wFlags,
2298 DISPPARAMS* pDispParams,
2299 VARIANT* pVarResult,
2300 EXCEPINFO* pExcepInfo,
2301 UINT* puArgErr)
2302{
2303 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2304 ITypeInfo *typeinfo;
2305 HRESULT hr;
2306
2307 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
2308 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
2309
2310 hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo);
2311 if(SUCCEEDED(hr))
2312 {
Piotr Caban4c69e862008-07-31 16:47:26 +02002313 hr = ITypeInfo_Invoke(typeinfo, &(This->lpVBSAXXMLReaderVtbl), dispIdMember, wFlags, pDispParams,
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002314 pVarResult, pExcepInfo, puArgErr);
2315 ITypeInfo_Release(typeinfo);
2316 }
2317
2318 return hr;
2319}
2320
2321/*** IVBSAXXMLReader methods ***/
2322static HRESULT WINAPI saxxmlreader_getFeature(
2323 IVBSAXXMLReader* iface,
2324 const WCHAR *pFeature,
2325 VARIANT_BOOL *pValue)
2326{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002327 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2328
2329 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pFeature), pValue);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002330 return E_NOTIMPL;
2331}
2332
2333static HRESULT WINAPI saxxmlreader_putFeature(
2334 IVBSAXXMLReader* iface,
2335 const WCHAR *pFeature,
2336 VARIANT_BOOL vfValue)
2337{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002338 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2339
2340 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(pFeature), vfValue);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002341 return E_NOTIMPL;
2342}
2343
2344static HRESULT WINAPI saxxmlreader_getProperty(
2345 IVBSAXXMLReader* iface,
2346 const WCHAR *pProp,
2347 VARIANT *pValue)
2348{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002349 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2350
2351 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(pProp), pValue);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002352 return E_NOTIMPL;
2353}
2354
2355static HRESULT WINAPI saxxmlreader_putProperty(
2356 IVBSAXXMLReader* iface,
2357 const WCHAR *pProp,
2358 VARIANT value)
2359{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002360 saxreader *This = impl_from_IVBSAXXMLReader( iface );
Piotr Cabanc7fc9262008-10-01 19:52:36 +02002361 return internal_putProperty(This, pProp, value, TRUE);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002362}
2363
Rob Shearman60b4fee2008-09-09 10:26:51 +01002364static HRESULT WINAPI saxxmlreader_get_entityResolver(
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002365 IVBSAXXMLReader* iface,
2366 IVBSAXEntityResolver **pEntityResolver)
2367{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002368 saxreader *This = impl_from_IVBSAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002369 return internal_getEntityResolver(This, pEntityResolver, TRUE);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002370}
2371
Rob Shearman60b4fee2008-09-09 10:26:51 +01002372static HRESULT WINAPI saxxmlreader_put_entityResolver(
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002373 IVBSAXXMLReader* iface,
2374 IVBSAXEntityResolver *pEntityResolver)
2375{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002376 saxreader *This = impl_from_IVBSAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002377 return internal_putEntityResolver(This, pEntityResolver, TRUE);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002378}
2379
Rob Shearman60b4fee2008-09-09 10:26:51 +01002380static HRESULT WINAPI saxxmlreader_get_contentHandler(
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002381 IVBSAXXMLReader* iface,
2382 IVBSAXContentHandler **ppContentHandler)
2383{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002384 saxreader *This = impl_from_IVBSAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002385 return internal_getContentHandler(This, ppContentHandler, TRUE);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002386}
2387
Rob Shearman60b4fee2008-09-09 10:26:51 +01002388static HRESULT WINAPI saxxmlreader_put_contentHandler(
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002389 IVBSAXXMLReader* iface,
2390 IVBSAXContentHandler *contentHandler)
2391{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002392 saxreader *This = impl_from_IVBSAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002393 return internal_putContentHandler(This, contentHandler, TRUE);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002394}
2395
Rob Shearman60b4fee2008-09-09 10:26:51 +01002396static HRESULT WINAPI saxxmlreader_get_dtdHandler(
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002397 IVBSAXXMLReader* iface,
2398 IVBSAXDTDHandler **pDTDHandler)
2399{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002400 saxreader *This = impl_from_IVBSAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002401 return internal_getDTDHandler(This, pDTDHandler, TRUE);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002402}
2403
Rob Shearman60b4fee2008-09-09 10:26:51 +01002404static HRESULT WINAPI saxxmlreader_put_dtdHandler(
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002405 IVBSAXXMLReader* iface,
2406 IVBSAXDTDHandler *pDTDHandler)
2407{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002408 saxreader *This = impl_from_IVBSAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002409 return internal_putDTDHandler(This, pDTDHandler, TRUE);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002410}
2411
Rob Shearman60b4fee2008-09-09 10:26:51 +01002412static HRESULT WINAPI saxxmlreader_get_errorHandler(
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002413 IVBSAXXMLReader* iface,
2414 IVBSAXErrorHandler **pErrorHandler)
2415{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002416 saxreader *This = impl_from_IVBSAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002417 return internal_getErrorHandler(This, pErrorHandler, TRUE);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002418}
2419
Rob Shearman60b4fee2008-09-09 10:26:51 +01002420static HRESULT WINAPI saxxmlreader_put_errorHandler(
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002421 IVBSAXXMLReader* iface,
2422 IVBSAXErrorHandler *errorHandler)
2423{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002424 saxreader *This = impl_from_IVBSAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002425 return internal_putErrorHandler(This, errorHandler, TRUE);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002426}
2427
Rob Shearman60b4fee2008-09-09 10:26:51 +01002428static HRESULT WINAPI saxxmlreader_get_baseURL(
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002429 IVBSAXXMLReader* iface,
2430 const WCHAR **pBaseUrl)
2431{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002432 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2433
2434 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002435 return E_NOTIMPL;
2436}
2437
Rob Shearman60b4fee2008-09-09 10:26:51 +01002438static HRESULT WINAPI saxxmlreader_put_baseURL(
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002439 IVBSAXXMLReader* iface,
2440 const WCHAR *pBaseUrl)
2441{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002442 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2443
2444 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002445 return E_NOTIMPL;
2446}
2447
Rob Shearman60b4fee2008-09-09 10:26:51 +01002448static HRESULT WINAPI saxxmlreader_get_secureBaseURL(
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002449 IVBSAXXMLReader* iface,
2450 const WCHAR **pSecureBaseUrl)
2451{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002452 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2453
2454 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002455 return E_NOTIMPL;
2456}
2457
2458
Rob Shearman60b4fee2008-09-09 10:26:51 +01002459static HRESULT WINAPI saxxmlreader_put_secureBaseURL(
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002460 IVBSAXXMLReader* iface,
2461 const WCHAR *secureBaseUrl)
2462{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002463 saxreader *This = impl_from_IVBSAXXMLReader( iface );
2464
2465 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002466 return E_NOTIMPL;
2467}
2468
2469static HRESULT WINAPI saxxmlreader_parse(
2470 IVBSAXXMLReader* iface,
2471 VARIANT varInput)
2472{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002473 saxreader *This = impl_from_IVBSAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002474 return internal_parse(This, varInput, TRUE);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002475}
2476
2477static HRESULT WINAPI saxxmlreader_parseURL(
2478 IVBSAXXMLReader* iface,
2479 const WCHAR *url)
2480{
Piotr Caban4fb786a2008-04-01 01:45:13 +02002481 saxreader *This = impl_from_IVBSAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002482 return internal_parseURL(This, url, TRUE);
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002483}
2484
2485static const struct IVBSAXXMLReaderVtbl saxreader_vtbl =
2486{
2487 saxxmlreader_QueryInterface,
2488 saxxmlreader_AddRef,
2489 saxxmlreader_Release,
2490 saxxmlreader_GetTypeInfoCount,
2491 saxxmlreader_GetTypeInfo,
2492 saxxmlreader_GetIDsOfNames,
2493 saxxmlreader_Invoke,
2494 saxxmlreader_getFeature,
2495 saxxmlreader_putFeature,
2496 saxxmlreader_getProperty,
2497 saxxmlreader_putProperty,
Rob Shearman60b4fee2008-09-09 10:26:51 +01002498 saxxmlreader_get_entityResolver,
2499 saxxmlreader_put_entityResolver,
2500 saxxmlreader_get_contentHandler,
2501 saxxmlreader_put_contentHandler,
2502 saxxmlreader_get_dtdHandler,
2503 saxxmlreader_put_dtdHandler,
2504 saxxmlreader_get_errorHandler,
2505 saxxmlreader_put_errorHandler,
2506 saxxmlreader_get_baseURL,
2507 saxxmlreader_put_baseURL,
2508 saxxmlreader_get_secureBaseURL,
2509 saxxmlreader_put_secureBaseURL,
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002510 saxxmlreader_parse,
2511 saxxmlreader_parseURL
2512};
2513
Piotr Caban19267602008-07-08 20:52:04 +02002514/*** ISAXXMLReader interface ***/
2515/*** IUnknown methods ***/
2516static HRESULT WINAPI isaxxmlreader_QueryInterface(ISAXXMLReader* iface, REFIID riid, void **ppvObject)
2517{
2518 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Caban4c69e862008-07-31 16:47:26 +02002519 return saxxmlreader_QueryInterface((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl, riid, ppvObject);
Piotr Caban19267602008-07-08 20:52:04 +02002520}
2521
2522static ULONG WINAPI isaxxmlreader_AddRef(ISAXXMLReader* iface)
2523{
2524 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Caban4c69e862008-07-31 16:47:26 +02002525 return saxxmlreader_AddRef((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl);
Piotr Caban19267602008-07-08 20:52:04 +02002526}
2527
2528static ULONG WINAPI isaxxmlreader_Release(ISAXXMLReader* iface)
2529{
2530 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Caban4c69e862008-07-31 16:47:26 +02002531 return saxxmlreader_Release((IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl);
Piotr Caban19267602008-07-08 20:52:04 +02002532}
2533
2534/*** ISAXXMLReader methods ***/
2535static HRESULT WINAPI isaxxmlreader_getFeature(
2536 ISAXXMLReader* iface,
2537 const WCHAR *pFeature,
2538 VARIANT_BOOL *pValue)
2539{
2540 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002541 return IVBSAXXMLReader_getFeature(
2542 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2543 pFeature, pValue);
Piotr Caban19267602008-07-08 20:52:04 +02002544}
2545
2546static HRESULT WINAPI isaxxmlreader_putFeature(
2547 ISAXXMLReader* iface,
2548 const WCHAR *pFeature,
2549 VARIANT_BOOL vfValue)
2550{
2551 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002552 return IVBSAXXMLReader_putFeature(
2553 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2554 pFeature, vfValue);
Piotr Caban19267602008-07-08 20:52:04 +02002555}
2556
2557static HRESULT WINAPI isaxxmlreader_getProperty(
2558 ISAXXMLReader* iface,
2559 const WCHAR *pProp,
2560 VARIANT *pValue)
2561{
2562 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002563 return IVBSAXXMLReader_getProperty(
2564 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2565 pProp, pValue);
Piotr Caban19267602008-07-08 20:52:04 +02002566}
2567
2568static HRESULT WINAPI isaxxmlreader_putProperty(
2569 ISAXXMLReader* iface,
2570 const WCHAR *pProp,
2571 VARIANT value)
2572{
2573 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Cabanc7fc9262008-10-01 19:52:36 +02002574 return internal_putProperty(This, pProp, value, FALSE);
Piotr Caban19267602008-07-08 20:52:04 +02002575}
2576
2577static HRESULT WINAPI isaxxmlreader_getEntityResolver(
2578 ISAXXMLReader* iface,
2579 ISAXEntityResolver **ppEntityResolver)
2580{
2581 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002582 return internal_getEntityResolver(This, ppEntityResolver, FALSE);
Piotr Caban19267602008-07-08 20:52:04 +02002583}
2584
2585static HRESULT WINAPI isaxxmlreader_putEntityResolver(
2586 ISAXXMLReader* iface,
2587 ISAXEntityResolver *pEntityResolver)
2588{
2589 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002590 return internal_putEntityResolver(This, pEntityResolver, FALSE);
Piotr Caban19267602008-07-08 20:52:04 +02002591}
2592
2593static HRESULT WINAPI isaxxmlreader_getContentHandler(
2594 ISAXXMLReader* iface,
2595 ISAXContentHandler **pContentHandler)
2596{
2597 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002598 return internal_getContentHandler(This, pContentHandler, FALSE);
Piotr Caban19267602008-07-08 20:52:04 +02002599}
2600
2601static HRESULT WINAPI isaxxmlreader_putContentHandler(
2602 ISAXXMLReader* iface,
2603 ISAXContentHandler *contentHandler)
2604{
2605 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002606 return internal_putContentHandler(This, contentHandler, FALSE);
Piotr Caban19267602008-07-08 20:52:04 +02002607}
2608
2609static HRESULT WINAPI isaxxmlreader_getDTDHandler(
2610 ISAXXMLReader* iface,
2611 ISAXDTDHandler **pDTDHandler)
2612{
2613 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002614 return internal_getDTDHandler(This, pDTDHandler, FALSE);
Piotr Caban19267602008-07-08 20:52:04 +02002615}
2616
2617static HRESULT WINAPI isaxxmlreader_putDTDHandler(
2618 ISAXXMLReader* iface,
2619 ISAXDTDHandler *pDTDHandler)
2620{
2621 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002622 return internal_putDTDHandler(This, pDTDHandler, FALSE);
Piotr Caban19267602008-07-08 20:52:04 +02002623}
2624
2625static HRESULT WINAPI isaxxmlreader_getErrorHandler(
2626 ISAXXMLReader* iface,
2627 ISAXErrorHandler **pErrorHandler)
2628{
2629 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002630 return internal_getErrorHandler(This, pErrorHandler, FALSE);
Piotr Caban19267602008-07-08 20:52:04 +02002631}
2632
2633static HRESULT WINAPI isaxxmlreader_putErrorHandler(
2634 ISAXXMLReader* iface,
2635 ISAXErrorHandler *errorHandler)
2636{
2637 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002638 return internal_putErrorHandler(This, errorHandler, FALSE);
Piotr Caban19267602008-07-08 20:52:04 +02002639}
2640
2641static HRESULT WINAPI isaxxmlreader_getBaseURL(
2642 ISAXXMLReader* iface,
2643 const WCHAR **pBaseUrl)
2644{
2645 saxreader *This = impl_from_ISAXXMLReader( iface );
Rob Shearman60b4fee2008-09-09 10:26:51 +01002646 return IVBSAXXMLReader_get_baseURL(
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002647 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2648 pBaseUrl);
Piotr Caban19267602008-07-08 20:52:04 +02002649}
2650
2651static HRESULT WINAPI isaxxmlreader_putBaseURL(
2652 ISAXXMLReader* iface,
2653 const WCHAR *pBaseUrl)
2654{
2655 saxreader *This = impl_from_ISAXXMLReader( iface );
Rob Shearman60b4fee2008-09-09 10:26:51 +01002656 return IVBSAXXMLReader_put_baseURL(
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002657 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2658 pBaseUrl);
Piotr Caban19267602008-07-08 20:52:04 +02002659}
2660
2661static HRESULT WINAPI isaxxmlreader_getSecureBaseURL(
2662 ISAXXMLReader* iface,
2663 const WCHAR **pSecureBaseUrl)
2664{
2665 saxreader *This = impl_from_ISAXXMLReader( iface );
Rob Shearman60b4fee2008-09-09 10:26:51 +01002666 return IVBSAXXMLReader_get_secureBaseURL(
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002667 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2668 pSecureBaseUrl);
Piotr Caban19267602008-07-08 20:52:04 +02002669}
2670
2671static HRESULT WINAPI isaxxmlreader_putSecureBaseURL(
2672 ISAXXMLReader* iface,
2673 const WCHAR *secureBaseUrl)
2674{
2675 saxreader *This = impl_from_ISAXXMLReader( iface );
Rob Shearman60b4fee2008-09-09 10:26:51 +01002676 return IVBSAXXMLReader_put_secureBaseURL(
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002677 (IVBSAXXMLReader*)&This->lpVBSAXXMLReaderVtbl,
2678 secureBaseUrl);
Piotr Cabanb15345d2008-07-27 19:54:48 +02002679}
2680
2681static HRESULT WINAPI isaxxmlreader_parse(
2682 ISAXXMLReader* iface,
2683 VARIANT varInput)
2684{
2685 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002686 return internal_parse(This, varInput, FALSE);
Piotr Caban19267602008-07-08 20:52:04 +02002687}
2688
2689static HRESULT WINAPI isaxxmlreader_parseURL(
2690 ISAXXMLReader* iface,
2691 const WCHAR *url)
2692{
2693 saxreader *This = impl_from_ISAXXMLReader( iface );
Piotr Cabancb6bcd02008-07-31 16:48:20 +02002694 return internal_parseURL(This, url, FALSE);
Piotr Caban19267602008-07-08 20:52:04 +02002695}
2696
2697static const struct ISAXXMLReaderVtbl isaxreader_vtbl =
2698{
2699 isaxxmlreader_QueryInterface,
2700 isaxxmlreader_AddRef,
2701 isaxxmlreader_Release,
2702 isaxxmlreader_getFeature,
2703 isaxxmlreader_putFeature,
2704 isaxxmlreader_getProperty,
2705 isaxxmlreader_putProperty,
2706 isaxxmlreader_getEntityResolver,
2707 isaxxmlreader_putEntityResolver,
2708 isaxxmlreader_getContentHandler,
2709 isaxxmlreader_putContentHandler,
2710 isaxxmlreader_getDTDHandler,
2711 isaxxmlreader_putDTDHandler,
2712 isaxxmlreader_getErrorHandler,
2713 isaxxmlreader_putErrorHandler,
2714 isaxxmlreader_getBaseURL,
2715 isaxxmlreader_putBaseURL,
2716 isaxxmlreader_getSecureBaseURL,
2717 isaxxmlreader_putSecureBaseURL,
2718 isaxxmlreader_parse,
2719 isaxxmlreader_parseURL
2720};
2721
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002722HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
2723{
2724 saxreader *reader;
2725
2726 TRACE("(%p,%p)\n", pUnkOuter, ppObj);
2727
2728 reader = HeapAlloc( GetProcessHeap(), 0, sizeof (*reader) );
2729 if( !reader )
2730 return E_OUTOFMEMORY;
2731
Piotr Caban4c69e862008-07-31 16:47:26 +02002732 reader->lpVBSAXXMLReaderVtbl = &saxreader_vtbl;
Piotr Caban19267602008-07-08 20:52:04 +02002733 reader->lpSAXXMLReaderVtbl = &isaxreader_vtbl;
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002734 reader->ref = 1;
Piotr Caban3fa75f42008-07-08 21:00:20 +02002735 reader->contentHandler = NULL;
Piotr Caban7b7a1872008-08-20 18:32:23 +02002736 reader->vbcontentHandler = NULL;
Piotr Cabanbe89ee12008-07-08 20:52:41 +02002737 reader->errorHandler = NULL;
Piotr Caban7b7a1872008-08-20 18:32:23 +02002738 reader->vberrorHandler = NULL;
Piotr Cabanc7fc9262008-10-01 19:52:36 +02002739 reader->lexicalHandler = NULL;
2740 reader->vblexicalHandler = NULL;
2741 reader->declHandler = NULL;
2742 reader->vbdeclHandler = NULL;
2743 reader->isParsing = FALSE;
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002744
Piotr Caban51c95272008-07-17 00:40:53 +02002745 memset(&reader->sax, 0, sizeof(xmlSAXHandler));
2746 reader->sax.initialized = XML_SAX2_MAGIC;
Piotr Caban072383e2008-07-17 00:41:01 +02002747 reader->sax.startDocument = libxmlStartDocument;
Piotr Cabanc58b24b2008-07-17 00:41:19 +02002748 reader->sax.endDocument = libxmlEndDocument;
Piotr Caban965a2ea2008-07-17 00:41:27 +02002749 reader->sax.startElementNs = libxmlStartElementNS;
Piotr Caban66932632008-07-17 00:41:34 +02002750 reader->sax.endElementNs = libxmlEndElementNS;
Piotr Caban40388632008-07-17 00:41:40 +02002751 reader->sax.characters = libxmlCharacters;
Piotr Cabane47cbd12008-07-17 00:41:52 +02002752 reader->sax.setDocumentLocator = libxmlSetDocumentLocator;
Piotr Cabandb2761a2008-10-07 22:11:04 +02002753 reader->sax.comment = libxmlComment;
Piotr Cabanbba7eb52008-07-19 22:32:10 +02002754 reader->sax.error = libxmlFatalError;
2755 reader->sax.fatalError = libxmlFatalError;
Piotr Caban51c95272008-07-17 00:40:53 +02002756
Piotr Caban4c69e862008-07-31 16:47:26 +02002757 *ppObj = &reader->lpVBSAXXMLReaderVtbl;
Alistair Leslie-Hughesb478ec02008-03-26 14:40:01 +11002758
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002759 TRACE("returning iface %p\n", *ppObj);
Alistair Leslie-Hughesb478ec02008-03-26 14:40:01 +11002760
Alistair Leslie-Hughes264be582008-03-25 14:19:10 +11002761 return S_OK;
2762}
2763
2764#else
2765
2766HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj)
2767{
2768 MESSAGE("This program tried to use a SAX XML Reader object, but\n"
2769 "libxml2 support was not present at compile time.\n");
2770 return E_NOTIMPL;
2771}
2772
2773#endif