2 * DOM Document implementation
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
35 #include "msxml_private.h"
37 #include "wine/debug.h"
39 WINE_DEFAULT_DEBUG_CHANNEL(msxml
);
43 typedef struct _domelem
45 const struct IXMLDOMElementVtbl
*lpVtbl
;
50 static inline domelem
*impl_from_IXMLDOMElement( IXMLDOMElement
*iface
)
52 return (domelem
*)((char*)iface
- FIELD_OFFSET(domelem
, lpVtbl
));
55 static HRESULT WINAPI
domelem_QueryInterface(
56 IXMLDOMElement
*iface
,
60 TRACE("%p %p %p\n", iface
, debugstr_guid(riid
), ppvObject
);
62 if ( IsEqualGUID( riid
, &IID_IXMLDOMElement
) ||
63 IsEqualGUID( riid
, &IID_IUnknown
) ||
64 IsEqualGUID( riid
, &IID_IDispatch
) ||
65 IsEqualGUID( riid
, &IID_IXMLDOMNode
) )
72 IXMLDOMElement_AddRef( iface
);
77 static ULONG WINAPI
domelem_AddRef(
78 IXMLDOMElement
*iface
)
80 domelem
*This
= impl_from_IXMLDOMElement( iface
);
81 return InterlockedIncrement( &This
->ref
);
84 static ULONG WINAPI
domelem_Release(
85 IXMLDOMElement
*iface
)
87 domelem
*This
= impl_from_IXMLDOMElement( iface
);
90 ref
= InterlockedDecrement( &This
->ref
);
93 IXMLDOMNode_Release( This
->node
);
94 HeapFree( GetProcessHeap(), 0, This
);
100 static HRESULT WINAPI
domelem_GetTypeInfoCount(
101 IXMLDOMElement
*iface
,
108 static HRESULT WINAPI
domelem_GetTypeInfo(
109 IXMLDOMElement
*iface
,
110 UINT iTInfo
, LCID lcid
,
111 ITypeInfo
** ppTInfo
)
117 static HRESULT WINAPI
domelem_GetIDsOfNames(
118 IXMLDOMElement
*iface
,
119 REFIID riid
, LPOLESTR
* rgszNames
,
120 UINT cNames
, LCID lcid
, DISPID
* rgDispId
)
126 static HRESULT WINAPI
domelem_Invoke(
127 IXMLDOMElement
*iface
,
128 DISPID dispIdMember
, REFIID riid
, LCID lcid
,
129 WORD wFlags
, DISPPARAMS
* pDispParams
, VARIANT
* pVarResult
,
130 EXCEPINFO
* pExcepInfo
, UINT
* puArgErr
)
136 static HRESULT WINAPI
domelem_get_nodeName(
137 IXMLDOMElement
*iface
,
144 static HRESULT WINAPI
domelem_get_nodeValue(
145 IXMLDOMElement
*iface
,
152 static HRESULT WINAPI
domelem_put_nodeValue(
153 IXMLDOMElement
*iface
,
160 static HRESULT WINAPI
domelem_get_nodeType(
161 IXMLDOMElement
*iface
,
162 DOMNodeType
* domNodeType
)
168 static HRESULT WINAPI
domelem_get_parentNode(
169 IXMLDOMElement
*iface
,
170 IXMLDOMNode
** parent
)
176 static HRESULT WINAPI
domelem_get_childNodes(
177 IXMLDOMElement
*iface
,
178 IXMLDOMNodeList
** outList
)
184 static HRESULT WINAPI
domelem_get_firstChild(
185 IXMLDOMElement
*iface
,
186 IXMLDOMNode
** domNode
)
192 static HRESULT WINAPI
domelem_get_lastChild(
193 IXMLDOMElement
*iface
,
194 IXMLDOMNode
** domNode
)
200 static HRESULT WINAPI
domelem_get_previousSibling(
201 IXMLDOMElement
*iface
,
202 IXMLDOMNode
** domNode
)
208 static HRESULT WINAPI
domelem_get_nextSibling(
209 IXMLDOMElement
*iface
,
210 IXMLDOMNode
** domNode
)
216 static HRESULT WINAPI
domelem_get_attributes(
217 IXMLDOMElement
*iface
,
218 IXMLDOMNamedNodeMap
** attributeMap
)
224 static HRESULT WINAPI
domelem_insertBefore(
225 IXMLDOMElement
*iface
,
226 IXMLDOMNode
* newNode
, VARIANT var1
,
227 IXMLDOMNode
** outOldNode
)
233 static HRESULT WINAPI
domelem_replaceChild(
234 IXMLDOMElement
*iface
,
235 IXMLDOMNode
* newNode
,
236 IXMLDOMNode
* oldNode
,
237 IXMLDOMNode
** outOldNode
)
243 static HRESULT WINAPI
domelem_removeChild(
244 IXMLDOMElement
*iface
,
245 IXMLDOMNode
* domNode
, IXMLDOMNode
** oldNode
)
251 static HRESULT WINAPI
domelem_appendChild(
252 IXMLDOMElement
*iface
,
253 IXMLDOMNode
* newNode
, IXMLDOMNode
** outNewNode
)
259 static HRESULT WINAPI
domelem_hasChildNodes(
260 IXMLDOMElement
*iface
,
267 static HRESULT WINAPI
domelem_get_ownerDocument(
268 IXMLDOMElement
*iface
,
269 IXMLDOMDocument
** domDocument
)
275 static HRESULT WINAPI
domelem_cloneNode(
276 IXMLDOMElement
*iface
,
277 VARIANT_BOOL pbool
, IXMLDOMNode
** outNode
)
283 static HRESULT WINAPI
domelem_get_nodeTypeString(
284 IXMLDOMElement
*iface
,
291 static HRESULT WINAPI
domelem_get_text(
292 IXMLDOMElement
*iface
,
299 static HRESULT WINAPI
domelem_put_text(
300 IXMLDOMElement
*iface
,
307 static HRESULT WINAPI
domelem_get_specified(
308 IXMLDOMElement
*iface
,
315 static HRESULT WINAPI
domelem_get_definition(
316 IXMLDOMElement
*iface
,
317 IXMLDOMNode
** domNode
)
323 static HRESULT WINAPI
domelem_get_nodeTypedValue(
324 IXMLDOMElement
*iface
,
331 static HRESULT WINAPI
domelem_put_nodeTypedValue(
332 IXMLDOMElement
*iface
,
339 static HRESULT WINAPI
domelem_get_dataType(
340 IXMLDOMElement
*iface
,
347 static HRESULT WINAPI
domelem_put_dataType(
348 IXMLDOMElement
*iface
,
355 static HRESULT WINAPI
domelem_get_xml(
356 IXMLDOMElement
*iface
,
363 static HRESULT WINAPI
domelem_transformNode(
364 IXMLDOMElement
*iface
,
365 IXMLDOMNode
* domNode
, BSTR
* p
)
371 static HRESULT WINAPI
domelem_selectNodes(
372 IXMLDOMElement
*iface
,
373 BSTR p
, IXMLDOMNodeList
** outList
)
379 static HRESULT WINAPI
domelem_selectSingleNode(
380 IXMLDOMElement
*iface
,
381 BSTR p
, IXMLDOMNode
** outNode
)
387 static HRESULT WINAPI
domelem_get_parsed(
388 IXMLDOMElement
*iface
,
395 static HRESULT WINAPI
domelem_get_namespaceURI(
396 IXMLDOMElement
*iface
,
403 static HRESULT WINAPI
domelem_get_prefix(
404 IXMLDOMElement
*iface
,
411 static HRESULT WINAPI
domelem_get_baseName(
412 IXMLDOMElement
*iface
,
419 static HRESULT WINAPI
domelem_transformNodeToObject(
420 IXMLDOMElement
*iface
,
421 IXMLDOMNode
* domNode
, VARIANT var1
)
427 static HRESULT WINAPI
domelem_get_tagName(
428 IXMLDOMElement
*iface
,
431 domelem
*This
= impl_from_IXMLDOMElement( iface
);
434 TRACE("%p\n", This
);
439 element
= xmlelement_from_xmlnode( This
->node
);
443 *p
= bstr_from_xmlChar( element
->name
);
448 static HRESULT WINAPI
domelem_getAttribute(
449 IXMLDOMElement
*iface
,
450 BSTR p
, VARIANT
* var
)
456 static HRESULT WINAPI
domelem_setAttribute(
457 IXMLDOMElement
*iface
,
464 static HRESULT WINAPI
domelem_removeAttribute(
465 IXMLDOMElement
*iface
,
472 static HRESULT WINAPI
domelem_getAttributeNode(
473 IXMLDOMElement
*iface
,
474 BSTR p
, IXMLDOMAttribute
** attributeNode
)
480 static HRESULT WINAPI
domelem_setAttributeNode(
481 IXMLDOMElement
*iface
,
482 IXMLDOMAttribute
* domAttribute
,
483 IXMLDOMAttribute
** attributeNode
)
489 static HRESULT WINAPI
domelem_removeAttributeNode(
490 IXMLDOMElement
*iface
,
491 IXMLDOMAttribute
* domAttribute
,
492 IXMLDOMAttribute
** attributeNode
)
498 static HRESULT WINAPI
domelem_getElementsByTagName(
499 IXMLDOMElement
*iface
,
500 BSTR p
, IXMLDOMNodeList
** resultList
)
506 static HRESULT WINAPI
domelem_normalize(
507 IXMLDOMElement
*iface
)
513 static const struct IXMLDOMElementVtbl domelem_vtbl
=
515 domelem_QueryInterface
,
518 domelem_GetTypeInfoCount
,
520 domelem_GetIDsOfNames
,
522 domelem_get_nodeName
,
523 domelem_get_nodeValue
,
524 domelem_put_nodeValue
,
525 domelem_get_nodeType
,
526 domelem_get_parentNode
,
527 domelem_get_childNodes
,
528 domelem_get_firstChild
,
529 domelem_get_lastChild
,
530 domelem_get_previousSibling
,
531 domelem_get_nextSibling
,
532 domelem_get_attributes
,
533 domelem_insertBefore
,
534 domelem_replaceChild
,
537 domelem_hasChildNodes
,
538 domelem_get_ownerDocument
,
540 domelem_get_nodeTypeString
,
543 domelem_get_specified
,
544 domelem_get_definition
,
545 domelem_get_nodeTypedValue
,
546 domelem_put_nodeTypedValue
,
547 domelem_get_dataType
,
548 domelem_put_dataType
,
550 domelem_transformNode
,
552 domelem_selectSingleNode
,
554 domelem_get_namespaceURI
,
556 domelem_get_baseName
,
557 domelem_transformNodeToObject
,
559 domelem_getAttribute
,
560 domelem_setAttribute
,
561 domelem_removeAttribute
,
562 domelem_getAttributeNode
,
563 domelem_setAttributeNode
,
564 domelem_removeAttributeNode
,
565 domelem_getElementsByTagName
,
569 IXMLDOMElement
* create_element( xmlNodePtr element
)
573 This
= HeapAlloc( GetProcessHeap(), 0, sizeof *This
);
577 This
->lpVtbl
= &domelem_vtbl
;
578 This
->node
= create_element_node( element
);
583 HeapFree( GetProcessHeap(), 0, This
);
587 return (IXMLDOMElement
*) &This
->lpVtbl
;