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
36 #include "msxml_private.h"
38 #include "wine/debug.h"
40 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
48 xmlElementPtr element;
51 typedef struct _xmlnode
53 const struct IXMLDOMNodeVtbl *lpVtbl;
60 static inline xmlnode *impl_from_IXMLDOMNode( IXMLDOMNode *iface )
62 return (xmlnode *)((char*)iface - FIELD_OFFSET(xmlnode, lpVtbl));
65 xmlDocPtr xmldoc_from_xmlnode( IXMLDOMNode *iface )
72 This = impl_from_IXMLDOMNode( iface );
73 if (This->type != XML_DOCUMENT_NODE )
78 xmlNodePtr xmlelement_from_xmlnode( IXMLDOMNode *iface )
80 xmlnode *This = impl_from_IXMLDOMNode( iface );
81 if (This->type != XML_ELEMENT_NODE )
86 static HRESULT WINAPI xmlnode_QueryInterface(
91 TRACE("%p %p %p\n", iface, debugstr_guid(riid), ppvObject);
93 if ( IsEqualGUID( riid, &IID_IUnknown ) ||
94 IsEqualGUID( riid, &IID_IDispatch ) ||
95 IsEqualGUID( riid, &IID_IXMLDOMNode ) )
100 return E_NOINTERFACE;
102 IXMLDOMElement_AddRef( iface );
107 static ULONG WINAPI xmlnode_AddRef(
110 xmlnode *This = impl_from_IXMLDOMNode( iface );
111 return InterlockedIncrement( &This->ref );
114 static ULONG WINAPI xmlnode_Release(
117 xmlnode *This = impl_from_IXMLDOMNode( iface );
120 ref = InterlockedDecrement( &This->ref );
127 case XML_DOCUMENT_NODE:
128 xmlFreeDoc( This->u.doc );
130 case XML_ATTRIBUTE_NODE:
131 case XML_ELEMENT_NODE:
132 /* don't free these */
135 ERR("don't know how to free this element\n");
138 HeapFree( GetProcessHeap(), 0, This );
144 static HRESULT WINAPI xmlnode_GetTypeInfoCount(
152 static HRESULT WINAPI xmlnode_GetTypeInfo(
156 ITypeInfo** ppTInfo )
162 static HRESULT WINAPI xmlnode_GetIDsOfNames(
174 static HRESULT WINAPI xmlnode_Invoke(
180 DISPPARAMS* pDispParams,
182 EXCEPINFO* pExcepInfo,
189 static HRESULT WINAPI xmlnode_get_xmlnodeName(
197 BSTR bstr_from_xmlChar( const xmlChar *buf )
206 len = MultiByteToWideChar( CP_UTF8, 0, (LPCSTR) buf, -1, NULL, 0 );
207 str = (LPWSTR) HeapAlloc( GetProcessHeap(), 0, len * sizeof (WCHAR) );
210 MultiByteToWideChar( CP_UTF8, 0, (LPCSTR) buf, -1, str, len );
211 bstr = SysAllocString( str );
212 HeapFree( GetProcessHeap(), 0, str );
216 static HRESULT WINAPI xmlnode_get_xmlnodeValue(
220 xmlnode *This = impl_from_IXMLDOMNode( iface );
222 TRACE("%p %p\n", This, value);
224 switch ( This->type )
226 case XML_COMMENT_NODE:
230 case XML_ATTRIBUTE_NODE:
231 V_VT(value) = VT_BSTR;
232 V_BSTR(value) = bstr_from_xmlChar( This->u.attr->name );
235 FIXME("processing instruction\n");
238 case XML_ELEMENT_NODE:
239 case XML_DOCUMENT_NODE:
245 TRACE("%p returned %s\n", This, debugstr_w( V_BSTR(value) ) );
250 static HRESULT WINAPI xmlnode_put_xmlnodeValue(
258 static HRESULT WINAPI xmlnode_get_xmlnodeType(
266 static HRESULT WINAPI xmlnode_get_parentNode(
268 IXMLDOMNode** parent)
274 static HRESULT WINAPI xmlnode_get_childNodes(
276 IXMLDOMNodeList** childList)
278 xmlnode *This = impl_from_IXMLDOMNode( iface );
281 /*return NodeList_create( childList, This );*/
284 static HRESULT WINAPI xmlnode_get_firstChild(
286 IXMLDOMNode** firstChild)
292 static HRESULT WINAPI xmlnode_get_lastChild(
294 IXMLDOMNode** lastChild)
300 static HRESULT WINAPI xmlnode_get_previousSibling(
302 IXMLDOMNode** previousSibling)
308 static HRESULT WINAPI xmlnode_get_nextSibling(
310 IXMLDOMNode** nextSibling)
316 static HRESULT WINAPI xmlnode_get_attributes(
318 IXMLDOMNamedNodeMap** attributeMap)
320 xmlnode *This = impl_from_IXMLDOMNode( iface );
323 /*return NodeMap_create( attributeMap, This, node ); */
326 static HRESULT WINAPI xmlnode_insertBefore(
328 IXMLDOMNode* newChild,
330 IXMLDOMNode** outNewChild)
336 static HRESULT WINAPI xmlnode_replaceChild(
338 IXMLDOMNode* newChild,
339 IXMLDOMNode* oldChild,
340 IXMLDOMNode** outOldChild)
346 static HRESULT WINAPI xmlnode_removeChild(
348 IXMLDOMNode* childNode,
349 IXMLDOMNode** oldChild)
355 static HRESULT WINAPI xmlnode_appendChild(
357 IXMLDOMNode* newChild,
358 IXMLDOMNode** outNewChild)
364 static HRESULT WINAPI xmlnode_hasChildNodes(
366 VARIANT_BOOL* hasChild)
372 static HRESULT WINAPI xmlnode_get_ownerDocument(
374 IXMLDOMDocument** DOMDocument)
380 static HRESULT WINAPI xmlnode_cloneNode(
383 IXMLDOMNode** cloneRoot)
389 static HRESULT WINAPI xmlnode_get_xmlnodeTypeString(
397 static HRESULT WINAPI xmlnode_get_text(
405 static HRESULT WINAPI xmlnode_put_text(
413 static HRESULT WINAPI xmlnode_get_specified(
415 VARIANT_BOOL* isSpecified)
421 static HRESULT WINAPI xmlnode_get_definition(
423 IXMLDOMNode** definitionNode)
429 static HRESULT WINAPI xmlnode_get_xmlnodeTypedValue(
437 static HRESULT WINAPI xmlnode_put_xmlnodeTypedValue(
445 static HRESULT WINAPI xmlnode_get_dataType(
447 VARIANT* dataTypeName)
453 static HRESULT WINAPI xmlnode_put_dataType(
461 static HRESULT WINAPI xmlnode_get_xml(
469 static HRESULT WINAPI xmlnode_transformNode(
471 IXMLDOMNode* styleSheet,
478 static HRESULT WINAPI xmlnode_selectNodes(
481 IXMLDOMNodeList** resultList)
487 static HRESULT WINAPI xmlnode_selectSingleNode(
490 IXMLDOMNode** resultNode)
496 static HRESULT WINAPI xmlnode_get_parsed(
498 VARIANT_BOOL* isParsed)
504 static HRESULT WINAPI xmlnode_get_namespaceURI(
512 static HRESULT WINAPI xmlnode_get_prefix(
520 static HRESULT WINAPI xmlnode_get_baseName(
528 static HRESULT WINAPI xmlnode_transformNodeToObject(
530 IXMLDOMNode* stylesheet,
531 VARIANT outputObject)
537 static const struct IXMLDOMNodeVtbl xmlnode_vtbl =
539 xmlnode_QueryInterface,
542 xmlnode_GetTypeInfoCount,
544 xmlnode_GetIDsOfNames,
546 xmlnode_get_xmlnodeName,
547 xmlnode_get_xmlnodeValue,
548 xmlnode_put_xmlnodeValue,
549 xmlnode_get_xmlnodeType,
550 xmlnode_get_parentNode,
551 xmlnode_get_childNodes,
552 xmlnode_get_firstChild,
553 xmlnode_get_lastChild,
554 xmlnode_get_previousSibling,
555 xmlnode_get_nextSibling,
556 xmlnode_get_attributes,
557 xmlnode_insertBefore,
558 xmlnode_replaceChild,
561 xmlnode_hasChildNodes,
562 xmlnode_get_ownerDocument,
564 xmlnode_get_xmlnodeTypeString,
567 xmlnode_get_specified,
568 xmlnode_get_definition,
569 xmlnode_get_xmlnodeTypedValue,
570 xmlnode_put_xmlnodeTypedValue,
571 xmlnode_get_dataType,
572 xmlnode_put_dataType,
574 xmlnode_transformNode,
576 xmlnode_selectSingleNode,
578 xmlnode_get_namespaceURI,
580 xmlnode_get_baseName,
581 xmlnode_transformNodeToObject,
584 static xmlnode *create_node( void )
588 This = HeapAlloc( GetProcessHeap(), 0, sizeof *This );
592 This->lpVtbl = &xmlnode_vtbl;
594 This->free_me = TRUE;
600 IXMLDOMNode *create_domdoc_node( xmlDocPtr node )
607 This = create_node();
611 This->type = XML_DOCUMENT_NODE;
614 return (IXMLDOMNode*) &This->lpVtbl;
617 IXMLDOMNode *create_attribute_node( xmlAttrPtr node )
624 This = create_node();
628 This->type = XML_ATTRIBUTE_NODE;
631 return (IXMLDOMNode*) &This->lpVtbl;
634 IXMLDOMNode *create_element_node( xmlNodePtr element )
641 This = create_node();
645 This->type = XML_ELEMENT_NODE;
646 This->u.node = element;
648 return (IXMLDOMNode*) &This->lpVtbl;