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
42 IXMLDOMCDATASection_tid
,
46 IXMLDOMDocumentFragment_tid
,
47 IXMLDOMDocumentType_tid
,
49 IXMLDOMEntityReference_tid
,
50 IXMLDOMImplementation_tid
,
51 IXMLDOMNamedNodeMap_tid
,
54 IXMLDOMParseError_tid
,
55 IXMLDOMProcessingInstruction_tid
,
56 IXMLDOMSchemaCollection_tid
,
65 IVBSAXContentHandler_tid
,
66 IVBSAXDeclHandler_tid
,
68 IVBSAXEntityResolver_tid
,
69 IVBSAXErrorHandler_tid
,
70 IVBSAXLexicalHandler_tid
,
80 /* The XDR datatypes (urn:schemas-microsoft-com:datatypes)
81 * These are actually valid for XSD schemas as well
84 typedef enum _XDR_DT
{
123 #define DT__N_TYPES (DT_UUID+1)
125 extern HRESULT
get_typeinfo(tid_t tid
, ITypeInfo
**typeinfo
);
126 extern void release_typelib(void);
128 typedef struct dispex_data_t dispex_data_t
;
129 typedef struct dispex_dynamic_data_t dispex_dynamic_data_t
;
131 #define MSXML_DISPID_CUSTOM_MIN 0x60000000
132 #define MSXML_DISPID_CUSTOM_MAX 0x6fffffff
135 HRESULT (*get_dispid
)(IUnknown
*,BSTR
,DWORD
,DISPID
*);
136 HRESULT (*invoke
)(IUnknown
*,DISPID
,LCID
,WORD
,DISPPARAMS
*,VARIANT
*,EXCEPINFO
*);
137 } dispex_static_data_vtbl_t
;
140 const dispex_static_data_vtbl_t
*vtbl
;
141 const tid_t disp_tid
;
143 const tid_t
* const iface_tids
;
144 } dispex_static_data_t
;
147 IDispatchEx IDispatchEx_iface
;
151 dispex_static_data_t
*data
;
152 dispex_dynamic_data_t
*dynamic_data
;
155 extern HINSTANCE MSXML_hInstance
;
157 void init_dispex(DispatchEx
*,IUnknown
*,dispex_static_data_t
*);
158 BOOL
dispex_query_interface(DispatchEx
*,REFIID
,void**);
160 /* memory allocation functions */
162 static inline void *heap_alloc(size_t len
)
164 return HeapAlloc(GetProcessHeap(), 0, len
);
167 static inline void *heap_alloc_zero(size_t len
)
169 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
172 static inline void *heap_realloc(void *mem
, size_t len
)
174 return HeapReAlloc(GetProcessHeap(), 0, mem
, len
);
177 static inline BOOL
heap_free(void *mem
)
179 return HeapFree(GetProcessHeap(), 0, mem
);
182 static inline LPWSTR
heap_strdupW(LPCWSTR str
)
189 size
= (strlenW(str
)+1)*sizeof(WCHAR
);
190 ret
= heap_alloc(size
);
191 memcpy(ret
, str
, size
);
199 extern void schemasInit(void);
200 extern void schemasCleanup(void);
202 #ifndef HAVE_XMLFIRSTELEMENTCHILD
203 static inline xmlNodePtr
wine_xmlFirstElementChild(xmlNodePtr parent
)
206 for (child
= parent
->children
; child
!= NULL
; child
= child
->next
)
207 if (child
->type
== XML_ELEMENT_NODE
)
212 #define xmlFirstElementChild wine_xmlFirstElementChild
216 extern IUnknown
*create_domdoc( xmlNodePtr
);
217 extern IUnknown
*create_xmldoc( void );
218 extern IXMLDOMNode
*create_node( xmlNodePtr
);
219 extern IUnknown
*create_element( xmlNodePtr
);
220 extern IUnknown
*create_attribute( xmlNodePtr
);
221 extern IUnknown
*create_text( xmlNodePtr
);
222 extern IUnknown
*create_pi( xmlNodePtr
);
223 extern IUnknown
*create_comment( xmlNodePtr
);
224 extern IUnknown
*create_cdata( xmlNodePtr
);
225 extern IXMLDOMNodeList
*create_children_nodelist( xmlNodePtr
);
226 extern IXMLDOMNamedNodeMap
*create_nodemap( const xmlNodePtr
);
227 extern IUnknown
*create_doc_Implementation(void);
228 extern IUnknown
*create_doc_fragment( xmlNodePtr
);
229 extern IUnknown
*create_doc_entity_ref( xmlNodePtr
);
230 extern IUnknown
*create_doc_type( xmlNodePtr
);
231 extern HRESULT
create_selection( xmlNodePtr
, xmlChar
*, IXMLDOMNodeList
** );
234 xmlNodePtr
xmlNodePtr_from_domnode( IXMLDOMNode
*iface
, xmlElementType type
);
237 extern xmlChar
*xmlChar_from_wchar( LPCWSTR str
);
239 extern void xmldoc_init( xmlDocPtr doc
, const GUID
*clsid
);
240 extern LONG
xmldoc_add_ref( xmlDocPtr doc
);
241 extern LONG
xmldoc_release( xmlDocPtr doc
);
242 extern HRESULT
xmldoc_add_orphan( xmlDocPtr doc
, xmlNodePtr node
);
243 extern HRESULT
xmldoc_remove_orphan( xmlDocPtr doc
, xmlNodePtr node
);
244 extern void xmldoc_link_xmldecl(xmlDocPtr doc
, xmlNodePtr node
);
245 extern xmlNodePtr
xmldoc_unlink_xmldecl(xmlDocPtr doc
);
247 extern HRESULT
XMLElement_create( IUnknown
*pUnkOuter
, xmlNodePtr node
, LPVOID
*ppObj
, BOOL own
);
249 extern void wineXmlCallbackLog(char const* caller
, xmlErrorLevel lvl
, char const* msg
, va_list ap
);
250 extern void wineXmlCallbackError(char const* caller
, xmlErrorPtr err
);
252 #define LIBXML2_LOG_CALLBACK __WINE_PRINTF_ATTR(2,3)
254 #define LIBXML2_CALLBACK_TRACE(caller, msg, ap) \
255 wineXmlCallbackLog(#caller, XML_ERR_NONE, msg, ap)
257 #define LIBXML2_CALLBACK_WARN(caller, msg, ap) \
258 wineXmlCallbackLog(#caller, XML_ERR_WARNING, msg, ap)
260 #define LIBXML2_CALLBACK_ERR(caller, msg, ap) \
261 wineXmlCallbackLog(#caller, XML_ERR_ERROR, msg, ap)
263 #define LIBXML2_CALLBACK_SERROR(caller, err) wineXmlCallbackError(#caller, err)
265 extern BOOL
is_preserving_whitespace(xmlNodePtr node
);
266 extern BOOL
is_xpathmode(const xmlDocPtr doc
);
267 extern void set_xpathmode(xmlDocPtr doc
, BOOL xpath
);
269 /* IXMLDOMNode Internal Structure */
270 typedef struct _xmlnode
278 extern void init_xmlnode(xmlnode
*,xmlNodePtr
,IXMLDOMNode
*,dispex_static_data_t
*);
279 extern void destroy_xmlnode(xmlnode
*);
280 extern BOOL
node_query_interface(xmlnode
*,REFIID
,void**);
281 extern xmlnode
*get_node_obj(IXMLDOMNode
*);
283 extern HRESULT
node_append_child(xmlnode
*,IXMLDOMNode
*,IXMLDOMNode
**);
284 extern HRESULT
node_get_nodeName(xmlnode
*,BSTR
*);
285 extern HRESULT
node_get_content(xmlnode
*,VARIANT
*);
286 extern HRESULT
node_set_content(xmlnode
*,LPCWSTR
);
287 extern HRESULT
node_put_value(xmlnode
*,VARIANT
*);
288 extern HRESULT
node_put_value_escaped(xmlnode
*,VARIANT
*);
289 extern HRESULT
node_get_parent(xmlnode
*,IXMLDOMNode
**);
290 extern HRESULT
node_get_child_nodes(xmlnode
*,IXMLDOMNodeList
**);
291 extern HRESULT
node_get_first_child(xmlnode
*,IXMLDOMNode
**);
292 extern HRESULT
node_get_last_child(xmlnode
*,IXMLDOMNode
**);
293 extern HRESULT
node_get_previous_sibling(xmlnode
*,IXMLDOMNode
**);
294 extern HRESULT
node_get_next_sibling(xmlnode
*,IXMLDOMNode
**);
295 extern HRESULT
node_insert_before(xmlnode
*,IXMLDOMNode
*,const VARIANT
*,IXMLDOMNode
**);
296 extern HRESULT
node_replace_child(xmlnode
*,IXMLDOMNode
*,IXMLDOMNode
*,IXMLDOMNode
**);
297 extern HRESULT
node_put_text(xmlnode
*,BSTR
);
298 extern HRESULT
node_get_xml(xmlnode
*,BOOL
,BOOL
,BSTR
*);
299 extern HRESULT
node_clone(xmlnode
*,VARIANT_BOOL
,IXMLDOMNode
**);
300 extern HRESULT
node_get_prefix(xmlnode
*,BSTR
*);
301 extern HRESULT
node_get_base_name(xmlnode
*,BSTR
*);
302 extern HRESULT
node_get_namespaceURI(xmlnode
*,BSTR
*);
303 extern HRESULT
node_remove_child(xmlnode
*,IXMLDOMNode
*,IXMLDOMNode
**);
304 extern HRESULT
node_has_childnodes(const xmlnode
*,VARIANT_BOOL
*);
305 extern HRESULT
node_get_owner_doc(const xmlnode
*,IXMLDOMDocument
**);
306 extern HRESULT
node_get_text(const xmlnode
*,BSTR
*);
307 extern HRESULT
node_select_nodes(const xmlnode
*,BSTR
,IXMLDOMNodeList
**);
308 extern HRESULT
node_select_singlenode(const xmlnode
*,BSTR
,IXMLDOMNode
**);
309 extern HRESULT
node_transform_node(const xmlnode
*,IXMLDOMNode
*,BSTR
*);
311 extern HRESULT
get_domdoc_from_xmldoc(xmlDocPtr xmldoc
, IXMLDOMDocument3
**document
);
313 extern HRESULT
SchemaCache_validate_tree(IXMLDOMSchemaCollection2
* iface
, xmlNodePtr tree
);
314 extern XDR_DT
SchemaCache_get_node_dt(IXMLDOMSchemaCollection2
* iface
, xmlNodePtr node
);
316 extern XDR_DT
str_to_dt(xmlChar
const* str
, int len
/* calculated if -1 */);
317 extern XDR_DT
bstr_to_dt(OLECHAR
const* bstr
, int len
/* calculated if -1 */);
318 extern xmlChar
const* dt_to_str(XDR_DT dt
);
319 extern OLECHAR
const* dt_to_bstr(XDR_DT dt
);
320 extern HRESULT
dt_validate(XDR_DT dt
, xmlChar
const* content
);
322 extern BSTR
EnsureCorrectEOL(BSTR
);
324 extern xmlChar
* tagName_to_XPath(const BSTR tagName
);
326 static inline BSTR
bstr_from_xmlChar(const xmlChar
*str
)
331 DWORD len
= MultiByteToWideChar(CP_UTF8
, 0, (LPCSTR
)str
, -1, NULL
, 0);
332 ret
= SysAllocStringLen(NULL
, len
-1);
334 MultiByteToWideChar( CP_UTF8
, 0, (LPCSTR
)str
, -1, ret
, len
);
337 ret
= SysAllocStringLen(NULL
, 0);
342 static inline HRESULT
return_bstr(const WCHAR
*value
, BSTR
*p
)
348 *p
= SysAllocString(value
);
350 return E_OUTOFMEMORY
;
358 static inline HRESULT
return_null_node(IXMLDOMNode
**p
)
366 static inline HRESULT
return_null_ptr(void **p
)
374 static inline HRESULT
return_null_var(VARIANT
*p
)
383 static inline HRESULT
return_null_bstr(BSTR
*p
)
392 static inline xmlChar
*xmlchar_from_wchar( LPCWSTR str
)
395 DWORD len
= WideCharToMultiByte( CP_UTF8
, 0, str
, -1, NULL
, 0, NULL
, NULL
);
397 xmlstr
= heap_alloc( len
);
399 WideCharToMultiByte( CP_UTF8
, 0, str
, -1, (LPSTR
) xmlstr
, len
, NULL
, NULL
);
405 extern IXMLDOMParseError
*create_parseError( LONG code
, BSTR url
, BSTR reason
, BSTR srcText
,
406 LONG line
, LONG linepos
, LONG filepos
);
407 extern HRESULT
DOMDocument_create(const GUID
*, IUnknown
*, void**);
408 extern HRESULT
SchemaCache_create(const GUID
*, IUnknown
*, void**);
409 extern HRESULT
XMLDocument_create(IUnknown
*, void**);
410 extern HRESULT
SAXXMLReader_create(IUnknown
*, void**);
411 extern HRESULT
XMLHTTPRequest_create(IUnknown
*, void **);
412 extern HRESULT
XSLTemplate_create(IUnknown
*, void**);
414 static inline const CLSID
* DOMDocument_version(MSXML_VERSION v
)
419 case MSXML_DEFAULT
: return &CLSID_DOMDocument
;
420 case MSXML3
: return &CLSID_DOMDocument30
;
421 case MSXML4
: return &CLSID_DOMDocument40
;
422 case MSXML6
: return &CLSID_DOMDocument60
;
426 static inline const CLSID
* SchemaCache_version(MSXML_VERSION v
)
431 case MSXML_DEFAULT
: return &CLSID_XMLSchemaCache
;
432 case MSXML3
: return &CLSID_XMLSchemaCache30
;
433 case MSXML4
: return &CLSID_XMLSchemaCache40
;
434 case MSXML6
: return &CLSID_XMLSchemaCache60
;
438 typedef struct bsc_t bsc_t
;
440 HRESULT
bind_url(LPCWSTR
, HRESULT (*onDataAvailable
)(void*,char*,DWORD
), void*, bsc_t
**);
441 void detach_bsc(bsc_t
*);
443 const char *debugstr_variant(const VARIANT
*);
445 /* Error Codes - not defined anywhere in the public headers */
446 #define E_XML_ELEMENT_UNDECLARED 0xC00CE00D
447 #define E_XML_ELEMENT_ID_NOT_FOUND 0xC00CE00E
449 #define E_XML_EMPTY_NOT_ALLOWED 0xC00CE011
450 #define E_XML_ELEMENT_NOT_COMPLETE 0xC00CE012
451 #define E_XML_ROOT_NAME_MISMATCH 0xC00CE013
452 #define E_XML_INVALID_CONTENT 0xC00CE014
453 #define E_XML_ATTRIBUTE_NOT_DEFINED 0xC00CE015
454 #define E_XML_ATTRIBUTE_FIXED 0xC00CE016
455 #define E_XML_ATTRIBUTE_VALUE 0xC00CE017
456 #define E_XML_ILLEGAL_TEXT 0xC00CE018
458 #define E_XML_REQUIRED_ATTRIBUTE_MISSING 0xC00CE020
460 #endif /* __MSXML_PRIVATE__ */