4 * Copyright 2005 Mike McCormack
6 * iface 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 * iface 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
37 #include "msxml_private.h"
39 #include "wine/debug.h"
41 WINE_DEFAULT_DEBUG_CHANNEL(msxml
);
45 typedef struct _xmlnode
47 const struct IXMLDOMNodeVtbl
*lpVtbl
;
52 static inline xmlnode
*impl_from_IXMLDOMNode( IXMLDOMNode
*iface
)
54 return (xmlnode
*)((char*)iface
- FIELD_OFFSET(xmlnode
, lpVtbl
));
57 xmlNodePtr
xmlNodePtr_from_domnode( IXMLDOMNode
*iface
, xmlElementType type
)
63 This
= impl_from_IXMLDOMNode( iface
);
66 if ( type
&& This
->node
->type
!= type
)
71 static HRESULT WINAPI
xmlnode_QueryInterface(
76 TRACE("%p %p %p\n", iface
, debugstr_guid(riid
), ppvObject
);
78 if ( IsEqualGUID( riid
, &IID_IUnknown
) ||
79 IsEqualGUID( riid
, &IID_IDispatch
) ||
80 IsEqualGUID( riid
, &IID_IXMLDOMNode
) )
87 IXMLDOMElement_AddRef( iface
);
92 static ULONG WINAPI
xmlnode_AddRef(
95 xmlnode
*This
= impl_from_IXMLDOMNode( iface
);
96 return InterlockedIncrement( &This
->ref
);
99 static ULONG WINAPI
xmlnode_Release(
102 xmlnode
*This
= impl_from_IXMLDOMNode( iface
);
105 ref
= InterlockedDecrement( &This
->ref
);
108 if( This
->node
->type
== XML_DOCUMENT_NODE
)
110 xmlFreeDoc( (xmlDocPtr
) This
->node
);
115 assert( This
->node
->doc
);
116 root
= This
->node
->doc
->_private
;
118 IXMLDOMNode_Release( root
);
119 This
->node
->_private
= NULL
;
121 HeapFree( GetProcessHeap(), 0, This
);
127 static HRESULT WINAPI
xmlnode_GetTypeInfoCount(
135 static HRESULT WINAPI
xmlnode_GetTypeInfo(
139 ITypeInfo
** ppTInfo
)
145 static HRESULT WINAPI
xmlnode_GetIDsOfNames(
157 static HRESULT WINAPI
xmlnode_Invoke(
163 DISPPARAMS
* pDispParams
,
165 EXCEPINFO
* pExcepInfo
,
172 static HRESULT WINAPI
xmlnode_get_nodeName(
180 BSTR
bstr_from_xmlChar( const xmlChar
*buf
)
189 len
= MultiByteToWideChar( CP_UTF8
, 0, (LPCSTR
) buf
, -1, NULL
, 0 );
190 str
= (LPWSTR
) HeapAlloc( GetProcessHeap(), 0, len
* sizeof (WCHAR
) );
193 MultiByteToWideChar( CP_UTF8
, 0, (LPCSTR
) buf
, -1, str
, len
);
194 bstr
= SysAllocString( str
);
195 HeapFree( GetProcessHeap(), 0, str
);
199 static HRESULT WINAPI
xmlnode_get_nodeValue(
203 xmlnode
*This
= impl_from_IXMLDOMNode( iface
);
206 TRACE("%p %p\n", This
, value
);
208 V_BSTR(value
) = NULL
;
209 V_VT(value
) = VT_NULL
;
211 switch ( This
->node
->type
)
213 case XML_ATTRIBUTE_NODE
:
214 V_VT(value
) = VT_BSTR
;
215 V_BSTR(value
) = bstr_from_xmlChar( This
->node
->name
);
219 V_VT(value
) = VT_BSTR
;
220 V_BSTR(value
) = bstr_from_xmlChar( This
->node
->content
);
223 case XML_ELEMENT_NODE
:
224 case XML_DOCUMENT_NODE
:
225 /* these seem to return NULL */
229 FIXME("node %p type %d\n", This
, This
->node
->type
);
232 TRACE("%p returned %s\n", This
, debugstr_w( V_BSTR(value
) ) );
237 static HRESULT WINAPI
xmlnode_put_nodeValue(
245 static HRESULT WINAPI
xmlnode_get_nodeType(
249 xmlnode
*This
= impl_from_IXMLDOMNode( iface
);
251 TRACE("%p %p\n", This
, type
);
253 assert( NODE_ELEMENT
== XML_ELEMENT_NODE
);
254 assert( NODE_NOTATION
== XML_NOTATION_NODE
);
256 *type
= This
->node
->type
;
261 static HRESULT WINAPI
xmlnode_get_parentNode(
263 IXMLDOMNode
** parent
)
269 static HRESULT WINAPI
xmlnode_get_childNodes(
271 IXMLDOMNodeList
** childList
)
273 xmlnode
*This
= impl_from_IXMLDOMNode( iface
);
275 TRACE("%p %p\n", This
, childList
);
280 *childList
= create_nodelist( This
->node
->children
);
287 static HRESULT WINAPI
xmlnode_get_firstChild(
289 IXMLDOMNode
** firstChild
)
295 static HRESULT WINAPI
xmlnode_get_lastChild(
297 IXMLDOMNode
** lastChild
)
303 static HRESULT WINAPI
xmlnode_get_previousSibling(
305 IXMLDOMNode
** previousSibling
)
311 static HRESULT WINAPI
xmlnode_get_nextSibling(
313 IXMLDOMNode
** nextSibling
)
319 static HRESULT WINAPI
xmlnode_get_attributes(
321 IXMLDOMNamedNodeMap
** attributeMap
)
323 xmlnode
*This
= impl_from_IXMLDOMNode( iface
);
325 *attributeMap
= create_nodemap( iface
);
329 static HRESULT WINAPI
xmlnode_insertBefore(
331 IXMLDOMNode
* newChild
,
333 IXMLDOMNode
** outNewChild
)
339 static HRESULT WINAPI
xmlnode_replaceChild(
341 IXMLDOMNode
* newChild
,
342 IXMLDOMNode
* oldChild
,
343 IXMLDOMNode
** outOldChild
)
349 static HRESULT WINAPI
xmlnode_removeChild(
351 IXMLDOMNode
* childNode
,
352 IXMLDOMNode
** oldChild
)
358 static HRESULT WINAPI
xmlnode_appendChild(
360 IXMLDOMNode
* newChild
,
361 IXMLDOMNode
** outNewChild
)
367 static HRESULT WINAPI
xmlnode_hasChildNodes(
369 VARIANT_BOOL
* hasChild
)
375 static HRESULT WINAPI
xmlnode_get_ownerDocument(
377 IXMLDOMDocument
** DOMDocument
)
383 static HRESULT WINAPI
xmlnode_cloneNode(
386 IXMLDOMNode
** cloneRoot
)
392 static HRESULT WINAPI
xmlnode_get_nodeTypeString(
400 static HRESULT WINAPI
xmlnode_get_text(
404 xmlnode
*This
= impl_from_IXMLDOMNode( iface
);
413 child
= This
->node
->children
;
414 if ( child
&& child
->type
== XML_TEXT_NODE
)
415 str
= bstr_from_xmlChar( child
->content
);
417 TRACE("%p %s\n", This
, debugstr_w(str
) );
423 static HRESULT WINAPI
xmlnode_put_text(
431 static HRESULT WINAPI
xmlnode_get_specified(
433 VARIANT_BOOL
* isSpecified
)
439 static HRESULT WINAPI
xmlnode_get_definition(
441 IXMLDOMNode
** definitionNode
)
447 static HRESULT WINAPI
xmlnode_get_nodeTypedValue(
455 static HRESULT WINAPI
xmlnode_put_nodeTypedValue(
463 static HRESULT WINAPI
xmlnode_get_dataType(
465 VARIANT
* dataTypeName
)
471 static HRESULT WINAPI
xmlnode_put_dataType(
479 static HRESULT WINAPI
xmlnode_get_xml(
487 static HRESULT WINAPI
xmlnode_transformNode(
489 IXMLDOMNode
* styleSheet
,
496 static HRESULT WINAPI
xmlnode_selectNodes(
499 IXMLDOMNodeList
** resultList
)
505 static HRESULT WINAPI
xmlnode_selectSingleNode(
508 IXMLDOMNode
** resultNode
)
514 static HRESULT WINAPI
xmlnode_get_parsed(
516 VARIANT_BOOL
* isParsed
)
522 static HRESULT WINAPI
xmlnode_get_namespaceURI(
530 static HRESULT WINAPI
xmlnode_get_prefix(
538 static HRESULT WINAPI
xmlnode_get_baseName(
542 xmlnode
*This
= impl_from_IXMLDOMNode( iface
);
546 TRACE("%p %p\n", This
, nameString
);
551 switch ( This
->node
->type
)
553 case XML_ELEMENT_NODE
:
554 case XML_ATTRIBUTE_NODE
:
555 str
= bstr_from_xmlChar( This
->node
->name
);
561 ERR("Unhandled type %d\n", This
->node
->type
);
565 TRACE("returning %08lx str = %s\n", r
, debugstr_w( str
) );
571 static HRESULT WINAPI
xmlnode_transformNodeToObject(
573 IXMLDOMNode
* stylesheet
,
574 VARIANT outputObject
)
580 static const struct IXMLDOMNodeVtbl xmlnode_vtbl
=
582 xmlnode_QueryInterface
,
585 xmlnode_GetTypeInfoCount
,
587 xmlnode_GetIDsOfNames
,
589 xmlnode_get_nodeName
,
590 xmlnode_get_nodeValue
,
591 xmlnode_put_nodeValue
,
592 xmlnode_get_nodeType
,
593 xmlnode_get_parentNode
,
594 xmlnode_get_childNodes
,
595 xmlnode_get_firstChild
,
596 xmlnode_get_lastChild
,
597 xmlnode_get_previousSibling
,
598 xmlnode_get_nextSibling
,
599 xmlnode_get_attributes
,
600 xmlnode_insertBefore
,
601 xmlnode_replaceChild
,
604 xmlnode_hasChildNodes
,
605 xmlnode_get_ownerDocument
,
607 xmlnode_get_nodeTypeString
,
610 xmlnode_get_specified
,
611 xmlnode_get_definition
,
612 xmlnode_get_nodeTypedValue
,
613 xmlnode_put_nodeTypedValue
,
614 xmlnode_get_dataType
,
615 xmlnode_put_dataType
,
617 xmlnode_transformNode
,
619 xmlnode_selectSingleNode
,
621 xmlnode_get_namespaceURI
,
623 xmlnode_get_baseName
,
624 xmlnode_transformNodeToObject
,
627 static IXMLDOMNode
*create_node( xmlNodePtr node
)
636 /* if an interface already exists for this node, return it */
637 if ( node
->_private
)
639 IXMLDOMNode
*n
= node
->_private
;
640 IXMLDOMNode_AddRef( n
);
645 * Try adding a reference to the IXMLDOMNode implementation
646 * containing the document's root element.
648 if ( node
->type
!= XML_DOCUMENT_NODE
)
650 IXMLDOMNode
*root
= NULL
;
652 root
= node
->doc
->_private
;
654 IXMLDOMNode_AddRef( root
);
657 assert( node
->doc
== (xmlDocPtr
) node
);
659 This
= HeapAlloc( GetProcessHeap(), 0, sizeof *This
);
663 This
->lpVtbl
= &xmlnode_vtbl
;
667 /* remember which interface we associated with this node */
668 node
->_private
= This
;
670 return (IXMLDOMNode
*) &This
->lpVtbl
;
673 IXMLDOMNode
*create_domdoc_node( xmlDocPtr node
)
675 return create_node( (xmlNodePtr
) node
);
678 IXMLDOMNode
*create_attribute_node( xmlAttrPtr node
)
680 return create_node( (xmlNodePtr
) node
);
683 IXMLDOMNode
*create_element_node( xmlNodePtr element
)
685 return create_node( element
);
688 IXMLDOMNode
*create_generic_node( xmlNodePtr node
)
690 return create_node( node
);