2 * DOM Attribute implementation
4 * Copyright 2006 Huw Davies
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
27 # include <libxml/parser.h>
28 # include <libxml/xmlerror.h>
29 # include <libxml/HTMLtree.h>
38 #include "msxml_private.h"
40 #include "wine/debug.h"
42 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
46 typedef struct _domattr
49 IXMLDOMAttribute IXMLDOMAttribute_iface;
53 static inline domattr *impl_from_IXMLDOMAttribute( IXMLDOMAttribute *iface )
55 return CONTAINING_RECORD(iface, domattr, IXMLDOMAttribute_iface);
58 static HRESULT WINAPI domattr_QueryInterface(
59 IXMLDOMAttribute *iface,
63 domattr *This = impl_from_IXMLDOMAttribute( iface );
64 TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject);
66 if ( IsEqualGUID( riid, &IID_IXMLDOMAttribute ) ||
67 IsEqualGUID( riid, &IID_IXMLDOMNode ) ||
68 IsEqualGUID( riid, &IID_IDispatch ) ||
69 IsEqualGUID( riid, &IID_IUnknown ) )
73 else if(node_query_interface(&This->node, riid, ppvObject))
75 return *ppvObject ? S_OK : E_NOINTERFACE;
79 FIXME("Unsupported interface %s\n", debugstr_guid(riid));
84 IXMLDOMText_AddRef((IUnknown*)*ppvObject);
88 static ULONG WINAPI domattr_AddRef(
89 IXMLDOMAttribute *iface )
91 domattr *This = impl_from_IXMLDOMAttribute( iface );
92 return InterlockedIncrement( &This->ref );
95 static ULONG WINAPI domattr_Release(
96 IXMLDOMAttribute *iface )
98 domattr *This = impl_from_IXMLDOMAttribute( iface );
101 ref = InterlockedDecrement( &This->ref );
104 destroy_xmlnode(&This->node);
111 static HRESULT WINAPI domattr_GetTypeInfoCount(
112 IXMLDOMAttribute *iface,
115 domattr *This = impl_from_IXMLDOMAttribute( iface );
117 TRACE("(%p)->(%p)\n", This, pctinfo);
124 static HRESULT WINAPI domattr_GetTypeInfo(
125 IXMLDOMAttribute *iface,
126 UINT iTInfo, LCID lcid,
127 ITypeInfo** ppTInfo )
129 domattr *This = impl_from_IXMLDOMAttribute( iface );
132 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
134 hr = get_typeinfo(IXMLDOMAttribute_tid, ppTInfo);
139 static HRESULT WINAPI domattr_GetIDsOfNames(
140 IXMLDOMAttribute *iface,
141 REFIID riid, LPOLESTR* rgszNames,
142 UINT cNames, LCID lcid, DISPID* rgDispId )
144 domattr *This = impl_from_IXMLDOMAttribute( iface );
148 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
151 if(!rgszNames || cNames == 0 || !rgDispId)
154 hr = get_typeinfo(IXMLDOMAttribute_tid, &typeinfo);
157 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
158 ITypeInfo_Release(typeinfo);
164 static HRESULT WINAPI domattr_Invoke(
165 IXMLDOMAttribute *iface,
166 DISPID dispIdMember, REFIID riid, LCID lcid,
167 WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
168 EXCEPINFO* pExcepInfo, UINT* puArgErr )
170 domattr *This = impl_from_IXMLDOMAttribute( iface );
174 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
175 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
177 hr = get_typeinfo(IXMLDOMAttribute_tid, &typeinfo);
180 hr = ITypeInfo_Invoke(typeinfo, &This->IXMLDOMAttribute_iface, dispIdMember, wFlags,
181 pDispParams, pVarResult, pExcepInfo, puArgErr);
182 ITypeInfo_Release(typeinfo);
187 static HRESULT WINAPI domattr_get_nodeName(
188 IXMLDOMAttribute *iface,
191 domattr *This = impl_from_IXMLDOMAttribute( iface );
193 TRACE("(%p)->(%p)\n", This, p);
195 return node_get_nodeName(&This->node, p);
198 static HRESULT WINAPI domattr_get_nodeValue(
199 IXMLDOMAttribute *iface,
202 domattr *This = impl_from_IXMLDOMAttribute( iface );
204 TRACE("(%p)->(%p)\n", This, value);
206 return node_get_content(&This->node, value);
209 static HRESULT WINAPI domattr_put_nodeValue(
210 IXMLDOMAttribute *iface,
213 domattr *This = impl_from_IXMLDOMAttribute( iface );
215 TRACE("(%p)->(%s)\n", This, debugstr_variant(&value));
217 return node_put_value_escaped(&This->node, &value);
220 static HRESULT WINAPI domattr_get_nodeType(
221 IXMLDOMAttribute *iface,
222 DOMNodeType* domNodeType )
224 domattr *This = impl_from_IXMLDOMAttribute( iface );
226 TRACE("(%p)->(%p)\n", This, domNodeType);
228 *domNodeType = NODE_ATTRIBUTE;
232 static HRESULT WINAPI domattr_get_parentNode(
233 IXMLDOMAttribute *iface,
234 IXMLDOMNode** parent )
236 domattr *This = impl_from_IXMLDOMAttribute( iface );
237 TRACE("(%p)->(%p)\n", This, parent);
238 if (!parent) return E_INVALIDARG;
243 static HRESULT WINAPI domattr_get_childNodes(
244 IXMLDOMAttribute *iface,
245 IXMLDOMNodeList** outList)
247 domattr *This = impl_from_IXMLDOMAttribute( iface );
249 TRACE("(%p)->(%p)\n", This, outList);
251 return node_get_child_nodes(&This->node, outList);
254 static HRESULT WINAPI domattr_get_firstChild(
255 IXMLDOMAttribute *iface,
256 IXMLDOMNode** domNode)
258 domattr *This = impl_from_IXMLDOMAttribute( iface );
260 TRACE("(%p)->(%p)\n", This, domNode);
262 return node_get_first_child(&This->node, domNode);
265 static HRESULT WINAPI domattr_get_lastChild(
266 IXMLDOMAttribute *iface,
267 IXMLDOMNode** domNode)
269 domattr *This = impl_from_IXMLDOMAttribute( iface );
271 TRACE("(%p)->(%p)\n", This, domNode);
273 return node_get_last_child(&This->node, domNode);
276 static HRESULT WINAPI domattr_get_previousSibling(
277 IXMLDOMAttribute *iface,
278 IXMLDOMNode** domNode)
280 domattr *This = impl_from_IXMLDOMAttribute( iface );
282 TRACE("(%p)->(%p)\n", This, domNode);
284 return return_null_node(domNode);
287 static HRESULT WINAPI domattr_get_nextSibling(
288 IXMLDOMAttribute *iface,
289 IXMLDOMNode** domNode)
291 domattr *This = impl_from_IXMLDOMAttribute( iface );
293 TRACE("(%p)->(%p)\n", This, domNode);
295 return return_null_node(domNode);
298 static HRESULT WINAPI domattr_get_attributes(
299 IXMLDOMAttribute *iface,
300 IXMLDOMNamedNodeMap** attributeMap)
302 domattr *This = impl_from_IXMLDOMAttribute( iface );
304 TRACE("(%p)->(%p)\n", This, attributeMap);
306 return return_null_ptr((void**)attributeMap);
309 static HRESULT WINAPI domattr_insertBefore(
310 IXMLDOMAttribute *iface,
311 IXMLDOMNode* newNode, VARIANT refChild,
312 IXMLDOMNode** old_node)
314 domattr *This = impl_from_IXMLDOMAttribute( iface );
318 FIXME("(%p)->(%p %s %p) needs test\n", This, newNode, debugstr_variant(&refChild), old_node);
320 if (!newNode) return E_INVALIDARG;
322 hr = IXMLDOMNode_get_nodeType(newNode, &type);
323 if (hr != S_OK) return hr;
325 TRACE("new node type %d\n", type);
329 case NODE_CDATA_SECTION:
332 case NODE_PROCESSING_INSTRUCTION:
333 if (old_node) *old_node = NULL;
336 return node_insert_before(&This->node, newNode, &refChild, old_node);
340 static HRESULT WINAPI domattr_replaceChild(
341 IXMLDOMAttribute *iface,
342 IXMLDOMNode* newNode,
343 IXMLDOMNode* oldNode,
344 IXMLDOMNode** outOldNode)
346 domattr *This = impl_from_IXMLDOMAttribute( iface );
348 FIXME("(%p)->(%p %p %p) needs tests\n", This, newNode, oldNode, outOldNode);
350 return node_replace_child(&This->node, newNode, oldNode, outOldNode);
353 static HRESULT WINAPI domattr_removeChild(
354 IXMLDOMAttribute *iface,
355 IXMLDOMNode *child, IXMLDOMNode **oldChild)
357 domattr *This = impl_from_IXMLDOMAttribute( iface );
358 TRACE("(%p)->(%p %p)\n", This, child, oldChild);
359 return node_remove_child(&This->node, child, oldChild);
362 static HRESULT WINAPI domattr_appendChild(
363 IXMLDOMAttribute *iface,
364 IXMLDOMNode *child, IXMLDOMNode **outChild)
366 domattr *This = impl_from_IXMLDOMAttribute( iface );
367 TRACE("(%p)->(%p %p)\n", This, child, outChild);
368 return node_append_child(&This->node, child, outChild);
371 static HRESULT WINAPI domattr_hasChildNodes(
372 IXMLDOMAttribute *iface,
375 domattr *This = impl_from_IXMLDOMAttribute( iface );
376 TRACE("(%p)->(%p)\n", This, ret);
377 return node_has_childnodes(&This->node, ret);
380 static HRESULT WINAPI domattr_get_ownerDocument(
381 IXMLDOMAttribute *iface,
382 IXMLDOMDocument **doc)
384 domattr *This = impl_from_IXMLDOMAttribute( iface );
385 TRACE("(%p)->(%p)\n", This, doc);
386 return node_get_owner_doc(&This->node, doc);
389 static HRESULT WINAPI domattr_cloneNode(
390 IXMLDOMAttribute *iface,
391 VARIANT_BOOL deep, IXMLDOMNode** outNode)
393 domattr *This = impl_from_IXMLDOMAttribute( iface );
394 TRACE("(%p)->(%d %p)\n", This, deep, outNode);
395 return node_clone( &This->node, deep, outNode );
398 static HRESULT WINAPI domattr_get_nodeTypeString(
399 IXMLDOMAttribute *iface,
402 domattr *This = impl_from_IXMLDOMAttribute( iface );
403 static const WCHAR attributeW[] = {'a','t','t','r','i','b','u','t','e',0};
405 TRACE("(%p)->(%p)\n", This, p);
407 return return_bstr(attributeW, p);
410 static HRESULT WINAPI domattr_get_text(
411 IXMLDOMAttribute *iface,
414 domattr *This = impl_from_IXMLDOMAttribute( iface );
415 TRACE("(%p)->(%p)\n", This, p);
416 return node_get_text(&This->node, p);
419 static HRESULT WINAPI domattr_put_text(
420 IXMLDOMAttribute *iface,
423 domattr *This = impl_from_IXMLDOMAttribute( iface );
424 TRACE("(%p)->(%s)\n", This, debugstr_w(p));
425 return node_put_text( &This->node, p );
428 static HRESULT WINAPI domattr_get_specified(
429 IXMLDOMAttribute *iface,
430 VARIANT_BOOL* isSpecified)
432 domattr *This = impl_from_IXMLDOMAttribute( iface );
433 FIXME("(%p)->(%p) stub!\n", This, isSpecified);
434 *isSpecified = VARIANT_TRUE;
438 static HRESULT WINAPI domattr_get_definition(
439 IXMLDOMAttribute *iface,
440 IXMLDOMNode** definitionNode)
442 domattr *This = impl_from_IXMLDOMAttribute( iface );
443 FIXME("(%p)->(%p)\n", This, definitionNode);
447 static HRESULT WINAPI domattr_get_nodeTypedValue(
448 IXMLDOMAttribute *iface,
451 domattr *This = impl_from_IXMLDOMAttribute( iface );
452 FIXME("(%p)->(%p)\n", This, var1);
453 return return_null_var(var1);
456 static HRESULT WINAPI domattr_put_nodeTypedValue(
457 IXMLDOMAttribute *iface,
460 domattr *This = impl_from_IXMLDOMAttribute( iface );
461 FIXME("(%p)->(%s)\n", This, debugstr_variant(&typedValue));
465 static HRESULT WINAPI domattr_get_dataType(
466 IXMLDOMAttribute *iface,
469 domattr *This = impl_from_IXMLDOMAttribute( iface );
470 TRACE("(%p)->(%p)\n", This, typename);
471 return return_null_var( typename );
474 static HRESULT WINAPI domattr_put_dataType(
475 IXMLDOMAttribute *iface,
478 domattr *This = impl_from_IXMLDOMAttribute( iface );
480 FIXME("(%p)->(%s)\n", This, debugstr_w(p));
488 static HRESULT WINAPI domattr_get_xml(
489 IXMLDOMAttribute *iface,
492 domattr *This = impl_from_IXMLDOMAttribute( iface );
494 TRACE("(%p)->(%p)\n", This, p);
496 return node_get_xml(&This->node, FALSE, FALSE, p);
499 static HRESULT WINAPI domattr_transformNode(
500 IXMLDOMAttribute *iface,
501 IXMLDOMNode *node, BSTR *p)
503 domattr *This = impl_from_IXMLDOMAttribute( iface );
504 TRACE("(%p)->(%p %p)\n", This, node, p);
505 return node_transform_node(&This->node, node, p);
508 static HRESULT WINAPI domattr_selectNodes(
509 IXMLDOMAttribute *iface,
510 BSTR p, IXMLDOMNodeList** outList)
512 domattr *This = impl_from_IXMLDOMAttribute( iface );
513 TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outList);
514 return node_select_nodes(&This->node, p, outList);
517 static HRESULT WINAPI domattr_selectSingleNode(
518 IXMLDOMAttribute *iface,
519 BSTR p, IXMLDOMNode** outNode)
521 domattr *This = impl_from_IXMLDOMAttribute( iface );
522 TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outNode);
523 return node_select_singlenode(&This->node, p, outNode);
526 static HRESULT WINAPI domattr_get_parsed(
527 IXMLDOMAttribute *iface,
528 VARIANT_BOOL* isParsed)
530 domattr *This = impl_from_IXMLDOMAttribute( iface );
531 FIXME("(%p)->(%p) stub!\n", This, isParsed);
532 *isParsed = VARIANT_TRUE;
536 static HRESULT WINAPI domattr_get_namespaceURI(
537 IXMLDOMAttribute *iface,
540 domattr *This = impl_from_IXMLDOMAttribute( iface );
541 TRACE("(%p)->(%p)\n", This, p);
542 return node_get_namespaceURI(&This->node, p);
545 static HRESULT WINAPI domattr_get_prefix(
546 IXMLDOMAttribute *iface,
549 domattr *This = impl_from_IXMLDOMAttribute( iface );
550 TRACE("(%p)->(%p)\n", This, prefix);
551 return node_get_prefix( &This->node, prefix );
554 static HRESULT WINAPI domattr_get_baseName(
555 IXMLDOMAttribute *iface,
558 domattr *This = impl_from_IXMLDOMAttribute( iface );
559 TRACE("(%p)->(%p)\n", This, name);
560 return node_get_base_name( &This->node, name );
563 static HRESULT WINAPI domattr_transformNodeToObject(
564 IXMLDOMAttribute *iface,
565 IXMLDOMNode* domNode, VARIANT var1)
567 domattr *This = impl_from_IXMLDOMAttribute( iface );
568 FIXME("(%p)->(%p %s)\n", This, domNode, debugstr_variant(&var1));
572 static HRESULT WINAPI domattr_get_name(
573 IXMLDOMAttribute *iface,
576 domattr *This = impl_from_IXMLDOMAttribute( iface );
578 TRACE("(%p)->(%p)\n", This, p);
580 return node_get_nodeName(&This->node, p);
583 static HRESULT WINAPI domattr_get_value(
584 IXMLDOMAttribute *iface,
587 domattr *This = impl_from_IXMLDOMAttribute( iface );
589 TRACE("(%p)->(%p)\n", This, value);
591 return node_get_content(&This->node, value);
594 static HRESULT WINAPI domattr_put_value(
595 IXMLDOMAttribute *iface,
598 domattr *This = impl_from_IXMLDOMAttribute( iface );
600 TRACE("(%p)->(%s)\n", This, debugstr_variant(&value));
602 return node_put_value(&This->node, &value);
605 static const struct IXMLDOMAttributeVtbl domattr_vtbl =
607 domattr_QueryInterface,
610 domattr_GetTypeInfoCount,
612 domattr_GetIDsOfNames,
614 domattr_get_nodeName,
615 domattr_get_nodeValue,
616 domattr_put_nodeValue,
617 domattr_get_nodeType,
618 domattr_get_parentNode,
619 domattr_get_childNodes,
620 domattr_get_firstChild,
621 domattr_get_lastChild,
622 domattr_get_previousSibling,
623 domattr_get_nextSibling,
624 domattr_get_attributes,
625 domattr_insertBefore,
626 domattr_replaceChild,
629 domattr_hasChildNodes,
630 domattr_get_ownerDocument,
632 domattr_get_nodeTypeString,
635 domattr_get_specified,
636 domattr_get_definition,
637 domattr_get_nodeTypedValue,
638 domattr_put_nodeTypedValue,
639 domattr_get_dataType,
640 domattr_put_dataType,
642 domattr_transformNode,
644 domattr_selectSingleNode,
646 domattr_get_namespaceURI,
648 domattr_get_baseName,
649 domattr_transformNodeToObject,
655 IUnknown* create_attribute( xmlNodePtr attribute )
659 This = heap_alloc( sizeof *This );
663 This->IXMLDOMAttribute_iface.lpVtbl = &domattr_vtbl;
666 init_xmlnode(&This->node, attribute, (IXMLDOMNode*)&This->IXMLDOMAttribute_iface, NULL);
668 return (IUnknown*)&This->IXMLDOMAttribute_iface;