ReactOS 0.4.16-dev-2208-g6350669
saxreader.c
Go to the documentation of this file.
1/*
2 * SAX Reader implementation
3 *
4 * Copyright 2008 Alistair Leslie-Hughes
5 * Copyright 2008 Piotr Caban
6 *
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 <stdarg.h>
24#include <libxml/parser.h>
25#include <libxml/xmlerror.h>
26#include <libxml/SAX2.h>
28
29#include "windef.h"
30#include "winbase.h"
31#include "winuser.h"
32#include "winnls.h"
33#include "ole2.h"
34#include "msxml6.h"
35#include "wininet.h"
36#include "urlmon.h"
37#include "winreg.h"
38#include "shlwapi.h"
39
40#include "wine/debug.h"
41
42#include "msxml_private.h"
43
45
46typedef enum
47{
52 ForcedResync = 1 << 4,
54 Namespaces = 1 << 6,
57 ProhibitDTD = 1 << 9,
61 UseInlineSchema = 1 << 13,
65
66/* feature names */
68 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/','s','a','x','/',
69 'f','e','a','t','u','r','e','s','/','e','x','t','e','r','n','a','l','-','g','e','n','e','r','a','l',
70 '-','e','n','t','i','t','i','e','s',0
71};
72
74 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/','s','a','x','/','f','e','a','t','u','r','e','s',
75 '/','e','x','t','e','r','n','a','l','-','p','a','r','a','m','e','t','e','r','-','e','n','t','i','t','i','e','s',0
76};
77
79 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/','s','a','x','/','f','e','a','t','u','r','e','s',
80 '/','l','e','x','i','c','a','l','-','h','a','n','d','l','e','r','/','p','a','r','a','m','e','t','e','r','-','e','n','t','i','t','i','e','s',0
81};
82
83static const WCHAR FeatureProhibitDTDW[] = {
84 'p','r','o','h','i','b','i','t','-','d','t','d',0
85};
86
87static const WCHAR FeatureNamespacesW[] = {
88 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/','s','a','x','/','f','e','a','t','u','r','e','s',
89 '/','n','a','m','e','s','p','a','c','e','s',0
90};
91
93 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/','s','a','x','/','f','e','a','t','u','r','e','s',
94 '/','n','a','m','e','s','p','a','c','e','-','p','r','e','f','i','x','e','s',0
95};
96
97static const WCHAR ExhaustiveErrorsW[] = {
98 'e','x','h','a','u','s','t','i','v','e','-','e','r','r','o','r','s',0
99};
100
101static const WCHAR SchemaValidationW[] = {
102 's','c','h','e','m','a','-','v','a','l','i','d','a','t','i','o','n',0
103};
104
106{
108 const WCHAR *name;
109};
110
120};
121
123{
124 int min, max, n, c;
125
126 min = 0;
128
129 while (min <= max)
130 {
131 n = (min+max)/2;
132
134 if (!c)
135 return saxreader_feature_map[n].feature;
136
137 if (c > 0)
138 max = n-1;
139 else
140 min = n+1;
141 }
142
143 return FeatureUnknown;
144}
145
146static const WCHAR empty_str;
147
149{
151 unsigned int index;
152 unsigned int len;
153};
154
155typedef struct
156{
157 BSTR prefix;
158 BSTR uri;
159} ns;
160
161typedef struct
162{
163 struct list entry;
167 ns *ns; /* namespaces defined in this particular element */
170
172{
181
183{
186};
187
189{
191 IVBSAXContentHandler *vbhandler;
192};
193
195{
196 ISAXErrorHandler *handler;
197 IVBSAXErrorHandler *vbhandler;
198};
199
201{
202 ISAXLexicalHandler *handler;
203 IVBSAXLexicalHandler *vbhandler;
204};
205
207{
208 ISAXEntityResolver *handler;
209 IVBSAXEntityResolver *vbhandler;
210};
211
213{
214 union {
220 } u;
221};
222
223typedef struct
224{
226 IVBSAXXMLReader IVBSAXXMLReader_iface;
227 ISAXXMLReader ISAXXMLReader_iface;
229
231 xmlSAXHandler sax;
237} saxreader;
238
240{
241 struct saxanyhandler_iface *iface = &reader->saxhandlers[type].u.anyhandler;
242 IUnknown *unk = (IUnknown*)ptr;
243
244 if (unk)
245 IUnknown_AddRef(unk);
246
247 if ((vb && iface->vbhandler) || (!vb && iface->handler))
248 IUnknown_Release(vb ? iface->vbhandler : iface->handler);
249
250 if (vb)
251 iface->vbhandler = unk;
252 else
253 iface->handler = unk;
254
255 return S_OK;
256}
257
259{
260 const struct saxanyhandler_iface *iface = &reader->saxhandlers[type].u.anyhandler;
261
262 if (!ret) return E_POINTER;
263
264 if ((vb && iface->vbhandler) || (!vb && iface->handler))
265 {
266 if (vb)
267 IUnknown_AddRef(iface->vbhandler);
268 else
269 IUnknown_AddRef(iface->handler);
270 }
271
272 *ret = vb ? iface->vbhandler : iface->handler;
273
274 return S_OK;
275}
276
278{
279 return &reader->saxhandlers[SAXContentHandler].u.content;
280}
281
283{
284 return &reader->saxhandlers[SAXErrorHandler].u.error;
285}
286
288{
289 return &reader->saxhandlers[SAXLexicalHandler].u.lexical;
290}
291
292typedef struct
293{
294 IVBSAXLocator IVBSAXLocator_iface;
295 ISAXLocator ISAXLocator_iface;
296 IVBSAXAttributes IVBSAXAttributes_iface;
301 xmlParserCtxtPtr pParserCtxt;
304 int line;
307 struct list elements;
308
313 {
318 } *attributes;
319} saxlocator;
320
321static inline saxreader *impl_from_IVBSAXXMLReader( IVBSAXXMLReader *iface )
322{
323 return CONTAINING_RECORD(iface, saxreader, IVBSAXXMLReader_iface);
324}
325
326static inline saxreader *impl_from_ISAXXMLReader( ISAXXMLReader *iface )
327{
328 return CONTAINING_RECORD(iface, saxreader, ISAXXMLReader_iface);
329}
330
331static inline saxlocator *impl_from_IVBSAXLocator( IVBSAXLocator *iface )
332{
333 return CONTAINING_RECORD(iface, saxlocator, IVBSAXLocator_iface);
334}
335
336static inline saxlocator *impl_from_ISAXLocator( ISAXLocator *iface )
337{
338 return CONTAINING_RECORD(iface, saxlocator, ISAXLocator_iface);
339}
340
341static inline saxlocator *impl_from_IVBSAXAttributes( IVBSAXAttributes *iface )
342{
343 return CONTAINING_RECORD(iface, saxlocator, IVBSAXAttributes_iface);
344}
345
347{
348 return CONTAINING_RECORD(iface, saxlocator, ISAXAttributes_iface);
349}
350
352{
353 struct saxanyhandler_iface *iface = &locator->saxreader->saxhandlers[type].u.anyhandler;
354 return (locator->vbInterface && iface->vbhandler) || (!locator->vbInterface && iface->handler);
355}
356
358{
360 HRESULT hr;
361
363
364 if (locator->vbInterface)
365 hr = IVBSAXContentHandler_characters(content->vbhandler, &chars);
366 else
367 hr = ISAXContentHandler_characters(content->handler, chars, SysStringLen(chars));
368
369 return hr;
370}
371
372/* property names */
373static const WCHAR PropertyCharsetW[] = {
374 'c','h','a','r','s','e','t',0
375};
377 'x','m','l','d','e','c','l','-','v','e','r','s','i','o','n',0
378};
379static const WCHAR PropertyDeclHandlerW[] = {
380 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
381 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
382 'd','e','c','l','a','r','a','t','i','o','n',
383 '-','h','a','n','d','l','e','r',0
384};
385static const WCHAR PropertyDomNodeW[] = {
386 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
387 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
388 'd','o','m','-','n','o','d','e',0
389};
390static const WCHAR PropertyInputSourceW[] = {
391 'i','n','p','u','t','-','s','o','u','r','c','e',0
392};
394 'h','t','t','p',':','/','/','x','m','l','.','o','r','g','/',
395 's','a','x','/','p','r','o','p','e','r','t','i','e','s','/',
396 'l','e','x','i','c','a','l','-','h','a','n','d','l','e','r',0
397};
399 'm','a','x','-','e','l','e','m','e','n','t','-','d','e','p','t','h',0
400};
401static const WCHAR PropertyMaxXMLSizeW[] = {
402 'm','a','x','-','x','m','l','-','s','i','z','e',0
403};
405 's','c','h','e','m','a','-','d','e','c','l','a','r','a','t','i','o','n','-',
406 'h','a','n','d','l','e','r',0
407};
409 'x','m','l','d','e','c','l','-','e','n','c','o','d','i','n','g',0
410};
412 'x','m','l','d','e','c','l','-','s','t','a','n','d','a','l','o','n','e',0
413};
415 'x','m','l','d','e','c','l','-','v','e','r','s','i','o','n',0
416};
417
419{
420 /* handling of non-VARIANT_* values is version dependent */
421 if ((reader->version < MSXML4) && (value != VARIANT_TRUE))
422 value = VARIANT_FALSE;
423 if ((reader->version >= MSXML4) && (value != VARIANT_FALSE))
424 value = VARIANT_TRUE;
425
426 if (value == VARIANT_TRUE)
427 reader->features |= feature;
428 else
429 reader->features &= ~feature;
430
431 return S_OK;
432}
433
435{
436 *value = reader->features & feature ? VARIANT_TRUE : VARIANT_FALSE;
437 return S_OK;
438}
439
441{
442 return (reader->version < MSXML4) || (reader->features & Namespaces);
443}
444
446{
447 if (prefix && *prefix)
448 {
450 WCHAR *ptr;
451
452 ptr = qname;
455 *ptr++ = ':';
457 return qname;
458 }
459 else
460 return SysAllocString(local);
461}
462
464 const xmlChar **namespaces)
465{
467 int i;
468
469 ret = malloc(sizeof(*ret));
470 if (!ret) return ret;
471
472 ret->local = bstr_from_xmlChar(local);
473 ret->prefix = bstr_from_xmlChar(prefix);
474 ret->qname = build_qname(ret->prefix, ret->local);
475 ret->ns = nb_ns ? malloc(nb_ns * sizeof(ns)) : NULL;
476 ret->ns_count = nb_ns;
477
478 for (i=0; i < nb_ns; i++)
479 {
480 ret->ns[i].prefix = bstr_from_xmlChar(namespaces[2*i]);
481 ret->ns[i].uri = bstr_from_xmlChar(namespaces[2*i+1]);
482 }
483
484 return ret;
485}
486
488{
489 int i;
490
491 for (i=0; i<element->ns_count;i++)
492 {
493 SysFreeString(element->ns[i].prefix);
494 SysFreeString(element->ns[i].uri);
495 }
496
498 SysFreeString(element->local);
500
501 free(element->ns);
502 free(element);
503}
504
506{
507 list_add_head(&locator->elements, &element->entry);
508}
509
511{
513
514 if (element)
516
517 return element;
518}
519
521{
523 BSTR uriW;
524 int i;
525
526 if (!uri) return NULL;
527
528 uriW = bstr_from_xmlChar(uri);
529
531 {
532 for (i=0; i < element->ns_count; i++)
533 if (!wcscmp(uriW, element->ns[i].uri))
534 {
535 SysFreeString(uriW);
536 return element->ns[i].uri;
537 }
538 }
539
540 SysFreeString(uriW);
541 ERR("namespace uri not found, %s\n", debugstr_a((char*)uri));
542 return NULL;
543}
544
545/* used to localize version dependent error check behaviour */
547{
548 return This->saxreader->version >= MSXML4 ? FAILED(hr) : hr != S_OK;
549}
550
551/* index value -1 means it tries to loop for a first time */
553{
554 if (This->saxreader->version >= MSXML4)
555 {
556 if (*i == -1) *i = 0; else ++*i;
557 return *i < element->ns_count;
558 }
559 else
560 {
561 if (*i == -1) *i = element->ns_count-1; else --*i;
562 return *i >= 0;
563 }
564}
565
566static BOOL bstr_pool_insert(struct bstrpool *pool, BSTR pool_entry)
567{
568 if (!pool->pool)
569 {
570 pool->pool = malloc(16 * sizeof(*pool->pool));
571 if (!pool->pool)
572 return FALSE;
573
574 pool->index = 0;
575 pool->len = 16;
576 }
577 else if (pool->index == pool->len)
578 {
579 BSTR *new_pool = realloc(pool->pool, pool->len * 2 * sizeof(*new_pool));
580
581 if (!new_pool)
582 return FALSE;
583
584 pool->pool = new_pool;
585 pool->len *= 2;
586 }
587
588 pool->pool[pool->index++] = pool_entry;
589 return TRUE;
590}
591
592static void free_bstr_pool(struct bstrpool *pool)
593{
594 unsigned int i;
595
596 for (i = 0; i < pool->index; i++)
597 SysFreeString(pool->pool[i]);
598
599 free(pool->pool);
600
601 pool->pool = NULL;
602 pool->index = pool->len = 0;
603}
604
606{
607 DWORD dLen;
608 BSTR bstr;
609
610 if (!buf)
611 return NULL;
612
613 dLen = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, NULL, 0);
614 if(len != -1) dLen++;
615 bstr = SysAllocStringLen(NULL, dLen-1);
616 if (!bstr)
617 return NULL;
618 MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, len, bstr, dLen);
619 if(len != -1) bstr[dLen-1] = '\0';
620
621 return bstr;
622}
623
625{
626 xmlChar *qname;
627 BSTR bstr;
628
629 if(!name) return NULL;
630
631 if(!prefix || !*prefix)
632 return bstr_from_xmlChar(name);
633
634 qname = xmlBuildQName(name, prefix, NULL, 0);
635 bstr = bstr_from_xmlChar(qname);
636 xmlFree(qname);
637
638 return bstr;
639}
640
642{
643 BSTR pool_entry = bstr_from_xmlChar(buf);
644
645 if (pool_entry && !bstr_pool_insert(pool, pool_entry))
646 {
647 SysFreeString(pool_entry);
648 return NULL;
649 }
650
651 return pool_entry;
652}
653
655{
656 BSTR pool_entry = bstr_from_xmlCharN(buf, len);
657
658 if (pool_entry && !bstr_pool_insert(pool, pool_entry))
659 {
660 SysFreeString(pool_entry);
661 return NULL;
662 }
663
664 return pool_entry;
665}
666
668{
670 xmlStopParser(This->pParserCtxt);
671 This->ret = hr;
672
674 {
675 WCHAR msg[1024];
677 NULL, hr, 0, msg, ARRAY_SIZE(msg), NULL))
678 {
679 FIXME("MSXML errors not yet supported.\n");
680 msg[0] = '\0';
681 }
682
683 if(This->vbInterface)
684 {
685 BSTR bstrMsg = SysAllocString(msg);
686 IVBSAXErrorHandler_fatalError(handler->vbhandler,
687 &This->IVBSAXLocator_iface, &bstrMsg, hr);
688 SysFreeString(bstrMsg);
689 }
690 else
691 ISAXErrorHandler_fatalError(handler->handler,
692 &This->ISAXLocator_iface, msg, hr);
693 }
694}
695
696static void update_position(saxlocator *This, BOOL fix_column)
697{
698 const xmlChar *p = This->pParserCtxt->input->cur-1;
699 const xmlChar *baseP = This->pParserCtxt->input->base;
700
701 This->line = xmlSAX2GetLineNumber(This->pParserCtxt);
702 if(fix_column)
703 {
704 This->column = 1;
705 for(;p>=baseP && *p!='\n' && *p!='\r'; p--)
706 This->column++;
707 }
708 else
709 {
710 This->column = xmlSAX2GetColumnNumber(This->pParserCtxt);
711 }
712}
713
714/*** IVBSAXAttributes interface ***/
716 IVBSAXAttributes* iface,
717 REFIID riid,
718 void **ppvObject)
719{
721 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
722 return IVBSAXLocator_QueryInterface(&This->IVBSAXLocator_iface, riid, ppvObject);
723}
724
725static ULONG WINAPI ivbsaxattributes_AddRef(IVBSAXAttributes* iface)
726{
728 return IVBSAXLocator_AddRef(&This->IVBSAXLocator_iface);
729}
730
731static ULONG WINAPI ivbsaxattributes_Release(IVBSAXAttributes* iface)
732{
734 return IVBSAXLocator_Release(&This->IVBSAXLocator_iface);
735}
736
737static HRESULT WINAPI ivbsaxattributes_GetTypeInfoCount( IVBSAXAttributes *iface, UINT* pctinfo )
738{
740
741 TRACE("(%p)->(%p)\n", This, pctinfo);
742
743 *pctinfo = 1;
744
745 return S_OK;
746}
747
749 IVBSAXAttributes *iface,
750 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
751{
752 TRACE("%p, %u, %lx, %p.\n", iface, iTInfo, lcid, ppTInfo);
753
754 return get_typeinfo(IVBSAXAttributes_tid, ppTInfo);
755}
756
758 IVBSAXAttributes *iface,
759 REFIID riid,
760 LPOLESTR* rgszNames,
761 UINT cNames,
762 LCID lcid,
763 DISPID* rgDispId)
764{
766 HRESULT hr;
767
768 TRACE("%p, %s, %p, %u, %lx %p.\n", iface, debugstr_guid(riid), rgszNames, cNames,
769 lcid, rgDispId);
770
771 if(!rgszNames || cNames == 0 || !rgDispId)
772 return E_INVALIDARG;
773
775 if(SUCCEEDED(hr))
776 {
777 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
778 ITypeInfo_Release(typeinfo);
779 }
780
781 return hr;
782}
783
785 IVBSAXAttributes *iface,
786 DISPID dispIdMember,
787 REFIID riid,
788 LCID lcid,
789 WORD wFlags,
790 DISPPARAMS* pDispParams,
791 VARIANT* pVarResult,
792 EXCEPINFO* pExcepInfo,
793 UINT* puArgErr)
794{
796 HRESULT hr;
797
798 TRACE("%p, %ld, %s, %lx, %d, %p, %p, %p, %p.\n", iface, dispIdMember, debugstr_guid(riid),
799 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
800
802 if(SUCCEEDED(hr))
803 {
804 hr = ITypeInfo_Invoke(typeinfo, iface, dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
805 ITypeInfo_Release(typeinfo);
806 }
807
808 return hr;
809}
810
811/*** IVBSAXAttributes methods ***/
813 IVBSAXAttributes* iface,
814 int *nLength)
815{
817 return ISAXAttributes_getLength(&This->ISAXAttributes_iface, nLength);
818}
819
821 IVBSAXAttributes* iface,
822 int nIndex,
823 BSTR *uri)
824{
826 const WCHAR *uriW;
827 HRESULT hr;
828 int len;
829
830 TRACE("(%p)->(%d %p)\n", This, nIndex, uri);
831
832 if (!uri)
833 return E_POINTER;
834
835 *uri = NULL;
836 hr = ISAXAttributes_getURI(&This->ISAXAttributes_iface, nIndex, &uriW, &len);
837 if (FAILED(hr))
838 return hr;
839
840 return return_bstrn(uriW, len, uri);
841}
842
844 IVBSAXAttributes* iface,
845 int nIndex,
846 BSTR *name)
847{
849 const WCHAR *nameW;
850 HRESULT hr;
851 int len;
852
853 TRACE("(%p)->(%d %p)\n", This, nIndex, name);
854
855 if (!name)
856 return E_POINTER;
857
858 *name = NULL;
859 hr = ISAXAttributes_getLocalName(&This->ISAXAttributes_iface, nIndex, &nameW, &len);
860 if (FAILED(hr))
861 return hr;
862
863 return return_bstrn(nameW, len, name);
864}
865
867 IVBSAXAttributes* iface,
868 int nIndex,
869 BSTR *QName)
870{
872 const WCHAR *nameW;
873 HRESULT hr;
874 int len;
875
876 TRACE("(%p)->(%d %p)\n", This, nIndex, QName);
877
878 if (!QName)
879 return E_POINTER;
880
881 *QName = NULL;
882 hr = ISAXAttributes_getQName(&This->ISAXAttributes_iface, nIndex, &nameW, &len);
883 if (FAILED(hr))
884 return hr;
885
886 return return_bstrn(nameW, len, QName);
887}
888
890 IVBSAXAttributes* iface,
891 BSTR uri,
892 BSTR localName,
893 int *index)
894{
896 return ISAXAttributes_getIndexFromName(&This->ISAXAttributes_iface, uri, SysStringLen(uri),
897 localName, SysStringLen(localName), index);
898}
899
901 IVBSAXAttributes* iface,
902 BSTR QName,
903 int *index)
904{
906 return ISAXAttributes_getIndexFromQName(&This->ISAXAttributes_iface, QName,
907 SysStringLen(QName), index);
908}
909
911 IVBSAXAttributes* iface,
912 int nIndex,
913 BSTR *type)
914{
916 const WCHAR *typeW;
917 HRESULT hr;
918 int len;
919
920 TRACE("(%p)->(%d %p)\n", This, nIndex, type);
921
922 if (!type)
923 return E_POINTER;
924
925 *type = NULL;
926 hr = ISAXAttributes_getType(&This->ISAXAttributes_iface, nIndex, &typeW, &len);
927 if (FAILED(hr))
928 return hr;
929
930 return return_bstrn(typeW, len, type);
931}
932
934 IVBSAXAttributes* iface,
935 BSTR uri,
936 BSTR localName,
937 BSTR *type)
938{
940 const WCHAR *typeW;
941 HRESULT hr;
942 int len;
943
944 TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(uri), debugstr_w(localName), type);
945
946 if (!type)
947 return E_POINTER;
948
949 *type = NULL;
950 hr = ISAXAttributes_getTypeFromName(&This->ISAXAttributes_iface, uri, SysStringLen(uri),
951 localName, SysStringLen(localName), &typeW, &len);
952 if (FAILED(hr))
953 return hr;
954
955 return return_bstrn(typeW, len, type);
956}
957
959 IVBSAXAttributes* iface,
960 BSTR QName,
961 BSTR *type)
962{
964 const WCHAR *typeW;
965 HRESULT hr;
966 int len;
967
968 TRACE("(%p)->(%s %p)\n", This, debugstr_w(QName), type);
969
970 if (!type)
971 return E_POINTER;
972
973 *type = NULL;
974 hr = ISAXAttributes_getTypeFromQName(&This->ISAXAttributes_iface, QName, SysStringLen(QName),
975 &typeW, &len);
976 if (FAILED(hr))
977 return hr;
978
979 return return_bstrn(typeW, len, type);
980}
981
983 IVBSAXAttributes* iface,
984 int nIndex,
985 BSTR *value)
986{
988 const WCHAR *valueW;
989 HRESULT hr;
990 int len;
991
992 TRACE("(%p)->(%d %p)\n", This, nIndex, value);
993
994 if (!value)
995 return E_POINTER;
996
997 *value = NULL;
998 hr = ISAXAttributes_getValue(&This->ISAXAttributes_iface, nIndex, &valueW, &len);
999 if (FAILED(hr))
1000 return hr;
1001
1002 return return_bstrn(valueW, len, value);
1003}
1004
1006 IVBSAXAttributes* iface,
1007 BSTR uri,
1008 BSTR localName,
1009 BSTR *value)
1010{
1012 const WCHAR *valueW;
1013 HRESULT hr;
1014 int len;
1015
1016 TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(uri), debugstr_w(localName), value);
1017
1018 if (!value)
1019 return E_POINTER;
1020
1021 *value = NULL;
1022 hr = ISAXAttributes_getValueFromName(&This->ISAXAttributes_iface, uri, SysStringLen(uri),
1023 localName, SysStringLen(localName), &valueW, &len);
1024 if (FAILED(hr))
1025 return hr;
1026
1027 return return_bstrn(valueW, len, value);
1028}
1029
1031 IVBSAXAttributes* iface,
1032 BSTR QName,
1033 BSTR *value)
1034{
1036 const WCHAR *valueW;
1037 HRESULT hr;
1038 int len;
1039
1040 TRACE("(%p)->(%s %p)\n", This, debugstr_w(QName), value);
1041
1042 if (!value)
1043 return E_POINTER;
1044
1045 *value = NULL;
1046 hr = ISAXAttributes_getValueFromQName(&This->ISAXAttributes_iface, QName,
1047 SysStringLen(QName), &valueW, &len);
1048 if (FAILED(hr))
1049 return hr;
1050
1051 return return_bstrn(valueW, len, value);
1052}
1053
1054static const struct IVBSAXAttributesVtbl ivbsaxattributes_vtbl =
1055{
1075};
1076
1077/*** ISAXAttributes interface ***/
1078/*** IUnknown methods ***/
1080 ISAXAttributes* iface,
1081 REFIID riid,
1082 void **ppvObject)
1083{
1085 TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject);
1086 return ISAXLocator_QueryInterface(&This->ISAXLocator_iface, riid, ppvObject);
1087}
1088
1090{
1092 TRACE("%p\n", This);
1093 return ISAXLocator_AddRef(&This->ISAXLocator_iface);
1094}
1095
1097{
1099
1100 TRACE("%p\n", This);
1101 return ISAXLocator_Release(&This->ISAXLocator_iface);
1102}
1103
1104/*** ISAXAttributes methods ***/
1106 ISAXAttributes* iface,
1107 int *length)
1108{
1110
1111 *length = This->attr_count;
1112 TRACE("Length set to %d\n", *length);
1113 return S_OK;
1114}
1115
1117{
1118 return index < locator->attr_count && index >= 0;
1119}
1120
1122 ISAXAttributes* iface,
1123 int index,
1124 const WCHAR **url,
1125 int *size)
1126{
1128 TRACE("(%p)->(%d)\n", This, index);
1129
1131 if(!url || !size) return E_POINTER;
1132
1133 *size = SysStringLen(This->attributes[index].szURI);
1134 *url = This->attributes[index].szURI;
1135
1136 TRACE("(%s:%d)\n", debugstr_w(This->attributes[index].szURI), *size);
1137
1138 return S_OK;
1139}
1140
1142 ISAXAttributes* iface,
1143 int index,
1144 const WCHAR **pLocalName,
1145 int *pLocalNameLength)
1146{
1148 TRACE("(%p)->(%d)\n", This, index);
1149
1151 if(!pLocalName || !pLocalNameLength) return E_POINTER;
1152
1153 *pLocalNameLength = SysStringLen(This->attributes[index].szLocalname);
1154 *pLocalName = This->attributes[index].szLocalname;
1155
1156 return S_OK;
1157}
1158
1160 ISAXAttributes* iface,
1161 int index,
1162 const WCHAR **pQName,
1163 int *pQNameLength)
1164{
1166 TRACE("(%p)->(%d)\n", This, index);
1167
1169 if(!pQName || !pQNameLength) return E_POINTER;
1170
1171 *pQNameLength = SysStringLen(This->attributes[index].szQName);
1172 *pQName = This->attributes[index].szQName;
1173
1174 return S_OK;
1175}
1176
1178 ISAXAttributes* iface,
1179 int index,
1180 const WCHAR **uri,
1181 int *pUriLength,
1182 const WCHAR **localName,
1183 int *pLocalNameSize,
1184 const WCHAR **QName,
1185 int *pQNameLength)
1186{
1188 TRACE("(%p)->(%d)\n", This, index);
1189
1191 if(!uri || !pUriLength || !localName || !pLocalNameSize
1192 || !QName || !pQNameLength) return E_POINTER;
1193
1194 *pUriLength = SysStringLen(This->attributes[index].szURI);
1195 *uri = This->attributes[index].szURI;
1196 *pLocalNameSize = SysStringLen(This->attributes[index].szLocalname);
1197 *localName = This->attributes[index].szLocalname;
1198 *pQNameLength = SysStringLen(This->attributes[index].szQName);
1199 *QName = This->attributes[index].szQName;
1200
1201 TRACE("(%s, %s, %s)\n", debugstr_w(*uri), debugstr_w(*localName), debugstr_w(*QName));
1202
1203 return S_OK;
1204}
1205
1207 ISAXAttributes* iface,
1208 const WCHAR *pUri,
1209 int cUriLength,
1210 const WCHAR *pLocalName,
1211 int cocalNameLength,
1212 int *index)
1213{
1215 int i;
1216 TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), cUriLength,
1217 debugstr_w(pLocalName), cocalNameLength);
1218
1219 if(!pUri || !pLocalName || !index) return E_POINTER;
1220
1221 for(i=0; i<This->attr_count; i++)
1222 {
1223 if(cUriLength!=SysStringLen(This->attributes[i].szURI)
1224 || cocalNameLength!=SysStringLen(This->attributes[i].szLocalname))
1225 continue;
1226 if(cUriLength && memcmp(pUri, This->attributes[i].szURI,
1227 sizeof(WCHAR)*cUriLength))
1228 continue;
1229 if(cocalNameLength && memcmp(pLocalName, This->attributes[i].szLocalname,
1230 sizeof(WCHAR)*cocalNameLength))
1231 continue;
1232
1233 *index = i;
1234 return S_OK;
1235 }
1236
1237 return E_INVALIDARG;
1238}
1239
1241 ISAXAttributes* iface,
1242 const WCHAR *pQName,
1243 int nQNameLength,
1244 int *index)
1245{
1247 int i;
1248 TRACE("(%p)->(%s, %d)\n", This, debugstr_w(pQName), nQNameLength);
1249
1250 if(!pQName || !index) return E_POINTER;
1251 if(!nQNameLength) return E_INVALIDARG;
1252
1253 for(i=0; i<This->attr_count; i++)
1254 {
1255 if(nQNameLength!=SysStringLen(This->attributes[i].szQName)) continue;
1256 if(memcmp(pQName, This->attributes[i].szQName, sizeof(WCHAR)*nQNameLength)) continue;
1257
1258 *index = i;
1259 return S_OK;
1260 }
1261
1262 return E_INVALIDARG;
1263}
1264
1266 ISAXAttributes* iface,
1267 int nIndex,
1268 const WCHAR **pType,
1269 int *pTypeLength)
1270{
1272
1273 FIXME("(%p)->(%d) stub\n", This, nIndex);
1274 return E_NOTIMPL;
1275}
1276
1278 ISAXAttributes* iface,
1279 const WCHAR *pUri,
1280 int nUri,
1281 const WCHAR *pLocalName,
1282 int nLocalName,
1283 const WCHAR **pType,
1284 int *nType)
1285{
1287
1288 FIXME("(%p)->(%s, %d, %s, %d) stub\n", This, debugstr_w(pUri), nUri,
1289 debugstr_w(pLocalName), nLocalName);
1290 return E_NOTIMPL;
1291}
1292
1294 ISAXAttributes* iface,
1295 const WCHAR *pQName,
1296 int nQName,
1297 const WCHAR **pType,
1298 int *nType)
1299{
1301
1302 FIXME("(%p)->(%s, %d) stub\n", This, debugstr_w(pQName), nQName);
1303 return E_NOTIMPL;
1304}
1305
1307 ISAXAttributes* iface,
1308 int index,
1309 const WCHAR **value,
1310 int *nValue)
1311{
1313 TRACE("(%p)->(%d)\n", This, index);
1314
1316 if(!value || !nValue) return E_POINTER;
1317
1318 *nValue = SysStringLen(This->attributes[index].szValue);
1319 *value = This->attributes[index].szValue;
1320
1321 TRACE("(%s:%d)\n", debugstr_w(*value), *nValue);
1322
1323 return S_OK;
1324}
1325
1327 ISAXAttributes* iface,
1328 const WCHAR *pUri,
1329 int nUri,
1330 const WCHAR *pLocalName,
1331 int nLocalName,
1332 const WCHAR **pValue,
1333 int *nValue)
1334{
1335 HRESULT hr;
1336 int index;
1338 TRACE("(%p)->(%s, %d, %s, %d)\n", This, debugstr_w(pUri), nUri,
1339 debugstr_w(pLocalName), nLocalName);
1340
1341 hr = ISAXAttributes_getIndexFromName(iface,
1342 pUri, nUri, pLocalName, nLocalName, &index);
1343 if(hr==S_OK) hr = ISAXAttributes_getValue(iface, index, pValue, nValue);
1344
1345 return hr;
1346}
1347
1349 ISAXAttributes* iface,
1350 const WCHAR *pQName,
1351 int nQName,
1352 const WCHAR **pValue,
1353 int *nValue)
1354{
1355 HRESULT hr;
1356 int index;
1358 TRACE("(%p)->(%s, %d)\n", This, debugstr_w(pQName), nQName);
1359
1360 hr = ISAXAttributes_getIndexFromQName(iface, pQName, nQName, &index);
1361 if(hr==S_OK) hr = ISAXAttributes_getValue(iface, index, pValue, nValue);
1362
1363 return hr;
1364}
1365
1366static const struct ISAXAttributesVtbl isaxattributes_vtbl =
1367{
1384};
1385
1386/* Libxml2 escapes '&' back to char reference '&#38;' in attribute value,
1387 so when document has escaped value with '&amp;' it's parsed to '&' and then
1388 escaped to '&#38;'. This function takes care of ampersands only. */
1390{
1391 static const WCHAR ampescW[] = {'&','#','3','8',';',0};
1392 WCHAR *dest, *ptrW, *str;
1393 DWORD str_len;
1394 BSTR bstr;
1395
1396 if (!buf)
1397 return NULL;
1398
1400 if (len != -1) str_len++;
1401
1402 str = malloc(str_len * sizeof(WCHAR));
1403 if (!str) return NULL;
1404
1406 if (len != -1) str[str_len-1] = 0;
1407
1408 ptrW = str;
1409 while ((dest = wcsstr(ptrW, ampescW)))
1410 {
1411 WCHAR *src;
1412
1413 /* leave first '&' from a reference as a value */
1414 src = dest + ARRAY_SIZE(ampescW) - 1;
1415 dest++;
1416
1417 /* move together with null terminator */
1418 memmove(dest, src, (lstrlenW(src) + 1)*sizeof(WCHAR));
1419
1420 ptrW++;
1421 }
1422
1423 bstr = SysAllocString(str);
1424 free(str);
1425
1426 return bstr;
1427}
1428
1430{
1431 int i;
1432
1433 for (i = 0; i < locator->attr_count; i++)
1434 {
1435 SysFreeString(locator->attributes[i].szLocalname);
1436 locator->attributes[i].szLocalname = NULL;
1437
1438 SysFreeString(locator->attributes[i].szValue);
1439 locator->attributes[i].szValue = NULL;
1440
1441 SysFreeString(locator->attributes[i].szQName);
1442 locator->attributes[i].szQName = NULL;
1443 }
1444}
1445
1447 int nb_namespaces, const xmlChar **xmlNamespaces,
1448 int nb_attributes, const xmlChar **xmlAttributes)
1449{
1450 static const xmlChar xmlns[] = "xmlns";
1451 static const WCHAR xmlnsW[] = { 'x','m','l','n','s',0 };
1452
1453 struct _attributes *attrs;
1454 int i;
1455
1456 /* skip namespace definitions */
1457 if ((locator->saxreader->features & NamespacePrefixes) == 0)
1458 nb_namespaces = 0;
1459
1460 locator->attr_count = nb_namespaces + nb_attributes;
1461 if(locator->attr_count > locator->attr_alloc_count)
1462 {
1463 int new_size = locator->attr_count * 2;
1464 attrs = realloc(locator->attributes, new_size * sizeof(*locator->attributes));
1465 if(!attrs)
1466 {
1468 locator->attr_count = 0;
1469 return E_OUTOFMEMORY;
1470 }
1471 memset(attrs + locator->attr_alloc_count, 0,
1472 (new_size - locator->attr_alloc_count) * sizeof(*locator->attributes));
1473 locator->attributes = attrs;
1474 locator->attr_alloc_count = new_size;
1475 }
1476 else
1477 {
1478 attrs = locator->attributes;
1479 }
1480
1481 for (i = 0; i < nb_namespaces; i++)
1482 {
1483 SysFreeString(attrs[nb_attributes+i].szLocalname);
1484 attrs[nb_attributes+i].szLocalname = SysAllocStringLen(NULL, 0);
1485
1486 attrs[nb_attributes+i].szURI = locator->namespaceUri;
1487
1488 SysFreeString(attrs[nb_attributes+i].szValue);
1489 attrs[nb_attributes+i].szValue = bstr_from_xmlChar(xmlNamespaces[2*i+1]);
1490
1491 SysFreeString(attrs[nb_attributes+i].szQName);
1492 if(!xmlNamespaces[2*i])
1493 attrs[nb_attributes+i].szQName = SysAllocString(xmlnsW);
1494 else
1495 attrs[nb_attributes+i].szQName = QName_from_xmlChar(xmlns, xmlNamespaces[2*i]);
1496 }
1497
1498 for (i = 0; i < nb_attributes; i++)
1499 {
1500 static const xmlChar xmlA[] = "xml";
1501
1502 if (xmlStrEqual(xmlAttributes[i*5+1], xmlA))
1503 attrs[i].szURI = bstr_from_xmlChar(xmlAttributes[i*5+2]);
1504 else
1505 /* that's an important feature to keep same uri pointer for every reported attribute */
1506 attrs[i].szURI = find_element_uri(locator, xmlAttributes[i*5+2]);
1507
1508 SysFreeString(attrs[i].szLocalname);
1509 attrs[i].szLocalname = bstr_from_xmlChar(xmlAttributes[i*5]);
1510
1511 SysFreeString(attrs[i].szValue);
1512 attrs[i].szValue = saxreader_get_unescaped_value(xmlAttributes[i*5+3], xmlAttributes[i*5+4]-xmlAttributes[i*5+3]);
1513
1514 SysFreeString(attrs[i].szQName);
1515 attrs[i].szQName = QName_from_xmlChar(xmlAttributes[i*5+1], xmlAttributes[i*5]);
1516 }
1517
1518 return S_OK;
1519}
1520
1521/*** LibXML callbacks ***/
1522static void libxmlStartDocument(void *ctx)
1523{
1524 saxlocator *This = ctx;
1526 HRESULT hr;
1527
1528 if (This->saxreader->version >= MSXML4)
1529 {
1530 const xmlChar *p = This->pParserCtxt->input->cur-1;
1532 while(p>This->pParserCtxt->input->base && *p!='>')
1533 {
1534 if(*p=='\n' || (*p=='\r' && *(p+1)!='\n'))
1535 This->line--;
1536 p--;
1537 }
1538 This->column = 0;
1539 for(; p>=This->pParserCtxt->input->base && *p!='\n' && *p!='\r'; p--)
1540 This->column++;
1541 }
1542
1543 /* store version value, declaration has to contain version attribute */
1544 if (This->pParserCtxt->standalone != -1)
1545 {
1546 SysFreeString(This->saxreader->xmldecl_version);
1547 This->saxreader->xmldecl_version = bstr_from_xmlChar(This->pParserCtxt->version);
1548 }
1549
1551 {
1552 if(This->vbInterface)
1553 hr = IVBSAXContentHandler_startDocument(handler->vbhandler);
1554 else
1555 hr = ISAXContentHandler_startDocument(handler->handler);
1556
1559 }
1560}
1561
1562static void libxmlEndDocument(void *ctx)
1563{
1564 saxlocator *This = ctx;
1566 HRESULT hr;
1567
1568 if (This->saxreader->version >= MSXML4) {
1570 if(This->column > 1)
1571 This->line++;
1572 This->column = 0;
1573 } else {
1574 This->column = 0;
1575 This->line = 0;
1576 }
1577
1578 if(This->ret != S_OK) return;
1579
1581 {
1582 if(This->vbInterface)
1583 hr = IVBSAXContentHandler_endDocument(handler->vbhandler);
1584 else
1585 hr = ISAXContentHandler_endDocument(handler->handler);
1586
1589 }
1590}
1591
1593 void *ctx,
1594 const xmlChar *localname,
1595 const xmlChar *prefix,
1596 const xmlChar *URI,
1597 int nb_namespaces,
1598 const xmlChar **namespaces,
1599 int nb_attributes,
1600 int nb_defaulted,
1601 const xmlChar **attributes)
1602{
1603 saxlocator *This = ctx;
1606 HRESULT hr = S_OK;
1607 BSTR uri;
1608
1610 if(*(This->pParserCtxt->input->cur) == '/')
1611 This->column++;
1612 if(This->saxreader->version < MSXML4)
1613 This->column++;
1614
1615 element = alloc_element_entry(localname, prefix, nb_namespaces, namespaces);
1617
1618 if (is_namespaces_enabled(This->saxreader))
1619 {
1620 int i;
1621
1622 for (i = 0; i < nb_namespaces && saxreader_has_handler(This, SAXContentHandler); i++)
1623 {
1624 if (This->vbInterface)
1625 hr = IVBSAXContentHandler_startPrefixMapping(
1626 handler->vbhandler,
1627 &element->ns[i].prefix,
1628 &element->ns[i].uri);
1629 else
1630 hr = ISAXContentHandler_startPrefixMapping(
1631 handler->handler,
1632 element->ns[i].prefix,
1633 SysStringLen(element->ns[i].prefix),
1634 element->ns[i].uri,
1635 SysStringLen(element->ns[i].uri));
1636
1638 {
1640 return;
1641 }
1642 }
1643 }
1644
1645 uri = find_element_uri(This, URI);
1646 hr = SAXAttributes_populate(This, nb_namespaces, namespaces, nb_attributes, attributes);
1648 {
1649 BSTR local;
1650
1651 if (is_namespaces_enabled(This->saxreader))
1652 local = element->local;
1653 else
1654 uri = local = NULL;
1655
1656 if (This->vbInterface)
1657 hr = IVBSAXContentHandler_startElement(handler->vbhandler,
1658 &uri, &local, &element->qname, &This->IVBSAXAttributes_iface);
1659 else
1660 hr = ISAXContentHandler_startElement(handler->handler,
1664 &This->ISAXAttributes_iface);
1665
1668 }
1669}
1670
1672 void *ctx,
1673 const xmlChar *localname,
1674 const xmlChar *prefix,
1675 const xmlChar *URI)
1676{
1677 saxlocator *This = ctx;
1680 const xmlChar *p;
1681 BSTR uri, local;
1682 HRESULT hr;
1683
1685 p = This->pParserCtxt->input->cur;
1686
1687 if (This->saxreader->version >= MSXML4)
1688 {
1689 p--;
1690 while(p>This->pParserCtxt->input->base && *p!='>')
1691 {
1692 if(*p=='\n' || (*p=='\r' && *(p+1)!='\n'))
1693 This->line--;
1694 p--;
1695 }
1696 }
1697 else if(*(p-1)!='>' || *(p-2)!='/')
1698 {
1699 p--;
1700 while(p-2>=This->pParserCtxt->input->base
1701 && *(p-2)!='<' && *(p-1)!='/')
1702 {
1703 if(*p=='\n' || (*p=='\r' && *(p+1)!='\n'))
1704 This->line--;
1705 p--;
1706 }
1707 }
1708 This->column = 0;
1709 for(; p>=This->pParserCtxt->input->base && *p!='\n' && *p!='\r'; p--)
1710 This->column++;
1711
1712 uri = find_element_uri(This, URI);
1714
1716 {
1718 This->attr_count = 0;
1720 return;
1721 }
1722
1723 if (is_namespaces_enabled(This->saxreader))
1724 local = element->local;
1725 else
1726 uri = local = NULL;
1727
1728 if (This->vbInterface)
1729 hr = IVBSAXContentHandler_endElement(
1730 handler->vbhandler,
1731 &uri, &local, &element->qname);
1732 else
1733 hr = ISAXContentHandler_endElement(
1734 handler->handler,
1738
1740 This->attr_count = 0;
1741
1743 {
1746 return;
1747 }
1748
1749 if (is_namespaces_enabled(This->saxreader))
1750 {
1751 int i = -1;
1753 {
1754 if (This->vbInterface)
1755 hr = IVBSAXContentHandler_endPrefixMapping(
1756 handler->vbhandler, &element->ns[i].prefix);
1757 else
1758 hr = ISAXContentHandler_endPrefixMapping(
1759 handler->handler, element->ns[i].prefix, SysStringLen(element->ns[i].prefix));
1760
1761 if (sax_callback_failed(This, hr)) break;
1762 }
1763
1766 }
1767
1769}
1770
1772 void *ctx,
1773 const xmlChar *ch,
1774 int len)
1775{
1776 saxlocator *This = ctx;
1777 BSTR Chars;
1778 HRESULT hr;
1779 xmlChar *cur, *end;
1780 BOOL lastEvent = FALSE;
1781
1783
1785 cur = (xmlChar*)This->pParserCtxt->input->cur;
1786 while(cur>=This->pParserCtxt->input->base && *cur!='>')
1787 {
1788 if(*cur=='\n' || (*cur=='\r' && *(cur+1)!='\n'))
1789 This->line--;
1790 cur--;
1791 }
1792 This->column = 1;
1793 for(; cur>=This->pParserCtxt->input->base && *cur!='\n' && *cur!='\r'; cur--)
1794 This->column++;
1795
1796 cur = (xmlChar*)ch;
1797 if(*(ch-1)=='\r') cur--;
1798 end = cur;
1799
1800 while(1)
1801 {
1802 while(end-ch<len && *end!='\r') end++;
1803 if(end-ch==len)
1804 {
1805 lastEvent = TRUE;
1806 }
1807 else
1808 {
1809 *end = '\n';
1810 end++;
1811 }
1812
1813 if (This->saxreader->version >= MSXML4)
1814 {
1815 xmlChar *p;
1816
1817 for(p=cur; p!=end; p++)
1818 {
1819 if(*p=='\n')
1820 {
1821 This->line++;
1822 This->column = 1;
1823 }
1824 else
1825 {
1826 This->column++;
1827 }
1828 }
1829
1830 if(!lastEvent)
1831 This->column = 0;
1832 }
1833
1834 Chars = pooled_bstr_from_xmlCharN(&This->saxreader->pool, cur, end-cur);
1836
1838 {
1840 return;
1841 }
1842
1843 if (This->saxreader->version < MSXML4)
1844 This->column += end-cur;
1845
1846 if(lastEvent)
1847 break;
1848
1849 *(end-1) = '\r';
1850 if(*end == '\n')
1851 {
1852 end++;
1853 This->column++;
1854 }
1855 cur = end;
1856
1857 if(end-ch == len) break;
1858 }
1859}
1860
1862 void *ctx,
1863 xmlSAXLocatorPtr loc)
1864{
1865 saxlocator *This = ctx;
1867 HRESULT hr = S_OK;
1868
1870 {
1871 if(This->vbInterface)
1872 hr = IVBSAXContentHandler_putref_documentLocator(handler->vbhandler,
1873 &This->IVBSAXLocator_iface);
1874 else
1875 hr = ISAXContentHandler_putDocumentLocator(handler->handler, &This->ISAXLocator_iface);
1876 }
1877
1878 if(FAILED(hr))
1880}
1881
1882static void libxmlComment(void *ctx, const xmlChar *value)
1883{
1884 saxlocator *This = ctx;
1886 BSTR bValue;
1887 HRESULT hr;
1888 const xmlChar *p = This->pParserCtxt->input->cur;
1889
1891 while(p-4>=This->pParserCtxt->input->base
1892 && memcmp(p-4, "<!--", sizeof(char[4])))
1893 {
1894 if(*p=='\n' || (*p=='\r' && *(p+1)!='\n'))
1895 This->line--;
1896 p--;
1897 }
1898
1899 This->column = 0;
1900 for(; p>=This->pParserCtxt->input->base && *p!='\n' && *p!='\r'; p--)
1901 This->column++;
1902
1904
1905 bValue = pooled_bstr_from_xmlChar(&This->saxreader->pool, value);
1906
1907 if (This->vbInterface)
1908 hr = IVBSAXLexicalHandler_comment(handler->vbhandler, &bValue);
1909 else
1910 hr = ISAXLexicalHandler_comment(handler->handler, bValue, SysStringLen(bValue));
1911
1912 if(FAILED(hr))
1914}
1915
1916static void WINAPIV libxmlFatalError(void *ctx, const char *msg, ...)
1917{
1918 saxlocator *This = ctx;
1920 char message[1024];
1921 WCHAR *error;
1922 DWORD len;
1923 va_list args;
1924
1925 if(This->ret != S_OK) {
1926 xmlStopParser(This->pParserCtxt);
1927 return;
1928 }
1929
1930 va_start(args, msg);
1932 va_end(args);
1933
1935 error = malloc(sizeof(WCHAR) * len);
1936 if(error)
1937 {
1939 TRACE("fatal error for %p: %s\n", This, debugstr_w(error));
1940 }
1941
1943 {
1944 xmlStopParser(This->pParserCtxt);
1945 This->ret = E_FAIL;
1946 free(error);
1947 return;
1948 }
1949
1950 FIXME("Error handling is not compatible.\n");
1951
1952 if(This->vbInterface)
1953 {
1954 BSTR bstrError = SysAllocString(error);
1955 IVBSAXErrorHandler_fatalError(handler->vbhandler, &This->IVBSAXLocator_iface,
1956 &bstrError, E_FAIL);
1957 SysFreeString(bstrError);
1958 }
1959 else
1960 ISAXErrorHandler_fatalError(handler->handler, &This->ISAXLocator_iface, error, E_FAIL);
1961
1962 free(error);
1963
1964 xmlStopParser(This->pParserCtxt);
1965 This->ret = E_FAIL;
1966}
1967
1968/* The only reason this helper exists is that CDATA section are reported by chunks,
1969 newlines are used as delimiter. More than that, reader even alters input data before reporting.
1970
1971 This helper should be called for substring with trailing newlines.
1972*/
1974{
1975 BSTR bstr = bstr_from_xmlCharN(str, len), ret;
1976 WCHAR *ptr;
1977
1978 len = SysStringLen(bstr);
1979 ptr = bstr + len - 1;
1980 while ((*ptr == '\r' || *ptr == '\n') && ptr >= bstr)
1981 ptr--;
1982
1983 while (*++ptr)
1984 {
1985 /* replace returns as:
1986
1987 - "\r<char>" -> "\n<char>"
1988 - "\r\r" -> "\r"
1989 - "\r\n" -> "\n"
1990 */
1991 if (*ptr == '\r')
1992 {
1993 if (*(ptr+1) == '\r' || *(ptr+1) == '\n')
1994 {
1995 /* shift tail */
1996 memmove(ptr, ptr+1, len-- - (ptr-bstr));
1997 }
1998 else
1999 *ptr = '\n';
2000 }
2001 }
2002
2003 ret = SysAllocStringLen(bstr, len);
2004 SysFreeString(bstr);
2005 return ret;
2006}
2007
2008static void libxml_cdatablock(void *ctx, const xmlChar *value, int len)
2009{
2010 const xmlChar *start, *end;
2012 struct saxlexicalhandler_iface *lexical = saxreader_get_lexicalhandler(locator->saxreader);
2013 HRESULT hr = S_OK;
2014 BSTR chars;
2015 int i;
2016
2019 {
2020 if (locator->vbInterface)
2021 hr = IVBSAXLexicalHandler_startCDATA(lexical->vbhandler);
2022 else
2023 hr = ISAXLexicalHandler_startCDATA(lexical->handler);
2024 }
2025
2026 if(FAILED(hr))
2027 {
2029 return;
2030 }
2031
2032 start = value;
2033 end = NULL;
2034 i = 0;
2035
2036 while (i < len)
2037 {
2038 /* scan for newlines */
2039 if (value[i] == '\r' || value[i] == '\n')
2040 {
2041 /* skip newlines/linefeeds */
2042 while (i < len)
2043 {
2044 if (value[i] != '\r' && value[i] != '\n') break;
2045 i++;
2046 }
2047 end = &value[i];
2048
2049 /* report */
2051 TRACE("(chunk %s)\n", debugstr_w(chars));
2053 SysFreeString(chars);
2054
2055 start = &value[i];
2056 end = NULL;
2057 }
2058 i++;
2059 locator->column++;
2060 }
2061
2062 /* no newline chars (or last chunk) report as a whole */
2063 if (!end && start == value)
2064 {
2065 /* report */
2067 TRACE("(%s)\n", debugstr_w(chars));
2069 SysFreeString(chars);
2070 }
2071
2073 {
2074 if (locator->vbInterface)
2075 hr = IVBSAXLexicalHandler_endCDATA(lexical->vbhandler);
2076 else
2077 hr = ISAXLexicalHandler_endCDATA(lexical->handler);
2078 }
2079
2080 if(FAILED(hr))
2082}
2083
2084static xmlParserInputPtr libxmlresolveentity(void *ctx, const xmlChar *publicid, const xmlChar *systemid)
2085{
2086 FIXME("entity resolving not implemented, %s, %s\n", publicid, systemid);
2087 return xmlSAX2ResolveEntity(ctx, publicid, systemid);
2088}
2089
2090/*** IVBSAXLocator interface ***/
2091/*** IUnknown methods ***/
2092static HRESULT WINAPI ivbsaxlocator_QueryInterface(IVBSAXLocator* iface, REFIID riid, void **ppvObject)
2093{
2095
2096 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject);
2097
2098 *ppvObject = NULL;
2099
2100 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
2102 IsEqualGUID( riid, &IID_IVBSAXLocator ))
2103 {
2104 *ppvObject = iface;
2105 }
2106 else if ( IsEqualGUID( riid, &IID_IVBSAXAttributes ))
2107 {
2108 *ppvObject = &This->IVBSAXAttributes_iface;
2109 }
2110 else
2111 {
2112 FIXME("interface %s not implemented\n", debugstr_guid(riid));
2113 return E_NOINTERFACE;
2114 }
2115
2116 IVBSAXLocator_AddRef( iface );
2117
2118 return S_OK;
2119}
2120
2121static ULONG WINAPI ivbsaxlocator_AddRef(IVBSAXLocator* iface)
2122{
2124 TRACE("%p\n", This );
2125 return ISAXLocator_AddRef(&This->ISAXLocator_iface);
2126}
2127
2128static ULONG WINAPI ivbsaxlocator_Release(IVBSAXLocator* iface)
2129{
2131 return ISAXLocator_Release(&This->ISAXLocator_iface);
2132}
2133
2134/*** IDispatch methods ***/
2135static HRESULT WINAPI ivbsaxlocator_GetTypeInfoCount( IVBSAXLocator *iface, UINT* pctinfo )
2136{
2138
2139 TRACE("(%p)->(%p)\n", This, pctinfo);
2140
2141 *pctinfo = 1;
2142
2143 return S_OK;
2144}
2145
2147 IVBSAXLocator *iface,
2148 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
2149{
2150 TRACE("%p, %u, %lx, %p.\n", iface, iTInfo, lcid, ppTInfo);
2151
2152 return get_typeinfo(IVBSAXLocator_tid, ppTInfo);
2153}
2154
2156 IVBSAXLocator *iface,
2157 REFIID riid,
2158 LPOLESTR* rgszNames,
2159 UINT cNames,
2160 LCID lcid,
2161 DISPID* rgDispId)
2162{
2164 HRESULT hr;
2165
2166 TRACE("%p, %s, %p, %u, %lx, %p.\n", iface, debugstr_guid(riid), rgszNames, cNames,
2167 lcid, rgDispId);
2168
2169 if(!rgszNames || cNames == 0 || !rgDispId)
2170 return E_INVALIDARG;
2171
2173 if(SUCCEEDED(hr))
2174 {
2175 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
2176 ITypeInfo_Release(typeinfo);
2177 }
2178
2179 return hr;
2180}
2181
2183 IVBSAXLocator *iface,
2184 DISPID dispIdMember,
2185 REFIID riid,
2186 LCID lcid,
2187 WORD wFlags,
2188 DISPPARAMS* pDispParams,
2189 VARIANT* pVarResult,
2190 EXCEPINFO* pExcepInfo,
2191 UINT* puArgErr)
2192{
2194 HRESULT hr;
2195
2196 TRACE("%p, %ld, %s, %lx, %d, %p, %p, %p, %p.\n", iface, dispIdMember, debugstr_guid(riid),
2197 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
2198
2200 if(SUCCEEDED(hr))
2201 {
2202 hr = ITypeInfo_Invoke(typeinfo, iface, dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
2203 ITypeInfo_Release(typeinfo);
2204 }
2205
2206 return hr;
2207}
2208
2209/*** IVBSAXLocator methods ***/
2211 IVBSAXLocator* iface,
2212 int *pnColumn)
2213{
2215 return ISAXLocator_getColumnNumber(&This->ISAXLocator_iface, pnColumn);
2216}
2217
2219 IVBSAXLocator* iface,
2220 int *pnLine)
2221{
2223 return ISAXLocator_getLineNumber(&This->ISAXLocator_iface, pnLine);
2224}
2225
2226static HRESULT WINAPI ivbsaxlocator_get_publicId(IVBSAXLocator* iface, BSTR *ret)
2227{
2229 const WCHAR *publicidW;
2230 HRESULT hr;
2231
2232 TRACE("(%p)->(%p)\n", This, ret);
2233
2234 if (!ret)
2235 return E_POINTER;
2236
2237 *ret = NULL;
2238 hr = ISAXLocator_getPublicId(&This->ISAXLocator_iface, &publicidW);
2239 if (FAILED(hr))
2240 return hr;
2241
2242 return return_bstr(publicidW, ret);
2243}
2244
2245static HRESULT WINAPI ivbsaxlocator_get_systemId(IVBSAXLocator* iface, BSTR *ret)
2246{
2248 const WCHAR *systemidW;
2249 HRESULT hr;
2250
2251 TRACE("(%p)->(%p)\n", This, ret);
2252
2253 if (!ret)
2254 return E_POINTER;
2255
2256 *ret = NULL;
2257 hr = ISAXLocator_getSystemId(&This->ISAXLocator_iface, &systemidW);
2258 if (FAILED(hr))
2259 return hr;
2260
2261 return return_bstr(systemidW, ret);
2262}
2263
2264static const struct IVBSAXLocatorVtbl VBSAXLocatorVtbl =
2265{
2277};
2278
2279/*** ISAXLocator interface ***/
2280/*** IUnknown methods ***/
2281static HRESULT WINAPI isaxlocator_QueryInterface(ISAXLocator* iface, REFIID riid, void **ppvObject)
2282{
2284
2285 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
2286
2287 *ppvObject = NULL;
2288
2289 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
2290 IsEqualGUID( riid, &IID_ISAXLocator ))
2291 {
2292 *ppvObject = iface;
2293 }
2294 else if ( IsEqualGUID( riid, &IID_ISAXAttributes ))
2295 {
2296 *ppvObject = &This->ISAXAttributes_iface;
2297 }
2298 else
2299 {
2300 WARN("interface %s not implemented\n", debugstr_guid(riid));
2301 return E_NOINTERFACE;
2302 }
2303
2304 ISAXLocator_AddRef( iface );
2305
2306 return S_OK;
2307}
2308
2309static ULONG WINAPI isaxlocator_AddRef(ISAXLocator* iface)
2310{
2313 TRACE("%p, refcount %lu.\n", iface, ref);
2314 return ref;
2315}
2316
2318 ISAXLocator* iface)
2319{
2322
2323 TRACE("%p, refcount %ld.\n", iface, ref );
2324
2325 if (!ref)
2326 {
2327 element_entry *element, *element2;
2328 int index;
2329
2330 SysFreeString(This->publicId);
2331 SysFreeString(This->systemId);
2332 SysFreeString(This->namespaceUri);
2333
2334 for(index = 0; index < This->attr_alloc_count; index++)
2335 {
2336 SysFreeString(This->attributes[index].szLocalname);
2337 SysFreeString(This->attributes[index].szValue);
2338 SysFreeString(This->attributes[index].szQName);
2339 }
2340 free(This->attributes);
2341
2342 /* element stack */
2344 {
2347 }
2348
2349 ISAXXMLReader_Release(&This->saxreader->ISAXXMLReader_iface);
2350 free(This);
2351 }
2352
2353 return ref;
2354}
2355
2356/*** ISAXLocator methods ***/
2358 ISAXLocator* iface,
2359 int *pnColumn)
2360{
2362
2363 *pnColumn = This->column;
2364 return S_OK;
2365}
2366
2368 ISAXLocator* iface,
2369 int *pnLine)
2370{
2372
2373 *pnLine = This->line;
2374 return S_OK;
2375}
2376
2378 ISAXLocator* iface,
2379 const WCHAR ** ppwchPublicId)
2380{
2381 BSTR publicId;
2383
2384 SysFreeString(This->publicId);
2385
2386 publicId = bstr_from_xmlChar(xmlSAX2GetPublicId(This->pParserCtxt));
2387 if(SysStringLen(publicId))
2388 This->publicId = publicId;
2389 else
2390 {
2391 SysFreeString(publicId);
2392 This->publicId = NULL;
2393 }
2394
2395 *ppwchPublicId = This->publicId;
2396 return S_OK;
2397}
2398
2400 ISAXLocator* iface,
2401 const WCHAR ** ppwchSystemId)
2402{
2403 BSTR systemId;
2405
2406 SysFreeString(This->systemId);
2407
2408 systemId = bstr_from_xmlChar(xmlSAX2GetSystemId(This->pParserCtxt));
2409 if(SysStringLen(systemId))
2410 This->systemId = systemId;
2411 else
2412 {
2413 SysFreeString(systemId);
2414 This->systemId = NULL;
2415 }
2416
2417 *ppwchSystemId = This->systemId;
2418 return S_OK;
2419}
2420
2421static const struct ISAXLocatorVtbl SAXLocatorVtbl =
2422{
2430};
2431
2432static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, BOOL vbInterface)
2433{
2434 static const WCHAR w3xmlns[] = { 'h','t','t','p',':','/','/', 'w','w','w','.','w','3','.',
2435 'o','r','g','/','2','0','0','0','/','x','m','l','n','s','/',0 };
2436
2438
2439 locator = malloc(sizeof(*locator));
2440 if( !locator )
2441 return E_OUTOFMEMORY;
2442
2443 locator->IVBSAXLocator_iface.lpVtbl = &VBSAXLocatorVtbl;
2444 locator->ISAXLocator_iface.lpVtbl = &SAXLocatorVtbl;
2445 locator->IVBSAXAttributes_iface.lpVtbl = &ivbsaxattributes_vtbl;
2446 locator->ISAXAttributes_iface.lpVtbl = &isaxattributes_vtbl;
2447 locator->ref = 1;
2448 locator->vbInterface = vbInterface;
2449
2450 locator->saxreader = reader;
2451 ISAXXMLReader_AddRef(&reader->ISAXXMLReader_iface);
2452
2453 locator->pParserCtxt = NULL;
2454 locator->publicId = NULL;
2455 locator->systemId = NULL;
2456 locator->line = reader->version < MSXML4 ? 0 : 1;
2457 locator->column = 0;
2458 locator->ret = S_OK;
2459 if (locator->saxreader->version >= MSXML6)
2460 locator->namespaceUri = SysAllocString(w3xmlns);
2461 else
2462 locator->namespaceUri = SysAllocStringLen(NULL, 0);
2463 if(!locator->namespaceUri)
2464 {
2465 ISAXXMLReader_Release(&reader->ISAXXMLReader_iface);
2466 free(locator);
2467 return E_OUTOFMEMORY;
2468 }
2469
2470 locator->attr_alloc_count = 8;
2471 locator->attr_count = 0;
2472 locator->attributes = calloc(locator->attr_alloc_count, sizeof(*locator->attributes));
2473 if(!locator->attributes)
2474 {
2475 ISAXXMLReader_Release(&reader->ISAXXMLReader_iface);
2476 SysFreeString(locator->namespaceUri);
2477 free(locator);
2478 return E_OUTOFMEMORY;
2479 }
2480
2481 list_init(&locator->elements);
2482
2483 *ppsaxlocator = locator;
2484
2485 TRACE("returning %p\n", *ppsaxlocator);
2486
2487 return S_OK;
2488}
2489
2490/*** SAXXMLReader internal functions ***/
2491static HRESULT internal_parseBuffer(saxreader *This, const char *buffer, int size, BOOL vbInterface)
2492{
2496 HRESULT hr;
2497
2498 TRACE("(%p)->(%p %d)\n", This, buffer, size);
2499
2500 hr = SAXLocator_create(This, &locator, vbInterface);
2501 if (FAILED(hr))
2502 return hr;
2503
2504 if (size >= 4)
2505 {
2506 encoding = xmlDetectCharEncoding((xmlChar*)buffer, 4);
2508 TRACE("detected encoding: %s\n", enc_name);
2509 }
2510
2511 /* if libxml2 detection failed try to guess */
2512 if (encoding == XML_CHAR_ENCODING_NONE)
2513 {
2514 const WCHAR *ptr = (WCHAR*)buffer;
2515 /* an xml declaration with optional encoding will still be handled by the parser */
2516 if ((size >= 2) && *ptr == '<' && ptr[1] != '?')
2517 {
2519 encoding = XML_CHAR_ENCODING_UTF16LE;
2520 }
2521 }
2522 else if (encoding == XML_CHAR_ENCODING_UTF8)
2524 else
2525 enc_name = NULL;
2526
2528 if (!locator->pParserCtxt)
2529 {
2530 ISAXLocator_Release(&locator->ISAXLocator_iface);
2531 return E_FAIL;
2532 }
2533
2534 if (enc_name)
2535 {
2536 locator->pParserCtxt->encoding = xmlStrdup(enc_name);
2537 if (encoding == XML_CHAR_ENCODING_UTF16LE) {
2538 TRACE("switching to %s\n", enc_name);
2539 xmlSwitchEncoding(locator->pParserCtxt, encoding);
2540 }
2541 }
2542
2543 xmlFree(locator->pParserCtxt->sax);
2544 locator->pParserCtxt->sax = &locator->saxreader->sax;
2545 locator->pParserCtxt->userData = locator;
2546
2547 This->isParsing = TRUE;
2548 if(xmlParseDocument(locator->pParserCtxt) == -1 && locator->ret == S_OK)
2549 hr = E_FAIL;
2550 else
2551 hr = locator->ret;
2552 This->isParsing = FALSE;
2553
2554 if(locator->pParserCtxt)
2555 {
2556 locator->pParserCtxt->sax = NULL;
2557 xmlFreeParserCtxt(locator->pParserCtxt);
2558 locator->pParserCtxt = NULL;
2559 }
2560
2561 ISAXLocator_Release(&locator->ISAXLocator_iface);
2562 return hr;
2563}
2564
2566{
2568 HRESULT hr;
2569 ULONG dataRead;
2570 char data[2048];
2571 int ret;
2572
2573 dataRead = 0;
2574 hr = ISequentialStream_Read(stream, data, sizeof(data), &dataRead);
2575 if(FAILED(hr)) return hr;
2576
2577 hr = SAXLocator_create(This, &locator, vbInterface);
2578 if(FAILED(hr)) return hr;
2579
2580 locator->pParserCtxt = xmlCreatePushParserCtxt(
2581 &locator->saxreader->sax, locator,
2582 data, dataRead, NULL);
2583 if(!locator->pParserCtxt)
2584 {
2585 ISAXLocator_Release(&locator->ISAXLocator_iface);
2586 return E_FAIL;
2587 }
2588
2589 This->isParsing = TRUE;
2590
2591 do {
2592 dataRead = 0;
2593 hr = ISequentialStream_Read(stream, data, sizeof(data), &dataRead);
2594 if (FAILED(hr) || !dataRead) break;
2595
2596 ret = xmlParseChunk(locator->pParserCtxt, data, dataRead, 0);
2597 hr = ret!=XML_ERR_OK && locator->ret==S_OK ? E_FAIL : locator->ret;
2598 }while(hr == S_OK);
2599
2600 if(SUCCEEDED(hr))
2601 {
2602 ret = xmlParseChunk(locator->pParserCtxt, data, 0, 1);
2603 hr = ret!=XML_ERR_OK && locator->ret==S_OK ? E_FAIL : locator->ret;
2604 }
2605
2606
2607 This->isParsing = FALSE;
2608
2609 xmlFreeParserCtxt(locator->pParserCtxt);
2610 locator->pParserCtxt = NULL;
2611 ISAXLocator_Release(&locator->ISAXLocator_iface);
2612 return hr;
2613}
2614
2616 saxreader* This,
2617 VARIANT varInput,
2618 BOOL vbInterface)
2619{
2620 HRESULT hr;
2621
2622 TRACE("(%p)->(%s)\n", This, debugstr_variant(&varInput));
2623
2624 /* Dispose of the BSTRs in the pool from a prior run, if any. */
2625 free_bstr_pool(&This->pool);
2626
2627 switch(V_VT(&varInput))
2628 {
2629 case VT_BSTR:
2630 case VT_BSTR|VT_BYREF:
2631 {
2632 BSTR str = V_ISBYREF(&varInput) ? *V_BSTRREF(&varInput) : V_BSTR(&varInput);
2633 hr = internal_parseBuffer(This, (const char*)str, lstrlenW(str)*sizeof(WCHAR), vbInterface);
2634 break;
2635 }
2636 case VT_ARRAY|VT_UI1: {
2637 void *pSAData;
2638 LONG lBound, uBound;
2639 ULONG dataRead;
2640
2641 hr = SafeArrayGetLBound(V_ARRAY(&varInput), 1, &lBound);
2642 if(hr != S_OK) break;
2643 hr = SafeArrayGetUBound(V_ARRAY(&varInput), 1, &uBound);
2644 if(hr != S_OK) break;
2645 dataRead = (uBound-lBound)*SafeArrayGetElemsize(V_ARRAY(&varInput));
2646 hr = SafeArrayAccessData(V_ARRAY(&varInput), &pSAData);
2647 if(hr != S_OK) break;
2648 hr = internal_parseBuffer(This, pSAData, dataRead, vbInterface);
2649 SafeArrayUnaccessData(V_ARRAY(&varInput));
2650 break;
2651 }
2652 case VT_UNKNOWN:
2653 case VT_DISPATCH: {
2655 IXMLDOMDocument *xmlDoc;
2656
2657 if (!V_UNKNOWN(&varInput))
2658 return E_INVALIDARG;
2659
2660 if(IUnknown_QueryInterface(V_UNKNOWN(&varInput),
2661 &IID_IXMLDOMDocument, (void**)&xmlDoc) == S_OK)
2662 {
2663 BSTR bstrData;
2664
2665 IXMLDOMDocument_get_xml(xmlDoc, &bstrData);
2666 hr = internal_parseBuffer(This, (const char*)bstrData,
2667 SysStringByteLen(bstrData), vbInterface);
2668 IXMLDOMDocument_Release(xmlDoc);
2669 SysFreeString(bstrData);
2670 break;
2671 }
2672
2673 /* try base interface first */
2674 IUnknown_QueryInterface(V_UNKNOWN(&varInput), &IID_ISequentialStream, (void**)&stream);
2675 if (!stream)
2676 /* this should never happen if IStream is implemented properly, but just in case */
2677 IUnknown_QueryInterface(V_UNKNOWN(&varInput), &IID_IStream, (void**)&stream);
2678
2679 if(stream)
2680 {
2681 hr = internal_parseStream(This, stream, vbInterface);
2682 ISequentialStream_Release(stream);
2683 }
2684 else
2685 {
2686 WARN("IUnknown* input doesn't support any of expected interfaces\n");
2687 hr = E_INVALIDARG;
2688 }
2689
2690 break;
2691 }
2692 default:
2693 WARN("vt %d not implemented\n", V_VT(&varInput));
2694 hr = E_INVALIDARG;
2695 }
2696
2697 return hr;
2698}
2699
2701{
2702 saxreader *This = obj;
2703
2705}
2706
2708{
2709 saxreader *This = obj;
2710
2712}
2713
2715{
2716 IMoniker *mon;
2717 bsc_t *bsc;
2718 HRESULT hr;
2719
2720 TRACE("%p, %s.\n", reader, debugstr_w(url));
2721
2722 if (!url && reader->version < MSXML4)
2723 return E_INVALIDARG;
2724
2726 if(FAILED(hr))
2727 return hr;
2728
2729 if(vbInterface) hr = bind_url(mon, internal_vbonDataAvailable, reader, &bsc);
2731 IMoniker_Release(mon);
2732
2733 if(FAILED(hr))
2734 return hr;
2735
2736 return detach_bsc(bsc);
2737}
2738
2740{
2741 const IID *riid;
2742
2743 if (V_VT(v) == VT_EMPTY)
2744 return saxreader_put_handler(This, type, NULL, vb);
2745
2746 switch (type)
2747 {
2748 case SAXDeclHandler:
2749 riid = vb ? &IID_IVBSAXDeclHandler : &IID_ISAXDeclHandler;
2750 break;
2751 case SAXLexicalHandler:
2752 riid = vb ? &IID_IVBSAXLexicalHandler : &IID_ISAXLexicalHandler;
2753 break;
2754 default:
2755 ERR("wrong handler type %d\n", type);
2756 return E_FAIL;
2757 }
2758
2759 switch (V_VT(v))
2760 {
2761 case VT_DISPATCH:
2762 case VT_UNKNOWN:
2763 {
2765
2766 if (V_UNKNOWN(v))
2767 {
2768 HRESULT hr = IUnknown_QueryInterface(V_UNKNOWN(v), riid, (void**)&handler);
2769 if (FAILED(hr)) return hr;
2770 }
2771
2773 if (handler) IUnknown_Release(handler);
2774 break;
2775 }
2776 default:
2777 ERR("value type %d not supported\n", V_VT(v));
2778 return E_INVALIDARG;
2779 }
2780
2781 return S_OK;
2782}
2783
2785 saxreader* This,
2786 const WCHAR *prop,
2787 VARIANT value,
2788 BOOL vbInterface)
2789{
2790 VARIANT *v;
2791
2792 TRACE("(%p)->(%s %s)\n", This, debugstr_w(prop), debugstr_variant(&value));
2793
2794 if (This->isParsing) return E_FAIL;
2795
2799
2802
2804 {
2805 if (V_VT(v) == VT_I4 && V_I4(v) == 0) return S_OK;
2806 FIXME("(%p)->(%s): max-xml-size unsupported\n", This, debugstr_variant(v));
2807 return E_NOTIMPL;
2808 }
2809
2811 {
2812 if (V_VT(v) == VT_I4 && V_I4(v) == 0) return S_OK;
2813 FIXME("(%p)->(%s): max-element-depth unsupported\n", This, debugstr_variant(v));
2814 return E_NOTIMPL;
2815 }
2816
2817 FIXME("(%p)->(%s:%s): unsupported property\n", This, debugstr_w(prop), debugstr_variant(v));
2818
2819 if(!memcmp(prop, PropertyCharsetW, sizeof(PropertyCharsetW)))
2820 return E_NOTIMPL;
2821
2822 if(!memcmp(prop, PropertyDomNodeW, sizeof(PropertyDomNodeW)))
2823 return E_FAIL;
2824
2826 return E_NOTIMPL;
2827
2829 return E_NOTIMPL;
2830
2832 return E_FAIL;
2833
2835 return E_FAIL;
2836
2838 return E_FAIL;
2839
2840 return E_INVALIDARG;
2841}
2842
2844{
2845 TRACE("(%p)->(%s)\n", This, debugstr_w(prop));
2846
2847 if (!value) return E_POINTER;
2848
2850 {
2853 return S_OK;
2854 }
2855
2857 {
2860 return S_OK;
2861 }
2862
2864 {
2865 V_VT(value) = VT_BSTR;
2866 V_BSTR(value) = SysAllocString(This->xmldecl_version);
2867 return S_OK;
2868 }
2869
2870 FIXME("(%p)->(%s) unsupported property\n", This, debugstr_w(prop));
2871
2872 return E_NOTIMPL;
2873}
2874
2875/*** IVBSAXXMLReader interface ***/
2876/*** IUnknown methods ***/
2877static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID riid, void **ppvObject)
2878{
2880
2881 TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject );
2882
2883 *ppvObject = NULL;
2884
2885 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
2887 IsEqualGUID( riid, &IID_IVBSAXXMLReader ))
2888 {
2889 *ppvObject = iface;
2890 }
2891 else if( IsEqualGUID( riid, &IID_ISAXXMLReader ))
2892 {
2893 *ppvObject = &This->ISAXXMLReader_iface;
2894 }
2895 else if (dispex_query_interface(&This->dispex, riid, ppvObject))
2896 {
2897 return *ppvObject ? S_OK : E_NOINTERFACE;
2898 }
2899 else
2900 {
2901 FIXME("interface %s not implemented\n", debugstr_guid(riid));
2902 return E_NOINTERFACE;
2903 }
2904
2905 IVBSAXXMLReader_AddRef( iface );
2906
2907 return S_OK;
2908}
2909
2910static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader* iface)
2911{
2913 TRACE("%p\n", This );
2914 return InterlockedIncrement( &This->ref );
2915}
2916
2918 IVBSAXXMLReader* iface)
2919{
2921 LONG ref;
2922
2923 TRACE("%p\n", This );
2924
2925 ref = InterlockedDecrement( &This->ref );
2926 if ( ref == 0 )
2927 {
2928 int i;
2929
2930 for (i = 0; i < SAXHandler_Last; i++)
2931 {
2932 struct saxanyhandler_iface *saxiface = &This->saxhandlers[i].u.anyhandler;
2933
2934 if (saxiface->handler)
2935 IUnknown_Release(saxiface->handler);
2936
2937 if (saxiface->vbhandler)
2938 IUnknown_Release(saxiface->vbhandler);
2939 }
2940
2941 SysFreeString(This->xmldecl_version);
2942 free_bstr_pool(&This->pool);
2943
2944 free(This);
2945 }
2946
2947 return ref;
2948}
2949/*** IDispatch ***/
2950static HRESULT WINAPI saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader *iface, UINT* pctinfo )
2951{
2953 return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
2954}
2955
2957 IVBSAXXMLReader *iface,
2958 UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo )
2959{
2961 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface,
2962 iTInfo, lcid, ppTInfo);
2963}
2964
2966 IVBSAXXMLReader *iface,
2967 REFIID riid,
2968 LPOLESTR* rgszNames,
2969 UINT cNames,
2970 LCID lcid,
2971 DISPID* rgDispId)
2972{
2974 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface,
2975 riid, rgszNames, cNames, lcid, rgDispId);
2976}
2977
2979 IVBSAXXMLReader *iface,
2980 DISPID dispIdMember,
2981 REFIID riid,
2982 LCID lcid,
2983 WORD wFlags,
2984 DISPPARAMS* pDispParams,
2985 VARIANT* pVarResult,
2986 EXCEPINFO* pExcepInfo,
2987 UINT* puArgErr)
2988{
2990 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface,
2991 dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
2992}
2993
2994/*** IVBSAXXMLReader methods ***/
2996 IVBSAXXMLReader* iface,
2997 BSTR feature_name,
2999{
3001 return ISAXXMLReader_getFeature(&This->ISAXXMLReader_iface, feature_name, value);
3002}
3003
3005 IVBSAXXMLReader* iface,
3006 BSTR feature_name,
3008{
3010 return ISAXXMLReader_putFeature(&This->ISAXXMLReader_iface, feature_name, value);
3011}
3012
3014 IVBSAXXMLReader* iface,
3015 BSTR prop,
3016 VARIANT *value)
3017{
3019 return internal_getProperty(This, prop, value, TRUE);
3020}
3021
3023 IVBSAXXMLReader* iface,
3024 BSTR pProp,
3025 VARIANT value)
3026{
3028 return internal_putProperty(This, pProp, value, TRUE);
3029}
3030
3032 IVBSAXXMLReader* iface,
3033 IVBSAXEntityResolver **resolver)
3034{
3036 return saxreader_get_handler(This, SAXEntityResolver, TRUE, (void**)resolver);
3037}
3038
3040 IVBSAXXMLReader* iface,
3041 IVBSAXEntityResolver *resolver)
3042{
3045}
3046
3048 IVBSAXXMLReader* iface,
3049 IVBSAXContentHandler **handler)
3050{
3053}
3054
3056 IVBSAXXMLReader* iface,
3057 IVBSAXContentHandler *handler)
3058{
3061}
3062
3064 IVBSAXXMLReader* iface,
3065 IVBSAXDTDHandler **handler)
3066{
3069}
3070
3072 IVBSAXXMLReader* iface,
3073 IVBSAXDTDHandler *handler)
3074{
3077}
3078
3080 IVBSAXXMLReader* iface,
3081 IVBSAXErrorHandler **handler)
3082{
3085}
3086
3088 IVBSAXXMLReader* iface,
3089 IVBSAXErrorHandler *handler)
3090{
3093}
3094
3096 IVBSAXXMLReader* iface,
3097 BSTR *pBaseUrl)
3098{
3100
3101 FIXME("(%p)->(%p) stub\n", This, pBaseUrl);
3102 return E_NOTIMPL;
3103}
3104
3106 IVBSAXXMLReader* iface,
3107 BSTR pBaseUrl)
3108{
3110 return ISAXXMLReader_putBaseURL(&This->ISAXXMLReader_iface, pBaseUrl);
3111}
3112
3114 IVBSAXXMLReader* iface,
3115 BSTR *pSecureBaseUrl)
3116{
3118
3119 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
3120 return E_NOTIMPL;
3121}
3122
3124 IVBSAXXMLReader* iface,
3125 BSTR secureBaseUrl)
3126{
3128 return ISAXXMLReader_putSecureBaseURL(&This->ISAXXMLReader_iface, secureBaseUrl);
3129}
3130
3132 IVBSAXXMLReader* iface,
3133 VARIANT varInput)
3134{
3136 return internal_parse(This, varInput, TRUE);
3137}
3138
3140 IVBSAXXMLReader* iface,
3141 BSTR url)
3142{
3144 return internal_parseURL(This, url, TRUE);
3145}
3146
3147static const struct IVBSAXXMLReaderVtbl VBSAXXMLReaderVtbl =
3148{
3174};
3175
3176/*** ISAXXMLReader interface ***/
3177/*** IUnknown methods ***/
3178static HRESULT WINAPI isaxxmlreader_QueryInterface(ISAXXMLReader* iface, REFIID riid, void **ppvObject)
3179{
3181 return IVBSAXXMLReader_QueryInterface(&This->IVBSAXXMLReader_iface, riid, ppvObject);
3182}
3183
3184static ULONG WINAPI isaxxmlreader_AddRef(ISAXXMLReader* iface)
3185{
3187 return IVBSAXXMLReader_AddRef(&This->IVBSAXXMLReader_iface);
3188}
3189
3190static ULONG WINAPI isaxxmlreader_Release(ISAXXMLReader* iface)
3191{
3193 return IVBSAXXMLReader_Release(&This->IVBSAXXMLReader_iface);
3194}
3195
3196/*** ISAXXMLReader methods ***/
3198 ISAXXMLReader* iface,
3199 const WCHAR *feature_name,
3201{
3204
3205 TRACE("(%p)->(%s %p)\n", This, debugstr_w(feature_name), value);
3206
3207 feature = get_saxreader_feature(feature_name);
3208
3209 if (This->version < MSXML4 && (feature == ExhaustiveErrors || feature == SchemaValidation))
3210 return E_INVALIDARG;
3211
3212 if (feature == Namespaces ||
3217
3218 FIXME("(%p)->(%s %p) stub\n", This, debugstr_w(feature_name), value);
3219 return E_NOTIMPL;
3220}
3221
3223 ISAXXMLReader* iface,
3224 const WCHAR *feature_name,
3226{
3229
3230 TRACE("(%p)->(%s %x)\n", This, debugstr_w(feature_name), value);
3231
3232 feature = get_saxreader_feature(feature_name);
3233
3234 /* accepted cases */
3235 if ((feature == ExhaustiveErrors && value == VARIANT_FALSE) ||
3236 (feature == SchemaValidation && value == VARIANT_FALSE) ||
3237 feature == Namespaces ||
3239 {
3241 }
3242
3244 feature == ProhibitDTD ||
3247 {
3248 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(feature_name), value);
3250 }
3251
3252 FIXME("(%p)->(%s %x) stub\n", This, debugstr_w(feature_name), value);
3253 return E_NOTIMPL;
3254}
3255
3257 ISAXXMLReader* iface,
3258 const WCHAR *prop,
3259 VARIANT *value)
3260{
3262 return internal_getProperty(This, prop, value, FALSE);
3263}
3264
3266 ISAXXMLReader* iface,
3267 const WCHAR *pProp,
3268 VARIANT value)
3269{
3271 return internal_putProperty(This, pProp, value, FALSE);
3272}
3273
3275 ISAXXMLReader* iface,
3276 ISAXEntityResolver **resolver)
3277{
3279 return saxreader_get_handler(This, SAXEntityResolver, FALSE, (void**)resolver);
3280}
3281
3283 ISAXXMLReader* iface,
3284 ISAXEntityResolver *resolver)
3285{
3288}
3289
3291 ISAXXMLReader* iface,
3293{
3296}
3297
3299 ISAXXMLReader* iface,
3301{
3304}
3305
3307 ISAXXMLReader* iface,
3308 ISAXDTDHandler **handler)
3309{
3312}
3313
3315 ISAXXMLReader* iface,
3316 ISAXDTDHandler *handler)
3317{
3320}
3321
3323 ISAXXMLReader* iface,
3324 ISAXErrorHandler **handler)
3325{
3328}
3329
3330static HRESULT WINAPI isaxxmlreader_putErrorHandler(ISAXXMLReader* iface, ISAXErrorHandler *handler)
3331{
3334}
3335
3337 ISAXXMLReader* iface,
3338 const WCHAR **base_url)
3339{
3341
3342 FIXME("(%p)->(%p) stub\n", This, base_url);
3343 return E_NOTIMPL;
3344}
3345
3347 ISAXXMLReader* iface,
3348 const WCHAR *pBaseUrl)
3349{
3351
3352 FIXME("(%p)->(%s) stub\n", This, debugstr_w(pBaseUrl));
3353 return E_NOTIMPL;
3354}
3355
3357 ISAXXMLReader* iface,
3358 const WCHAR **pSecureBaseUrl)
3359{
3361 FIXME("(%p)->(%p) stub\n", This, pSecureBaseUrl);
3362 return E_NOTIMPL;
3363}
3364
3366 ISAXXMLReader* iface,
3367 const WCHAR *secureBaseUrl)
3368{
3370
3371 FIXME("(%p)->(%s) stub\n", This, debugstr_w(secureBaseUrl));
3372 return E_NOTIMPL;
3373}
3374
3376 ISAXXMLReader* iface,
3377 VARIANT varInput)
3378{
3380 return internal_parse(This, varInput, FALSE);
3381}
3382
3384 ISAXXMLReader* iface,
3385 const WCHAR *url)
3386{
3388 return internal_parseURL(This, url, FALSE);
3389}
3390
3391static const struct ISAXXMLReaderVtbl SAXXMLReaderVtbl =
3392{
3414};
3415
3416static const tid_t saxreader_iface_tids[] = {
3418 0
3419};
3421 NULL,
3423 NULL,
3425};
3426
3428{
3430
3431 TRACE("(%p)\n", ppObj);
3432
3433 reader = malloc(sizeof(*reader));
3434 if( !reader )
3435 return E_OUTOFMEMORY;
3436
3437 reader->IVBSAXXMLReader_iface.lpVtbl = &VBSAXXMLReaderVtbl;
3438 reader->ISAXXMLReader_iface.lpVtbl = &SAXXMLReaderVtbl;
3439 reader->ref = 1;
3440 memset(reader->saxhandlers, 0, sizeof(reader->saxhandlers));
3441 reader->isParsing = FALSE;
3442 reader->xmldecl_version = NULL;
3443 reader->pool.pool = NULL;
3444 reader->pool.index = 0;
3445 reader->pool.len = 0;
3446 reader->features = Namespaces | NamespacePrefixes;
3447 reader->version = version;
3448
3449 init_dispex(&reader->dispex, (IUnknown*)&reader->IVBSAXXMLReader_iface, &saxreader_dispex);
3450
3451 memset(&reader->sax, 0, sizeof(xmlSAXHandler));
3452 reader->sax.initialized = XML_SAX2_MAGIC;
3453 reader->sax.startDocument = libxmlStartDocument;
3454 reader->sax.endDocument = libxmlEndDocument;
3455 reader->sax.startElementNs = libxmlStartElementNS;
3456 reader->sax.endElementNs = libxmlEndElementNS;
3457 reader->sax.characters = libxmlCharacters;
3458 reader->sax.setDocumentLocator = libxmlSetDocumentLocator;
3459 reader->sax.comment = libxmlComment;
3460 reader->sax.error = libxmlFatalError;
3461 reader->sax.fatalError = libxmlFatalError;
3462 reader->sax.cdataBlock = libxml_cdatablock;
3463 reader->sax.resolveEntity = libxmlresolveentity;
3464
3465 *ppObj = &reader->IVBSAXXMLReader_iface;
3466
3467 TRACE("returning iface %p\n", *ppObj);
3468
3469 return S_OK;
3470}
XMLPUBFUN const xmlChar * xmlSAX2GetPublicId(void *ctx)
XMLPUBFUN int xmlSAX2GetLineNumber(void *ctx)
Definition: SAX2.c:243
XMLPUBFUN int xmlSAX2GetColumnNumber(void *ctx)
Definition: SAX2.c:259
XMLPUBFUN xmlParserInputPtr xmlSAX2ResolveEntity(void *ctx, const xmlChar *publicId, const xmlChar *systemId)
Definition: SAX2.c:486
XMLPUBFUN const xmlChar * xmlSAX2GetSystemId(void *ctx)
Definition: SAX2.c:227
HRESULT get_typeinfo(enum type_id tid, ITypeInfo **ret)
Definition: apps.c:124
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define msg(x)
Definition: auth_time.c:54
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
static const WCHAR nameW[]
Definition: main.c:49
#define index(s, c)
Definition: various.h:29
#define ARRAY_SIZE(A)
Definition: main.h:20
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static void list_add_head(struct list_entry *head, struct list_entry *entry)
Definition: list.h:76
static void list_init(struct list_entry *head)
Definition: list.h:51
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
const GUID IID_IUnknown
HRESULT detach_bsc(bsc_t *bsc)
Definition: bsc.c:342
HRESULT bind_url(IMoniker *mon, HRESULT(*onDataAvailable)(void *, char *, DWORD), void *obj, bsc_t **ret)
Definition: bsc.c:299
HRESULT create_moniker_from_url(LPCWSTR url, IMoniker **mon)
Definition: bsc.c:284
Definition: list.h:37
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define realloc
Definition: debug_ros.c:6
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
content
Definition: atl_ax.c:994
#define CP_UNIXCP
Definition: compat.h:79
OLECHAR * BSTR
Definition: compat.h:2293
#define lstrcpyW
Definition: compat.h:749
short VARIANT_BOOL
Definition: compat.h:2290
#define MultiByteToWideChar
Definition: compat.h:110
@ VT_BSTR
Definition: compat.h:2303
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_BYREF
Definition: compat.h:2342
@ VT_ARRAY
Definition: compat.h:2341
@ VT_VARIANT
Definition: compat.h:2307
@ VT_I4
Definition: compat.h:2298
@ VT_EMPTY
Definition: compat.h:2295
@ VT_DISPATCH
Definition: compat.h:2304
@ VT_UI1
Definition: compat.h:2311
#define lstrlenW
Definition: compat.h:750
static const WCHAR version[]
Definition: asmname.c:66
static const WCHAR valueW[]
Definition: object.c:48
DWORD WINAPI FormatMessageW(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPWSTR lpBuffer, DWORD nSize, __ms_va_list *args)
Definition: format_msg.c:583
LCID lcid
Definition: locale.c:5656
UINT(* handler)(MSIPACKAGE *)
Definition: action.c:7512
unsigned char ch[4][2]
Definition: console.c:118
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1972
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2802
_ACRTIMP wchar_t *__cdecl wcsstr(const wchar_t *, const wchar_t *)
Definition: wcs.c:2993
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
_ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl vsprintf(char *, const char *, va_list) __WINE_CRT_PRINTF_ATTR(2
char * va_list
Definition: vadefs.h:50
static const xmlChar xmlns[]
Definition: attribute.c:40
static BSTR find_element_uri(saxlocator *locator, const xmlChar *uri)
Definition: saxreader.c:520
static HRESULT WINAPI isaxxmlreader_putBaseURL(ISAXXMLReader *iface, const WCHAR *pBaseUrl)
Definition: saxreader.c:3346
static HRESULT get_feature_value(const saxreader *reader, saxreader_feature feature, VARIANT_BOOL *value)
Definition: saxreader.c:434
static HRESULT SAXAttributes_populate(saxlocator *locator, int nb_namespaces, const xmlChar **xmlNamespaces, int nb_attributes, const xmlChar **xmlAttributes)
Definition: saxreader.c:1446
static ULONG WINAPI isaxxmlreader_Release(ISAXXMLReader *iface)
Definition: saxreader.c:3190
static const struct ISAXLocatorVtbl SAXLocatorVtbl
Definition: saxreader.c:2421
static const struct IVBSAXLocatorVtbl VBSAXLocatorVtbl
Definition: saxreader.c:2264
static HRESULT WINAPI isaxlocator_getColumnNumber(ISAXLocator *iface, int *pnColumn)
Definition: saxreader.c:2357
static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader *iface)
Definition: saxreader.c:2910
static const WCHAR FeatureLexicalHandlerParEntitiesW[]
Definition: saxreader.c:78
static void libxmlCharacters(void *ctx, const xmlChar *ch, int len)
Definition: saxreader.c:1771
static const WCHAR PropertyMaxElementDepthW[]
Definition: saxreader.c:398
static HRESULT WINAPI isaxattributes_getTypeFromQName(ISAXAttributes *iface, const WCHAR *pQName, int nQName, const WCHAR **pType, int *nType)
Definition: saxreader.c:1293
static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader *iface, REFIID riid, void **ppvObject)
Definition: saxreader.c:2877
static HRESULT WINAPI saxxmlreader_GetIDsOfNames(IVBSAXXMLReader *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
Definition: saxreader.c:2965
static const WCHAR PropertyLexicalHandlerW[]
Definition: saxreader.c:393
static const struct IVBSAXXMLReaderVtbl VBSAXXMLReaderVtbl
Definition: saxreader.c:3147
static HRESULT WINAPI ivbsaxlocator_get_systemId(IVBSAXLocator *iface, BSTR *ret)
Definition: saxreader.c:2245
static BSTR saxreader_get_cdata_chunk(const xmlChar *str, int len)
Definition: saxreader.c:1973
static HRESULT WINAPI saxxmlreader_put_dtdHandler(IVBSAXXMLReader *iface, IVBSAXDTDHandler *handler)
Definition: saxreader.c:3071
static ULONG WINAPI ivbsaxattributes_AddRef(IVBSAXAttributes *iface)
Definition: saxreader.c:725
static HRESULT WINAPI ivbsaxattributes_getValueFromQName(IVBSAXAttributes *iface, BSTR QName, BSTR *value)
Definition: saxreader.c:1030
static HRESULT WINAPI isaxxmlreader_putSecureBaseURL(ISAXXMLReader *iface, const WCHAR *secureBaseUrl)
Definition: saxreader.c:3365
static BOOL saxreader_has_handler(const saxlocator *locator, enum saxhandler_type type)
Definition: saxreader.c:351
static HRESULT WINAPI isaxxmlreader_getErrorHandler(ISAXXMLReader *iface, ISAXErrorHandler **handler)
Definition: saxreader.c:3322
static ULONG WINAPI isaxattributes_AddRef(ISAXAttributes *iface)
Definition: saxreader.c:1089
static BSTR pooled_bstr_from_xmlChar(struct bstrpool *pool, const xmlChar *buf)
Definition: saxreader.c:641
static HRESULT WINAPI isaxattributes_getLength(ISAXAttributes *iface, int *length)
Definition: saxreader.c:1105
static const struct saxreader_feature_pair saxreader_feature_map[]
Definition: saxreader.c:111
static HRESULT internal_parseURL(saxreader *reader, const WCHAR *url, BOOL vbInterface)
Definition: saxreader.c:2714
static HRESULT WINAPI isaxxmlreader_getFeature(ISAXXMLReader *iface, const WCHAR *feature_name, VARIANT_BOOL *value)
Definition: saxreader.c:3197
static ULONG WINAPI ivbsaxattributes_Release(IVBSAXAttributes *iface)
Definition: saxreader.c:731
static HRESULT WINAPI saxxmlreader_get_errorHandler(IVBSAXXMLReader *iface, IVBSAXErrorHandler **handler)
Definition: saxreader.c:3079
static HRESULT internal_parseStream(saxreader *This, ISequentialStream *stream, BOOL vbInterface)
Definition: saxreader.c:2565
static HRESULT WINAPI ivbsaxattributes_getLocalName(IVBSAXAttributes *iface, int nIndex, BSTR *name)
Definition: saxreader.c:843
static const tid_t saxreader_iface_tids[]
Definition: saxreader.c:3416
static HRESULT WINAPI ivbsaxlocator_Invoke(IVBSAXLocator *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
Definition: saxreader.c:2182
static HRESULT WINAPI ivbsaxattributes_getValue(IVBSAXAttributes *iface, int nIndex, BSTR *value)
Definition: saxreader.c:982
static void libxml_cdatablock(void *ctx, const xmlChar *value, int len)
Definition: saxreader.c:2008
static const WCHAR PropertyMaxXMLSizeW[]
Definition: saxreader.c:401
static dispex_static_data_t saxreader_dispex
Definition: saxreader.c:3420
static const WCHAR PropertyXmlDeclVersionW[]
Definition: saxreader.c:376
static HRESULT WINAPI ivbsaxattributes_getType(IVBSAXAttributes *iface, int nIndex, BSTR *type)
Definition: saxreader.c:910
static HRESULT WINAPI isaxxmlreader_getEntityResolver(ISAXXMLReader *iface, ISAXEntityResolver **resolver)
Definition: saxreader.c:3274
static ULONG WINAPI isaxattributes_Release(ISAXAttributes *iface)
Definition: saxreader.c:1096
static HRESULT WINAPI ivbsaxattributes_getURI(IVBSAXAttributes *iface, int nIndex, BSTR *uri)
Definition: saxreader.c:820
static HRESULT WINAPI saxxmlreader_put_secureBaseURL(IVBSAXXMLReader *iface, BSTR secureBaseUrl)
Definition: saxreader.c:3123
static HRESULT WINAPI isaxlocator_getSystemId(ISAXLocator *iface, const WCHAR **ppwchSystemId)
Definition: saxreader.c:2399
static BSTR pooled_bstr_from_xmlCharN(struct bstrpool *pool, const xmlChar *buf, int len)
Definition: saxreader.c:654
static HRESULT WINAPI saxxmlreader_parse(IVBSAXXMLReader *iface, VARIANT varInput)
Definition: saxreader.c:3131
static HRESULT WINAPI ivbsaxattributes_getQName(IVBSAXAttributes *iface, int nIndex, BSTR *QName)
Definition: saxreader.c:866
static element_entry * alloc_element_entry(const xmlChar *local, const xmlChar *prefix, int nb_ns, const xmlChar **namespaces)
Definition: saxreader.c:463
static ULONG WINAPI ivbsaxlocator_Release(IVBSAXLocator *iface)
Definition: saxreader.c:2128
static BSTR bstr_from_xmlCharN(const xmlChar *buf, int len)
Definition: saxreader.c:605
static saxreader_feature get_saxreader_feature(const WCHAR *name)
Definition: saxreader.c:122
static ULONG WINAPI isaxlocator_AddRef(ISAXLocator *iface)
Definition: saxreader.c:2309
static ULONG WINAPI saxxmlreader_Release(IVBSAXXMLReader *iface)
Definition: saxreader.c:2917
static const WCHAR PropertySchemaDeclHandlerW[]
Definition: saxreader.c:404
static HRESULT WINAPI isaxattributes_getName(ISAXAttributes *iface, int index, const WCHAR **uri, int *pUriLength, const WCHAR **localName, int *pLocalNameSize, const WCHAR **QName, int *pQNameLength)
Definition: saxreader.c:1177
static HRESULT WINAPI isaxxmlreader_parse(ISAXXMLReader *iface, VARIANT varInput)
Definition: saxreader.c:3375
static const WCHAR FeatureNamespacesW[]
Definition: saxreader.c:87
static HRESULT WINAPI saxxmlreader_putProperty(IVBSAXXMLReader *iface, BSTR pProp, VARIANT value)
Definition: saxreader.c:3022
static HRESULT WINAPI saxxmlreader_get_secureBaseURL(IVBSAXXMLReader *iface, BSTR *pSecureBaseUrl)
Definition: saxreader.c:3113
static void push_element_ns(saxlocator *locator, element_entry *element)
Definition: saxreader.c:505
static HRESULT saxreader_put_handler(saxreader *reader, enum saxhandler_type type, void *ptr, BOOL vb)
Definition: saxreader.c:239
static HRESULT WINAPI ivbsaxlocator_GetIDsOfNames(IVBSAXLocator *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
Definition: saxreader.c:2155
static HRESULT WINAPI isaxattributes_getURI(ISAXAttributes *iface, int index, const WCHAR **url, int *size)
Definition: saxreader.c:1121
static HRESULT WINAPI isaxattributes_getLocalName(ISAXAttributes *iface, int index, const WCHAR **pLocalName, int *pLocalNameLength)
Definition: saxreader.c:1141
static BOOL iterate_endprefix_index(saxlocator *This, const element_entry *element, int *i)
Definition: saxreader.c:552
static HRESULT WINAPI ivbsaxattributes_getValueFromName(IVBSAXAttributes *iface, BSTR uri, BSTR localName, BSTR *value)
Definition: saxreader.c:1005
static HRESULT WINAPI isaxlocator_getLineNumber(ISAXLocator *iface, int *pnLine)
Definition: saxreader.c:2367
static HRESULT saxreader_put_handler_from_variant(saxreader *This, enum saxhandler_type type, const VARIANT *v, BOOL vb)
Definition: saxreader.c:2739
static HRESULT WINAPI isaxattributes_getQName(ISAXAttributes *iface, int index, const WCHAR **pQName, int *pQNameLength)
Definition: saxreader.c:1159
static HRESULT WINAPI isaxxmlreader_putEntityResolver(ISAXXMLReader *iface, ISAXEntityResolver *resolver)
Definition: saxreader.c:3282
static HRESULT WINAPI saxxmlreader_get_contentHandler(IVBSAXXMLReader *iface, IVBSAXContentHandler **handler)
Definition: saxreader.c:3047
static void update_position(saxlocator *This, BOOL fix_column)
Definition: saxreader.c:696
static HRESULT WINAPI isaxxmlreader_parseURL(ISAXXMLReader *iface, const WCHAR *url)
Definition: saxreader.c:3383
static HRESULT WINAPI isaxattributes_getValue(ISAXAttributes *iface, int index, const WCHAR **value, int *nValue)
Definition: saxreader.c:1306
static HRESULT WINAPI isaxattributes_getValueFromQName(ISAXAttributes *iface, const WCHAR *pQName, int nQName, const WCHAR **pValue, int *nValue)
Definition: saxreader.c:1348
static HRESULT WINAPI isaxattributes_getValueFromName(ISAXAttributes *iface, const WCHAR *pUri, int nUri, const WCHAR *pLocalName, int nLocalName, const WCHAR **pValue, int *nValue)
Definition: saxreader.c:1326
static const WCHAR PropertyXMLDeclStandaloneW[]
Definition: saxreader.c:411
static HRESULT WINAPI isaxattributes_getIndexFromName(ISAXAttributes *iface, const WCHAR *pUri, int cUriLength, const WCHAR *pLocalName, int cocalNameLength, int *index)
Definition: saxreader.c:1206
static HRESULT WINAPI isaxxmlreader_putFeature(ISAXXMLReader *iface, const WCHAR *feature_name, VARIANT_BOOL value)
Definition: saxreader.c:3222
static HRESULT WINAPI saxxmlreader_getFeature(IVBSAXXMLReader *iface, BSTR feature_name, VARIANT_BOOL *value)
Definition: saxreader.c:2995
static HRESULT WINAPI saxxmlreader_parseURL(IVBSAXXMLReader *iface, BSTR url)
Definition: saxreader.c:3139
static const WCHAR PropertyXMLDeclVersionW[]
Definition: saxreader.c:414
static const WCHAR empty_str
Definition: saxreader.c:146
static HRESULT WINAPI isaxxmlreader_QueryInterface(ISAXXMLReader *iface, REFIID riid, void **ppvObject)
Definition: saxreader.c:3178
static BOOL is_namespaces_enabled(const saxreader *reader)
Definition: saxreader.c:440
static void format_error_message_from_id(saxlocator *This, HRESULT hr)
Definition: saxreader.c:667
static HRESULT WINAPI saxxmlreader_get_baseURL(IVBSAXXMLReader *iface, BSTR *pBaseUrl)
Definition: saxreader.c:3095
static BSTR build_qname(BSTR prefix, BSTR local)
Definition: saxreader.c:445
static BSTR saxreader_get_unescaped_value(const xmlChar *buf, int len)
Definition: saxreader.c:1389
static HRESULT WINAPI ivbsaxlocator_get_lineNumber(IVBSAXLocator *iface, int *pnLine)
Definition: saxreader.c:2218
static HRESULT WINAPI saxxmlreader_GetTypeInfoCount(IVBSAXXMLReader *iface, UINT *pctinfo)
Definition: saxreader.c:2950
static HRESULT internal_parseBuffer(saxreader *This, const char *buffer, int size, BOOL vbInterface)
Definition: saxreader.c:2491
static const struct IVBSAXAttributesVtbl ivbsaxattributes_vtbl
Definition: saxreader.c:1054
static const WCHAR FeatureProhibitDTDW[]
Definition: saxreader.c:83
static HRESULT WINAPI ivbsaxattributes_get_length(IVBSAXAttributes *iface, int *nLength)
Definition: saxreader.c:812
static const WCHAR PropertyInputSourceW[]
Definition: saxreader.c:390
static struct saxerrorhandler_iface * saxreader_get_errorhandler(saxreader *reader)
Definition: saxreader.c:282
static void libxmlEndDocument(void *ctx)
Definition: saxreader.c:1562
static HRESULT internal_onDataAvailable(void *obj, char *ptr, DWORD len)
Definition: saxreader.c:2707
static HRESULT saxreader_saxcharacters(saxlocator *locator, BSTR chars)
Definition: saxreader.c:357
static saxlocator * impl_from_IVBSAXLocator(IVBSAXLocator *iface)
Definition: saxreader.c:331
static HRESULT WINAPI ivbsaxlocator_GetTypeInfoCount(IVBSAXLocator *iface, UINT *pctinfo)
Definition: saxreader.c:2135
static HRESULT WINAPI ivbsaxattributes_getIndexFromName(IVBSAXAttributes *iface, BSTR uri, BSTR localName, int *index)
Definition: saxreader.c:889
static HRESULT WINAPI ivbsaxattributes_Invoke(IVBSAXAttributes *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
Definition: saxreader.c:784
static HRESULT WINAPI ivbsaxattributes_GetIDsOfNames(IVBSAXAttributes *iface, REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
Definition: saxreader.c:757
static HRESULT set_feature_value(saxreader *reader, saxreader_feature feature, VARIANT_BOOL value)
Definition: saxreader.c:418
static HRESULT WINAPI ivbsaxlocator_get_columnNumber(IVBSAXLocator *iface, int *pnColumn)
Definition: saxreader.c:2210
static void libxmlComment(void *ctx, const xmlChar *value)
Definition: saxreader.c:1882
static HRESULT internal_parse(saxreader *This, VARIANT varInput, BOOL vbInterface)
Definition: saxreader.c:2615
static HRESULT WINAPI saxxmlreader_Invoke(IVBSAXXMLReader *iface, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
Definition: saxreader.c:2978
static ULONG WINAPI isaxxmlreader_AddRef(ISAXXMLReader *iface)
Definition: saxreader.c:3184
static const WCHAR PropertyDomNodeW[]
Definition: saxreader.c:385
static BSTR QName_from_xmlChar(const xmlChar *prefix, const xmlChar *name)
Definition: saxreader.c:624
static HRESULT WINAPI isaxattributes_getType(ISAXAttributes *iface, int nIndex, const WCHAR **pType, int *pTypeLength)
Definition: saxreader.c:1265
HRESULT SAXXMLReader_create(MSXML_VERSION version, LPVOID *ppObj)
Definition: saxreader.c:3427
static void libxmlEndElementNS(void *ctx, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI)
Definition: saxreader.c:1671
static void WINAPIV libxmlFatalError(void *ctx, const char *msg,...)
Definition: saxreader.c:1916
static HRESULT internal_vbonDataAvailable(void *obj, char *ptr, DWORD len)
Definition: saxreader.c:2700
static HRESULT WINAPI isaxattributes_QueryInterface(ISAXAttributes *iface, REFIID riid, void **ppvObject)
Definition: saxreader.c:1079
saxreader_feature
Definition: saxreader.c:47
@ ForcedResync
Definition: saxreader.c:52
@ NamespacePrefixes
Definition: saxreader.c:53
@ ExhaustiveErrors
Definition: saxreader.c:49
@ ExternalParameterEntities
Definition: saxreader.c:51
@ UseInlineSchema
Definition: saxreader.c:61
@ Namespaces
Definition: saxreader.c:54
@ PreserveSystemIndentifiers
Definition: saxreader.c:56
@ ProhibitDTD
Definition: saxreader.c:57
@ SuppressValidationfatalError
Definition: saxreader.c:60
@ FeatureUnknown
Definition: saxreader.c:48
@ ServerHttpRequest
Definition: saxreader.c:59
@ ExternalGeneralEntities
Definition: saxreader.c:50
@ SchemaValidation
Definition: saxreader.c:58
@ LexicalHandlerParEntities
Definition: saxreader.c:63
@ ParameterEntities
Definition: saxreader.c:55
@ UseSchemaLocation
Definition: saxreader.c:62
static HRESULT WINAPI ivbsaxlocator_GetTypeInfo(IVBSAXLocator *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
Definition: saxreader.c:2146
static BOOL is_valid_attr_index(const saxlocator *locator, int index)
Definition: saxreader.c:1116
static const WCHAR ExhaustiveErrorsW[]
Definition: saxreader.c:97
static saxlocator * impl_from_ISAXLocator(ISAXLocator *iface)
Definition: saxreader.c:336
static HRESULT WINAPI ivbsaxlocator_get_publicId(IVBSAXLocator *iface, BSTR *ret)
Definition: saxreader.c:2226
static HRESULT WINAPI saxxmlreader_getProperty(IVBSAXXMLReader *iface, BSTR prop, VARIANT *value)
Definition: saxreader.c:3013
static HRESULT WINAPI isaxattributes_getIndexFromQName(ISAXAttributes *iface, const WCHAR *pQName, int nQNameLength, int *index)
Definition: saxreader.c:1240
static HRESULT WINAPI saxxmlreader_put_contentHandler(IVBSAXXMLReader *iface, IVBSAXContentHandler *handler)
Definition: saxreader.c:3055
static BOOL bstr_pool_insert(struct bstrpool *pool, BSTR pool_entry)
Definition: saxreader.c:566
static HRESULT WINAPI isaxxmlreader_putContentHandler(ISAXXMLReader *iface, ISAXContentHandler *handler)
Definition: saxreader.c:3298
static ULONG WINAPI isaxlocator_Release(ISAXLocator *iface)
Definition: saxreader.c:2317
static const WCHAR FeatureExternalGeneralEntitiesW[]
Definition: saxreader.c:67
static void libxmlStartElementNS(void *ctx, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar **attributes)
Definition: saxreader.c:1592
static HRESULT WINAPI isaxxmlreader_getDTDHandler(ISAXXMLReader *iface, ISAXDTDHandler **handler)
Definition: saxreader.c:3306
static const WCHAR PropertyCharsetW[]
Definition: saxreader.c:373
static const struct ISAXXMLReaderVtbl SAXXMLReaderVtbl
Definition: saxreader.c:3391
static HRESULT WINAPI ivbsaxattributes_getTypeFromName(IVBSAXAttributes *iface, BSTR uri, BSTR localName, BSTR *type)
Definition: saxreader.c:933
static saxreader * impl_from_ISAXXMLReader(ISAXXMLReader *iface)
Definition: saxreader.c:326
static HRESULT WINAPI isaxattributes_getTypeFromName(ISAXAttributes *iface, const WCHAR *pUri, int nUri, const WCHAR *pLocalName, int nLocalName, const WCHAR **pType, int *nType)
Definition: saxreader.c:1277
static xmlParserInputPtr libxmlresolveentity(void *ctx, const xmlChar *publicid, const xmlChar *systemid)
Definition: saxreader.c:2084
static const struct ISAXAttributesVtbl isaxattributes_vtbl
Definition: saxreader.c:1366
static const WCHAR PropertyXMLDeclEncodingW[]
Definition: saxreader.c:408
static void libxmlStartDocument(void *ctx)
Definition: saxreader.c:1522
static HRESULT WINAPI saxxmlreader_put_entityResolver(IVBSAXXMLReader *iface, IVBSAXEntityResolver *resolver)
Definition: saxreader.c:3039
static void free_element_entry(element_entry *element)
Definition: saxreader.c:487
static HRESULT WINAPI isaxxmlreader_getContentHandler(ISAXXMLReader *iface, ISAXContentHandler **handler)
Definition: saxreader.c:3290
static HRESULT WINAPI isaxxmlreader_putErrorHandler(ISAXXMLReader *iface, ISAXErrorHandler *handler)
Definition: saxreader.c:3330
saxhandler_type
Definition: saxreader.c:172
@ SAXDTDHandler
Definition: saxreader.c:175
@ SAXHandler_Last
Definition: saxreader.c:179
@ SAXLexicalHandler
Definition: saxreader.c:178
@ SAXEntityResolver
Definition: saxreader.c:176
@ SAXErrorHandler
Definition: saxreader.c:177
@ SAXDeclHandler
Definition: saxreader.c:174
@ SAXContentHandler
Definition: saxreader.c:173
static HRESULT WINAPI saxxmlreader_put_errorHandler(IVBSAXXMLReader *iface, IVBSAXErrorHandler *handler)
Definition: saxreader.c:3087
static ULONG WINAPI ivbsaxlocator_AddRef(IVBSAXLocator *iface)
Definition: saxreader.c:2121
static HRESULT SAXLocator_create(saxreader *reader, saxlocator **ppsaxlocator, BOOL vbInterface)
Definition: saxreader.c:2432
static HRESULT WINAPI ivbsaxattributes_getTypeFromQName(IVBSAXAttributes *iface, BSTR QName, BSTR *type)
Definition: saxreader.c:958
static HRESULT WINAPI saxxmlreader_putFeature(IVBSAXXMLReader *iface, BSTR feature_name, VARIANT_BOOL value)
Definition: saxreader.c:3004
static struct saxcontenthandler_iface * saxreader_get_contenthandler(saxreader *reader)
Definition: saxreader.c:277
static saxlocator * impl_from_IVBSAXAttributes(IVBSAXAttributes *iface)
Definition: saxreader.c:341
static HRESULT internal_getProperty(const saxreader *This, const WCHAR *prop, VARIANT *value, BOOL vb)
Definition: saxreader.c:2843
static void free_bstr_pool(struct bstrpool *pool)
Definition: saxreader.c:592
static HRESULT WINAPI isaxxmlreader_getBaseURL(ISAXXMLReader *iface, const WCHAR **base_url)
Definition: saxreader.c:3336
static const WCHAR SchemaValidationW[]
Definition: saxreader.c:101
static HRESULT WINAPI isaxxmlreader_getProperty(ISAXXMLReader *iface, const WCHAR *prop, VARIANT *value)
Definition: saxreader.c:3256
static HRESULT WINAPI isaxxmlreader_putProperty(ISAXXMLReader *iface, const WCHAR *pProp, VARIANT value)
Definition: saxreader.c:3265
static const WCHAR FeatureExternalParameterEntitiesW[]
Definition: saxreader.c:73
static HRESULT WINAPI ivbsaxattributes_QueryInterface(IVBSAXAttributes *iface, REFIID riid, void **ppvObject)
Definition: saxreader.c:715
static element_entry * pop_element_ns(saxlocator *locator)
Definition: saxreader.c:510
static HRESULT WINAPI ivbsaxattributes_getIndexFromQName(IVBSAXAttributes *iface, BSTR QName, int *index)
Definition: saxreader.c:900
static HRESULT WINAPI saxxmlreader_GetTypeInfo(IVBSAXXMLReader *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
Definition: saxreader.c:2956
static void libxmlSetDocumentLocator(void *ctx, xmlSAXLocatorPtr loc)
Definition: saxreader.c:1861
static HRESULT WINAPI isaxlocator_QueryInterface(ISAXLocator *iface, REFIID riid, void **ppvObject)
Definition: saxreader.c:2281
static HRESULT saxreader_get_handler(const saxreader *reader, enum saxhandler_type type, BOOL vb, void **ret)
Definition: saxreader.c:258
static saxreader * impl_from_IVBSAXXMLReader(IVBSAXXMLReader *iface)
Definition: saxreader.c:321
static HRESULT WINAPI saxxmlreader_get_dtdHandler(IVBSAXXMLReader *iface, IVBSAXDTDHandler **handler)
Definition: saxreader.c:3063
static void free_attribute_values(saxlocator *locator)
Definition: saxreader.c:1429
static saxlocator * impl_from_ISAXAttributes(ISAXAttributes *iface)
Definition: saxreader.c:346
static HRESULT WINAPI ivbsaxattributes_GetTypeInfo(IVBSAXAttributes *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
Definition: saxreader.c:748
static const WCHAR PropertyDeclHandlerW[]
Definition: saxreader.c:379
static HRESULT WINAPI ivbsaxattributes_GetTypeInfoCount(IVBSAXAttributes *iface, UINT *pctinfo)
Definition: saxreader.c:737
static HRESULT WINAPI saxxmlreader_get_entityResolver(IVBSAXXMLReader *iface, IVBSAXEntityResolver **resolver)
Definition: saxreader.c:3031
static HRESULT WINAPI ivbsaxlocator_QueryInterface(IVBSAXLocator *iface, REFIID riid, void **ppvObject)
Definition: saxreader.c:2092
static const WCHAR FeatureNamespacePrefixesW[]
Definition: saxreader.c:92
static HRESULT WINAPI isaxxmlreader_putDTDHandler(ISAXXMLReader *iface, ISAXDTDHandler *handler)
Definition: saxreader.c:3314
static HRESULT internal_putProperty(saxreader *This, const WCHAR *prop, VARIANT value, BOOL vbInterface)
Definition: saxreader.c:2784
static HRESULT WINAPI saxxmlreader_put_baseURL(IVBSAXXMLReader *iface, BSTR pBaseUrl)
Definition: saxreader.c:3105
static BOOL sax_callback_failed(saxlocator *This, HRESULT hr)
Definition: saxreader.c:546
static struct saxlexicalhandler_iface * saxreader_get_lexicalhandler(saxreader *reader)
Definition: saxreader.c:287
static HRESULT WINAPI isaxxmlreader_getSecureBaseURL(ISAXXMLReader *iface, const WCHAR **pSecureBaseUrl)
Definition: saxreader.c:3356
static HRESULT WINAPI isaxlocator_getPublicId(ISAXLocator *iface, const WCHAR **ppwchPublicId)
Definition: saxreader.c:2377
HRESULT WINAPI SafeArrayGetUBound(SAFEARRAY *psa, UINT nDim, LONG *plUbound)
Definition: safearray.c:1033
HRESULT WINAPI SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
Definition: safearray.c:1137
HRESULT WINAPI SafeArrayUnaccessData(SAFEARRAY *psa)
Definition: safearray.c:1168
HRESULT WINAPI SafeArrayGetLBound(SAFEARRAY *psa, UINT nDim, LONG *plLbound)
Definition: safearray.c:1066
UINT WINAPI SafeArrayGetElemsize(SAFEARRAY *psa)
Definition: safearray.c:1114
static const WCHAR typeW[]
Definition: name.c:51
static WCHAR xmlnsW[]
Definition: reader.c:228
return ret
Definition: mutex.c:146
const char * xmlGetCharEncodingName(xmlCharEncoding enc)
Definition: encoding.c:1229
xmlCharEncoding xmlDetectCharEncoding(const unsigned char *in, int len)
Definition: encoding.c:916
xmlCharEncoding
Definition: encoding.h:65
@ XML_CHAR_ENCODING_UTF8
Definition: encoding.h:68
@ XML_CHAR_ENCODING_UTF16LE
Definition: encoding.h:69
@ XML_CHAR_ENCODING_NONE
Definition: encoding.h:67
size_t const new_size
Definition: expand.cpp:66
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
#define local
Definition: zutil.h:30
PWCHAR pValue
FxCollectionEntry * cur
GLuint start
Definition: gl.h:1545
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint GLuint end
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble n
Definition: glext.h:7729
GLenum src
Definition: glext.h:6340
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
const GLubyte * c
Definition: glext.h:8905
GLuint index
Definition: glext.h:6031
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLfloat GLfloat p
Definition: glext.h:8902
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static const char * enc_name(unsigned char enc)
Definition: id3.c:433
tid_t
Definition: ieframe.h:311
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
uint32_t entry
Definition: isohybrid.c:63
HRESULT init_dispex(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *prototype)
Definition: dispex.c:919
#define c
Definition: ke_i.h:80
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_w
Definition: kernel32.h:32
if(dx< 0)
Definition: linetemp.h:194
#define error(str)
Definition: mkdosfs.c:1605
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
static PVOID ptr
Definition: dispmode.c:27
static const WCHAR url[]
Definition: encode.c:1384
static const char * debugstr_variant(const VARIANT *var)
Definition: container.c:46
const char * base_url
Definition: mimeole.c:1466
static char * dest
Definition: rtl.c:135
static LPOLESTR
Definition: stg_prop.c:27
static VARIANTARG static DISPID
Definition: ordinal.c:49
INTERNETFEATURELIST feature
Definition: misc.c:1719
const char * uri
Definition: sec_mgr.c:1588
#define min(a, b)
Definition: monoChain.cc:55
BOOL dispex_query_interface(DispatchEx *This, REFIID riid, void **ppv)
Definition: dispex.c:1656
MSXML_VERSION
Definition: msxml_dispex.h:27
@ MSXML4
Definition: msxml_dispex.h:32
@ MSXML6
Definition: msxml_dispex.h:33
@ IVBSAXLocator_tid
Definition: msxml_dispex.h:71
@ IVBSAXXMLReader_tid
Definition: msxml_dispex.h:73
@ IVBSAXAttributes_tid
Definition: msxml_dispex.h:64
static HRESULT return_bstrn(const WCHAR *value, int len, BSTR *p)
Definition: msxml_dispex.h:132
static HRESULT return_bstr(const WCHAR *value, BSTR *p)
Definition: msxml_dispex.h:115
static BSTR bstr_from_xmlChar(const xmlChar *str)
unsigned int UINT
Definition: ndis.h:50
UINT WINAPI SysStringByteLen(BSTR str)
Definition: oleaut.c:215
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
UINT WINAPI SysStringLen(BSTR str)
Definition: oleaut.c:196
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
BSTR WINAPI SysAllocStringLen(const OLECHAR *str, unsigned int len)
Definition: oleaut.c:339
#define V_ARRAY(A)
Definition: oleauto.h:222
#define V_BSTRREF(A)
Definition: oleauto.h:227
#define V_UNKNOWN(A)
Definition: oleauto.h:281
#define V_ISBYREF(A)
Definition: oleauto.h:217
#define V_VARIANTREF(A)
Definition: oleauto.h:283
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_I4(A)
Definition: oleauto.h:247
const GUID IID_IDispatch
XMLPUBFUN xmlParserCtxtPtr xmlCreateMemoryParserCtxt(const char *buffer, int size)
Definition: parser.c:13996
XMLPUBFUN int xmlSwitchEncoding(xmlParserCtxtPtr ctxt, xmlCharEncoding enc)
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define calloc
Definition: rosglue.h:14
const WCHAR * str
#define WINAPIV
Definition: sdbpapi.h:64
DWORD LCID
Definition: nls.h:13
#define CP_UTF8
Definition: nls.h:20
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:204
xmlFreeFunc xmlFree
Definition: globals.c:184
XMLPUBFUN int xmlParseDocument(xmlParserCtxtPtr ctxt)
Definition: parser.c:11009
XMLPUBFUN void xmlFreeParserCtxt(xmlParserCtxtPtr ctxt)
#define XML_SAX2_MAGIC
Definition: parser.h:687
XMLPUBFUN void xmlStopParser(xmlParserCtxtPtr ctxt)
Definition: parser.c:12311
#define memset(x, y, z)
Definition: compat.h:39
#define args
Definition: format.c:66
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
Definition: match.c:390
Definition: bsc.c:39
Definition: xmldoc.c:231
BSTR * pool
Definition: saxreader.c:150
unsigned int len
Definition: saxreader.c:152
unsigned int index
Definition: saxreader.c:151
Definition: saxreader.c:162
int ns_count
Definition: saxreader.c:168
BSTR local
Definition: saxreader.c:165
BSTR qname
Definition: saxreader.c:166
BSTR prefix
Definition: saxreader.c:164
ns * ns
Definition: saxreader.c:167
struct list ns
Definition: writer.c:91
strval prefix
Definition: reader.c:259
strval qname
Definition: reader.c:261
struct list entry
Definition: reader.c:258
Definition: list.h:15
Definition: tftpd.h:60
Definition: name.c:39
Definition: mxnamespace.c:38
Definition: reader.h:84
Definition: send.c:48
IUnknown * vbhandler
Definition: saxreader.c:185
IUnknown * handler
Definition: saxreader.c:184
IVBSAXContentHandler * vbhandler
Definition: saxreader.c:191
ISAXContentHandler * handler
Definition: saxreader.c:190
IVBSAXEntityResolver * vbhandler
Definition: saxreader.c:209
ISAXEntityResolver * handler
Definition: saxreader.c:208
IVBSAXErrorHandler * vbhandler
Definition: saxreader.c:197
ISAXErrorHandler * handler
Definition: saxreader.c:196
struct saxentityresolver_iface entityresolver
Definition: saxreader.c:216
struct saxerrorhandler_iface error
Definition: saxreader.c:217
union saxhandler_iface::@587 u
struct saxlexicalhandler_iface lexical
Definition: saxreader.c:218
struct saxanyhandler_iface anyhandler
Definition: saxreader.c:219
ISAXLexicalHandler * handler
Definition: saxreader.c:202
IVBSAXLexicalHandler * vbhandler
Definition: saxreader.c:203
LONG ref
Definition: saxreader.c:298
IVBSAXLocator IVBSAXLocator_iface
Definition: saxreader.c:294
IVBSAXAttributes IVBSAXAttributes_iface
Definition: saxreader.c:296
int attr_alloc_count
Definition: saxreader.c:310
BOOL vbInterface
Definition: saxreader.c:306
saxreader * saxreader
Definition: saxreader.c:299
BSTR publicId
Definition: saxreader.c:302
HRESULT ret
Definition: saxreader.c:300
ISAXLocator ISAXLocator_iface
Definition: saxreader.c:295
int column
Definition: saxreader.c:305
xmlParserCtxtPtr pParserCtxt
Definition: saxreader.c:301
BSTR namespaceUri
Definition: saxreader.c:309
BSTR systemId
Definition: saxreader.c:303
int attr_count
Definition: saxreader.c:311
ISAXAttributes ISAXAttributes_iface
Definition: saxreader.c:297
saxreader_feature feature
Definition: saxreader.c:107
const WCHAR * name
Definition: saxreader.c:108
ISAXXMLReader ISAXXMLReader_iface
Definition: saxreader.c:227
xmlSAXHandler sax
Definition: saxreader.c:231
BSTR xmldecl_version
Definition: saxreader.c:235
MSXML_VERSION version
Definition: saxreader.c:236
saxreader_feature features
Definition: saxreader.c:234
DispatchEx dispex
Definition: saxreader.c:225
LONG ref
Definition: saxreader.c:228
IVBSAXXMLReader IVBSAXXMLReader_iface
Definition: saxreader.c:226
BOOL isParsing
Definition: saxreader.c:232
Definition: parse.h:23
#define max(a, b)
Definition: svc.c:63
#define LIST_ENTRY(type)
Definition: queue.h:175
Character const *const prefix
Definition: tempnam.cpp:195
#define str_len
Definition: treelist.c:89
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
Definition: pdh_main.c:96
#define FORMAT_MESSAGE_FROM_SYSTEM
Definition: winbase.h:400
WINBASEAPI _In_ DWORD nLength
Definition: wincon.h:682
WINBASEAPI _In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon_undoc.h:337
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
#define E_POINTER
Definition: winerror.h:3480
@ XML_ERR_OK
Definition: xmlerror.h:100
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
XMLPUBFUN int xmlStrEqual(const xmlChar *str1, const xmlChar *str2)
Definition: xmlstring.c:162
unsigned char xmlChar
Definition: xmlstring.h:28
XMLPUBFUN xmlChar * xmlStrdup(const xmlChar *cur)
Definition: xmlstring.c:69