4 * Copyright 2005 Mike McCormack
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #ifndef __MSXML_PRIVATE__
22 #define __MSXML_PRIVATE__
26 #include "wine/unicode.h"
28 #ifndef __WINE_CONFIG_H
29 # error You must include config.h to use this header
45 IXMLDOMCDATASection_tid
,
50 IXMLDOMDocumentFragment_tid
,
51 IXMLDOMDocumentType_tid
,
53 IXMLDOMEntityReference_tid
,
54 IXMLDOMImplementation_tid
,
55 IXMLDOMNamedNodeMap_tid
,
58 IXMLDOMParseError2_tid
,
59 IXMLDOMProcessingInstruction_tid
,
60 IXMLDOMSchemaCollection_tid
,
61 IXMLDOMSchemaCollection2_tid
,
70 IVBSAXContentHandler_tid
,
71 IVBSAXDeclHandler_tid
,
73 IVBSAXEntityResolver_tid
,
74 IVBSAXErrorHandler_tid
,
75 IVBSAXLexicalHandler_tid
,
82 IVBMXNamespaceManager_tid
,
83 IServerXMLHTTPRequest_tid
,
87 /* The XDR datatypes (urn:schemas-microsoft-com:datatypes)
88 * These are actually valid for XSD schemas as well
91 typedef enum _XDR_DT
{
132 extern HRESULT
get_typeinfo(tid_t tid
, ITypeInfo
**typeinfo
) DECLSPEC_HIDDEN
;
133 extern void release_typelib(void) DECLSPEC_HIDDEN
;
135 typedef struct dispex_data_t dispex_data_t
;
136 typedef struct dispex_dynamic_data_t dispex_dynamic_data_t
;
139 HRESULT (*get_dispid
)(IUnknown
*,BSTR
,DWORD
,DISPID
*);
140 HRESULT (*invoke
)(IUnknown
*,DISPID
,LCID
,WORD
,DISPPARAMS
*,VARIANT
*,EXCEPINFO
*);
141 } dispex_static_data_vtbl_t
;
144 const dispex_static_data_vtbl_t
*vtbl
;
145 const tid_t disp_tid
;
147 const tid_t
* const iface_tids
;
148 } dispex_static_data_t
;
151 IDispatchEx IDispatchEx_iface
;
155 dispex_static_data_t
*data
;
156 dispex_dynamic_data_t
*dynamic_data
;
159 extern HINSTANCE MSXML_hInstance DECLSPEC_HIDDEN
;
161 void init_dispex(DispatchEx
*,IUnknown
*,dispex_static_data_t
*) DECLSPEC_HIDDEN
;
162 void release_dispex(DispatchEx
*) DECLSPEC_HIDDEN
;
163 BOOL
dispex_query_interface(DispatchEx
*,REFIID
,void**) DECLSPEC_HIDDEN
;
164 const IID
*get_riid_from_tid(enum tid_t tid
) DECLSPEC_HIDDEN
;
166 /* memory allocation functions */
168 static inline void *heap_alloc(size_t len
)
170 return HeapAlloc(GetProcessHeap(), 0, len
);
173 static inline void *heap_alloc_zero(size_t len
)
175 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
178 static inline void *heap_realloc(void *mem
, size_t len
)
180 return HeapReAlloc(GetProcessHeap(), 0, mem
, len
);
183 static inline BOOL
heap_free(void *mem
)
185 return HeapFree(GetProcessHeap(), 0, mem
);
188 static inline LPWSTR
heap_strdupW(LPCWSTR str
)
195 size
= (strlenW(str
)+1)*sizeof(WCHAR
);
196 ret
= heap_alloc(size
);
198 memcpy(ret
, str
, size
);
204 static inline LPSTR
heap_strdupWtoA(LPCWSTR str
)
209 DWORD len
= WideCharToMultiByte(CP_ACP
, 0, str
, -1, NULL
, 0, NULL
, NULL
);
210 ret
= heap_alloc(len
+1);
214 WideCharToMultiByte(CP_ACP
, 0, str
, -1, ret
, len
+1, NULL
, NULL
);
222 extern void schemasInit(void) DECLSPEC_HIDDEN
;
223 extern void schemasCleanup(void) DECLSPEC_HIDDEN
;
225 #ifndef HAVE_XMLFIRSTELEMENTCHILD
226 static inline xmlNodePtr
wine_xmlFirstElementChild(xmlNodePtr parent
)
229 for (child
= parent
->children
; child
!= NULL
; child
= child
->next
)
230 if (child
->type
== XML_ELEMENT_NODE
)
235 #define xmlFirstElementChild wine_xmlFirstElementChild
238 /* IXMLDOMNode Internal Structure */
239 typedef struct _xmlnode
247 /* IXMLDOMNamedNodeMap custom function table */
250 HRESULT (*get_named_item
)(const xmlNodePtr
,BSTR
,IXMLDOMNode
**);
251 HRESULT (*set_named_item
)(xmlNodePtr
,IXMLDOMNode
*,IXMLDOMNode
**);
252 HRESULT (*remove_named_item
)(xmlNodePtr
,BSTR
,IXMLDOMNode
**);
253 HRESULT (*get_item
)(xmlNodePtr
,LONG
,IXMLDOMNode
**);
254 HRESULT (*get_length
)(xmlNodePtr
,LONG
*);
255 HRESULT (*get_qualified_item
)(const xmlNodePtr
,BSTR
,BSTR
,IXMLDOMNode
**);
256 HRESULT (*remove_qualified_item
)(xmlNodePtr
,BSTR
,BSTR
,IXMLDOMNode
**);
257 HRESULT (*next_node
)(const xmlNodePtr
,LONG
*,IXMLDOMNode
**);
260 /* used by IEnumVARIANT to access outer object items */
261 struct enumvariant_funcs
263 HRESULT (*get_item
)(IUnknown
*, LONG
, VARIANT
*);
264 HRESULT (*next
)(IUnknown
*);
268 extern IUnknown
*create_domdoc( xmlNodePtr
) DECLSPEC_HIDDEN
;
269 extern IUnknown
*create_xmldoc( void ) DECLSPEC_HIDDEN
;
270 extern IXMLDOMNode
*create_node( xmlNodePtr
) DECLSPEC_HIDDEN
;
271 extern IUnknown
*create_element( xmlNodePtr
) DECLSPEC_HIDDEN
;
272 extern IUnknown
*create_attribute( xmlNodePtr
) DECLSPEC_HIDDEN
;
273 extern IUnknown
*create_text( xmlNodePtr
) DECLSPEC_HIDDEN
;
274 extern IUnknown
*create_pi( xmlNodePtr
) DECLSPEC_HIDDEN
;
275 extern IUnknown
*create_comment( xmlNodePtr
) DECLSPEC_HIDDEN
;
276 extern IUnknown
*create_cdata( xmlNodePtr
) DECLSPEC_HIDDEN
;
277 extern IXMLDOMNodeList
*create_children_nodelist( xmlNodePtr
) DECLSPEC_HIDDEN
;
278 extern IXMLDOMNamedNodeMap
*create_nodemap( xmlNodePtr
, const struct nodemap_funcs
* ) DECLSPEC_HIDDEN
;
279 extern IUnknown
*create_doc_Implementation(void) DECLSPEC_HIDDEN
;
280 extern IUnknown
*create_doc_fragment( xmlNodePtr
) DECLSPEC_HIDDEN
;
281 extern IUnknown
*create_doc_entity_ref( xmlNodePtr
) DECLSPEC_HIDDEN
;
282 extern IUnknown
*create_doc_type( xmlNodePtr
) DECLSPEC_HIDDEN
;
283 extern HRESULT
create_selection( xmlNodePtr
, xmlChar
*, IXMLDOMNodeList
** ) DECLSPEC_HIDDEN
;
284 extern HRESULT
create_enumvariant( IUnknown
*, BOOL
, const struct enumvariant_funcs
*, IEnumVARIANT
**) DECLSPEC_HIDDEN
;
287 xmlNodePtr
xmlNodePtr_from_domnode( IXMLDOMNode
*iface
, xmlElementType type
) DECLSPEC_HIDDEN
;
290 extern xmlChar
*xmlChar_from_wchar( LPCWSTR str
) DECLSPEC_HIDDEN
;
292 extern void xmldoc_init( xmlDocPtr doc
, MSXML_VERSION version
) DECLSPEC_HIDDEN
;
293 extern LONG
xmldoc_add_ref( xmlDocPtr doc
) DECLSPEC_HIDDEN
;
294 extern LONG
xmldoc_release( xmlDocPtr doc
) DECLSPEC_HIDDEN
;
295 extern LONG
xmldoc_add_refs( xmlDocPtr doc
, LONG refs
) DECLSPEC_HIDDEN
;
296 extern LONG
xmldoc_release_refs ( xmlDocPtr doc
, LONG refs
) DECLSPEC_HIDDEN
;
297 extern int xmlnode_get_inst_cnt( xmlnode
*node
) DECLSPEC_HIDDEN
;
298 extern HRESULT
xmldoc_add_orphan( xmlDocPtr doc
, xmlNodePtr node
) DECLSPEC_HIDDEN
;
299 extern HRESULT
xmldoc_remove_orphan( xmlDocPtr doc
, xmlNodePtr node
) DECLSPEC_HIDDEN
;
300 extern void xmldoc_link_xmldecl(xmlDocPtr doc
, xmlNodePtr node
) DECLSPEC_HIDDEN
;
301 extern xmlNodePtr
xmldoc_unlink_xmldecl(xmlDocPtr doc
) DECLSPEC_HIDDEN
;
303 extern HRESULT
XMLElement_create( IUnknown
*pUnkOuter
, xmlNodePtr node
, LPVOID
*ppObj
, BOOL own
) DECLSPEC_HIDDEN
;
305 extern void wineXmlCallbackLog(char const* caller
, xmlErrorLevel lvl
, char const* msg
, va_list ap
) DECLSPEC_HIDDEN
;
306 extern void wineXmlCallbackError(char const* caller
, xmlErrorPtr err
) DECLSPEC_HIDDEN
;
308 #define LIBXML2_LOG_CALLBACK __WINE_PRINTF_ATTR(2,3)
310 #define LIBXML2_CALLBACK_TRACE(caller, msg, ap) \
311 wineXmlCallbackLog(#caller, XML_ERR_NONE, msg, ap)
313 #define LIBXML2_CALLBACK_WARN(caller, msg, ap) \
314 wineXmlCallbackLog(#caller, XML_ERR_WARNING, msg, ap)
316 #define LIBXML2_CALLBACK_ERR(caller, msg, ap) \
317 wineXmlCallbackLog(#caller, XML_ERR_ERROR, msg, ap)
319 #define LIBXML2_CALLBACK_SERROR(caller, err) wineXmlCallbackError(#caller, err)
321 extern BOOL
is_preserving_whitespace(xmlNodePtr node
) DECLSPEC_HIDDEN
;
322 extern BOOL
is_xpathmode(const xmlDocPtr doc
) DECLSPEC_HIDDEN
;
323 extern void set_xpathmode(xmlDocPtr doc
, BOOL xpath
) DECLSPEC_HIDDEN
;
325 extern void init_xmlnode(xmlnode
*,xmlNodePtr
,IXMLDOMNode
*,dispex_static_data_t
*) DECLSPEC_HIDDEN
;
326 extern void destroy_xmlnode(xmlnode
*) DECLSPEC_HIDDEN
;
327 extern BOOL
node_query_interface(xmlnode
*,REFIID
,void**) DECLSPEC_HIDDEN
;
328 extern xmlnode
*get_node_obj(IXMLDOMNode
*) DECLSPEC_HIDDEN
;
330 extern HRESULT
node_append_child(xmlnode
*,IXMLDOMNode
*,IXMLDOMNode
**) DECLSPEC_HIDDEN
;
331 extern HRESULT
node_get_nodeName(xmlnode
*,BSTR
*) DECLSPEC_HIDDEN
;
332 extern HRESULT
node_get_content(xmlnode
*,VARIANT
*) DECLSPEC_HIDDEN
;
333 extern HRESULT
node_set_content(xmlnode
*,LPCWSTR
) DECLSPEC_HIDDEN
;
334 extern HRESULT
node_put_value(xmlnode
*,VARIANT
*) DECLSPEC_HIDDEN
;
335 extern HRESULT
node_put_value_escaped(xmlnode
*,VARIANT
*) DECLSPEC_HIDDEN
;
336 extern HRESULT
node_get_parent(xmlnode
*,IXMLDOMNode
**) DECLSPEC_HIDDEN
;
337 extern HRESULT
node_get_child_nodes(xmlnode
*,IXMLDOMNodeList
**) DECLSPEC_HIDDEN
;
338 extern HRESULT
node_get_first_child(xmlnode
*,IXMLDOMNode
**) DECLSPEC_HIDDEN
;
339 extern HRESULT
node_get_last_child(xmlnode
*,IXMLDOMNode
**) DECLSPEC_HIDDEN
;
340 extern HRESULT
node_get_previous_sibling(xmlnode
*,IXMLDOMNode
**) DECLSPEC_HIDDEN
;
341 extern HRESULT
node_get_next_sibling(xmlnode
*,IXMLDOMNode
**) DECLSPEC_HIDDEN
;
342 extern HRESULT
node_insert_before(xmlnode
*,IXMLDOMNode
*,const VARIANT
*,IXMLDOMNode
**) DECLSPEC_HIDDEN
;
343 extern HRESULT
node_replace_child(xmlnode
*,IXMLDOMNode
*,IXMLDOMNode
*,IXMLDOMNode
**) DECLSPEC_HIDDEN
;
344 extern HRESULT
node_put_text(xmlnode
*,BSTR
) DECLSPEC_HIDDEN
;
345 extern HRESULT
node_get_xml(xmlnode
*,BOOL
,BSTR
*) DECLSPEC_HIDDEN
;
346 extern HRESULT
node_clone(xmlnode
*,VARIANT_BOOL
,IXMLDOMNode
**) DECLSPEC_HIDDEN
;
347 extern HRESULT
node_get_prefix(xmlnode
*,BSTR
*) DECLSPEC_HIDDEN
;
348 extern HRESULT
node_get_base_name(xmlnode
*,BSTR
*) DECLSPEC_HIDDEN
;
349 extern HRESULT
node_get_namespaceURI(xmlnode
*,BSTR
*) DECLSPEC_HIDDEN
;
350 extern HRESULT
node_remove_child(xmlnode
*,IXMLDOMNode
*,IXMLDOMNode
**) DECLSPEC_HIDDEN
;
351 extern HRESULT
node_has_childnodes(const xmlnode
*,VARIANT_BOOL
*) DECLSPEC_HIDDEN
;
352 extern HRESULT
node_get_owner_doc(const xmlnode
*,IXMLDOMDocument
**) DECLSPEC_HIDDEN
;
353 extern HRESULT
node_get_text(const xmlnode
*,BSTR
*) DECLSPEC_HIDDEN
;
354 extern HRESULT
node_select_nodes(const xmlnode
*,BSTR
,IXMLDOMNodeList
**) DECLSPEC_HIDDEN
;
355 extern HRESULT
node_select_singlenode(const xmlnode
*,BSTR
,IXMLDOMNode
**) DECLSPEC_HIDDEN
;
356 extern HRESULT
node_transform_node(const xmlnode
*,IXMLDOMNode
*,BSTR
*) DECLSPEC_HIDDEN
;
357 extern HRESULT
node_create_supporterrorinfo(const tid_t
*,void**) DECLSPEC_HIDDEN
;
359 extern HRESULT
get_domdoc_from_xmldoc(xmlDocPtr xmldoc
, IXMLDOMDocument3
**document
) DECLSPEC_HIDDEN
;
361 extern HRESULT
SchemaCache_validate_tree(IXMLDOMSchemaCollection2
*, xmlNodePtr
) DECLSPEC_HIDDEN
;
362 extern XDR_DT
SchemaCache_get_node_dt(IXMLDOMSchemaCollection2
*, xmlNodePtr
) DECLSPEC_HIDDEN
;
363 extern HRESULT
cache_from_doc_ns(IXMLDOMSchemaCollection2
*, xmlnode
*) DECLSPEC_HIDDEN
;
365 extern XDR_DT
str_to_dt(xmlChar
const* str
, int len
/* calculated if -1 */) DECLSPEC_HIDDEN
;
366 extern XDR_DT
bstr_to_dt(OLECHAR
const* bstr
, int len
/* calculated if -1 */) DECLSPEC_HIDDEN
;
367 extern xmlChar
const* dt_to_str(XDR_DT dt
) DECLSPEC_HIDDEN
;
368 extern const char* debugstr_dt(XDR_DT dt
) DECLSPEC_HIDDEN
;
369 extern OLECHAR
const* dt_to_bstr(XDR_DT dt
) DECLSPEC_HIDDEN
;
370 extern HRESULT
dt_validate(XDR_DT dt
, xmlChar
const* content
) DECLSPEC_HIDDEN
;
372 extern BSTR
EnsureCorrectEOL(BSTR
) DECLSPEC_HIDDEN
;
374 extern xmlChar
* tagName_to_XPath(const BSTR tagName
) DECLSPEC_HIDDEN
;
376 static inline BSTR
bstr_from_xmlChar(const xmlChar
*str
)
381 DWORD len
= MultiByteToWideChar(CP_UTF8
, 0, (LPCSTR
)str
, -1, NULL
, 0);
382 ret
= SysAllocStringLen(NULL
, len
-1);
384 MultiByteToWideChar( CP_UTF8
, 0, (LPCSTR
)str
, -1, ret
, len
);
387 ret
= SysAllocStringLen(NULL
, 0);
392 static inline xmlChar
*xmlchar_from_wcharn(const WCHAR
*str
, int nchars
)
395 DWORD len
= WideCharToMultiByte( CP_UTF8
, 0, str
, nchars
, NULL
, 0, NULL
, NULL
);
397 xmlstr
= heap_alloc( len
+1 );
400 WideCharToMultiByte( CP_UTF8
, 0, str
, nchars
, (LPSTR
) xmlstr
, len
+1, NULL
, NULL
);
406 static inline xmlChar
*xmlchar_from_wchar( const WCHAR
*str
)
408 return xmlchar_from_wcharn(str
, -1);
411 static inline xmlChar
*heap_strdupxmlChar(const xmlChar
*str
)
418 size
= (xmlStrlen(str
)+1)*sizeof(xmlChar
);
419 ret
= heap_alloc(size
);
420 memcpy(ret
, str
, size
);
428 static inline HRESULT
return_bstr(const WCHAR
*value
, BSTR
*p
)
434 *p
= SysAllocString(value
);
436 return E_OUTOFMEMORY
;
444 static inline HRESULT
return_null_node(IXMLDOMNode
**p
)
452 static inline HRESULT
return_null_ptr(void **p
)
460 static inline HRESULT
return_null_var(VARIANT
*p
)
469 static inline HRESULT
return_null_bstr(BSTR
*p
)
478 static inline HRESULT
return_var_false(VARIANT_BOOL
*p
)
487 extern IXMLDOMParseError
*create_parseError( LONG code
, BSTR url
, BSTR reason
, BSTR srcText
,
488 LONG line
, LONG linepos
, LONG filepos
) DECLSPEC_HIDDEN
;
489 extern HRESULT
DOMDocument_create(MSXML_VERSION
, IUnknown
*, void**) DECLSPEC_HIDDEN
;
490 extern HRESULT
SchemaCache_create(MSXML_VERSION
, IUnknown
*, void**) DECLSPEC_HIDDEN
;
491 extern HRESULT
XMLDocument_create(IUnknown
*, void**) DECLSPEC_HIDDEN
;
492 extern HRESULT
SAXXMLReader_create(MSXML_VERSION
, IUnknown
*, void**) DECLSPEC_HIDDEN
;
493 extern HRESULT
SAXAttributes_create(MSXML_VERSION
, IUnknown
*, void**) DECLSPEC_HIDDEN
;
494 extern HRESULT
XMLHTTPRequest_create(IUnknown
*, void **) DECLSPEC_HIDDEN
;
495 extern HRESULT
ServerXMLHTTP_create(IUnknown
*, void **) DECLSPEC_HIDDEN
;
496 extern HRESULT
XSLTemplate_create(IUnknown
*, void**) DECLSPEC_HIDDEN
;
497 extern HRESULT
MXWriter_create(MSXML_VERSION
, IUnknown
*, void**) DECLSPEC_HIDDEN
;
498 extern HRESULT
MXNamespaceManager_create(IUnknown
*,void**) DECLSPEC_HIDDEN
;
499 extern HRESULT
XMLParser_create(IUnknown
*,void**) DECLSPEC_HIDDEN
;
500 extern HRESULT
XMLView_create(IUnknown
*,void**) DECLSPEC_HIDDEN
;
502 static inline const CLSID
* DOMDocument_version(MSXML_VERSION v
)
507 case MSXML_DEFAULT
: return &CLSID_DOMDocument
;
508 case MSXML3
: return &CLSID_DOMDocument30
;
509 case MSXML4
: return &CLSID_DOMDocument40
;
510 case MSXML6
: return &CLSID_DOMDocument60
;
514 static inline const CLSID
* SchemaCache_version(MSXML_VERSION v
)
519 case MSXML_DEFAULT
: return &CLSID_XMLSchemaCache
;
520 case MSXML3
: return &CLSID_XMLSchemaCache30
;
521 case MSXML4
: return &CLSID_XMLSchemaCache40
;
522 case MSXML6
: return &CLSID_XMLSchemaCache60
;
526 typedef struct bsc_t bsc_t
;
528 HRESULT
create_moniker_from_url(LPCWSTR
, IMoniker
**) DECLSPEC_HIDDEN
;
529 HRESULT
bind_url(IMoniker
*, HRESULT (*onDataAvailable
)(void*,char*,DWORD
), void*, bsc_t
**) DECLSPEC_HIDDEN
;
530 HRESULT
detach_bsc(bsc_t
*) DECLSPEC_HIDDEN
;
532 const char *debugstr_variant(const VARIANT
*) DECLSPEC_HIDDEN
;
534 /* Error Codes - not defined anywhere in the public headers */
535 #define E_XML_ELEMENT_UNDECLARED 0xC00CE00D
536 #define E_XML_ELEMENT_ID_NOT_FOUND 0xC00CE00E
538 #define E_XML_EMPTY_NOT_ALLOWED 0xC00CE011
539 #define E_XML_ELEMENT_NOT_COMPLETE 0xC00CE012
540 #define E_XML_ROOT_NAME_MISMATCH 0xC00CE013
541 #define E_XML_INVALID_CONTENT 0xC00CE014
542 #define E_XML_ATTRIBUTE_NOT_DEFINED 0xC00CE015
543 #define E_XML_ATTRIBUTE_FIXED 0xC00CE016
544 #define E_XML_ATTRIBUTE_VALUE 0xC00CE017
545 #define E_XML_ILLEGAL_TEXT 0xC00CE018
547 #define E_XML_REQUIRED_ATTRIBUTE_MISSING 0xC00CE020
549 #endif /* __MSXML_PRIVATE__ */