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));
83 IXMLDOMText_AddRef((IUnknown*)*ppvObject);
87 static ULONG WINAPI domattr_AddRef(
88 IXMLDOMAttribute *iface )
90 domattr *This = impl_from_IXMLDOMAttribute( iface );
91 return InterlockedIncrement( &This->ref );
94 static ULONG WINAPI domattr_Release(
95 IXMLDOMAttribute *iface )
97 domattr *This = impl_from_IXMLDOMAttribute( iface );
100 ref = InterlockedDecrement( &This->ref );
103 destroy_xmlnode(&This->node);
110 static HRESULT WINAPI domattr_GetTypeInfoCount(
111 IXMLDOMAttribute *iface,
114 domattr *This = impl_from_IXMLDOMAttribute( iface );
116 TRACE("(%p)->(%p)\n", This, pctinfo);
123 static HRESULT WINAPI domattr_GetTypeInfo(
124 IXMLDOMAttribute *iface,
125 UINT iTInfo, LCID lcid,
126 ITypeInfo** ppTInfo )
128 domattr *This = impl_from_IXMLDOMAttribute( iface );
131 TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
133 hr = get_typeinfo(IXMLDOMAttribute_tid, ppTInfo);
138 static HRESULT WINAPI domattr_GetIDsOfNames(
139 IXMLDOMAttribute *iface,
140 REFIID riid, LPOLESTR* rgszNames,
141 UINT cNames, LCID lcid, DISPID* rgDispId )
143 domattr *This = impl_from_IXMLDOMAttribute( iface );
147 TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
150 if(!rgszNames || cNames == 0 || !rgDispId)
153 hr = get_typeinfo(IXMLDOMAttribute_tid, &typeinfo);
156 hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
157 ITypeInfo_Release(typeinfo);
163 static HRESULT WINAPI domattr_Invoke(
164 IXMLDOMAttribute *iface,
165 DISPID dispIdMember, REFIID riid, LCID lcid,
166 WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
167 EXCEPINFO* pExcepInfo, UINT* puArgErr )
169 domattr *This = impl_from_IXMLDOMAttribute( iface );
173 TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
174 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
176 hr = get_typeinfo(IXMLDOMAttribute_tid, &typeinfo);
179 hr = ITypeInfo_Invoke(typeinfo, &This->IXMLDOMAttribute_iface, dispIdMember, wFlags,
180 pDispParams, pVarResult, pExcepInfo, puArgErr);
181 ITypeInfo_Release(typeinfo);
186 static HRESULT WINAPI domattr_get_nodeName(
187 IXMLDOMAttribute *iface,
190 domattr *This = impl_from_IXMLDOMAttribute( iface );
192 TRACE("(%p)->(%p)\n", This, p);
194 return node_get_nodeName(&This->node, p);
197 static HRESULT WINAPI domattr_get_nodeValue(
198 IXMLDOMAttribute *iface,
201 domattr *This = impl_from_IXMLDOMAttribute( iface );
203 TRACE("(%p)->(%p)\n", This, value);
205 return node_get_content(&This->node, value);
208 static HRESULT WINAPI domattr_put_nodeValue(
209 IXMLDOMAttribute *iface,
212 domattr *This = impl_from_IXMLDOMAttribute( iface );
214 TRACE("(%p)->(%s)\n", This, debugstr_variant(&value));
216 return node_put_value_escaped(&This->node, &value);
219 static HRESULT WINAPI domattr_get_nodeType(
220 IXMLDOMAttribute *iface,
221 DOMNodeType* domNodeType )
223 domattr *This = impl_from_IXMLDOMAttribute( iface );
225 TRACE("(%p)->(%p)\n", This, domNodeType);
227 *domNodeType = NODE_ATTRIBUTE;
231 static HRESULT WINAPI domattr_get_parentNode(
232 IXMLDOMAttribute *iface,
233 IXMLDOMNode** parent )
235 domattr *This = impl_from_IXMLDOMAttribute( iface );
236 TRACE("(%p)->(%p)\n", This, parent);
237 if (!parent) return E_INVALIDARG;
242 static HRESULT WINAPI domattr_get_childNodes(
243 IXMLDOMAttribute *iface,
244 IXMLDOMNodeList** outList)
246 domattr *This = impl_from_IXMLDOMAttribute( iface );
248 TRACE("(%p)->(%p)\n", This, outList);
250 return node_get_child_nodes(&This->node, outList);
253 static HRESULT WINAPI domattr_get_firstChild(
254 IXMLDOMAttribute *iface,
255 IXMLDOMNode** domNode)
257 domattr *This = impl_from_IXMLDOMAttribute( iface );
259 TRACE("(%p)->(%p)\n", This, domNode);
261 return node_get_first_child(&This->node, domNode);
264 static HRESULT WINAPI domattr_get_lastChild(
265 IXMLDOMAttribute *iface,
266 IXMLDOMNode** domNode)
268 domattr *This = impl_from_IXMLDOMAttribute( iface );
270 TRACE("(%p)->(%p)\n", This, domNode);
272 return node_get_last_child(&This->node, domNode);
275 static HRESULT WINAPI domattr_get_previousSibling(
276 IXMLDOMAttribute *iface,
277 IXMLDOMNode** domNode)
279 domattr *This = impl_from_IXMLDOMAttribute( iface );
281 TRACE("(%p)->(%p)\n", This, domNode);
283 return return_null_node(domNode);
286 static HRESULT WINAPI domattr_get_nextSibling(
287 IXMLDOMAttribute *iface,
288 IXMLDOMNode** domNode)
290 domattr *This = impl_from_IXMLDOMAttribute( iface );
292 TRACE("(%p)->(%p)\n", This, domNode);
294 return return_null_node(domNode);
297 static HRESULT WINAPI domattr_get_attributes(
298 IXMLDOMAttribute *iface,
299 IXMLDOMNamedNodeMap** attributeMap)
301 domattr *This = impl_from_IXMLDOMAttribute( iface );
303 TRACE("(%p)->(%p)\n", This, attributeMap);
305 return return_null_ptr((void**)attributeMap);
308 static HRESULT WINAPI domattr_insertBefore(
309 IXMLDOMAttribute *iface,
310 IXMLDOMNode* newNode, VARIANT refChild,
311 IXMLDOMNode** outOldNode)
313 domattr *This = impl_from_IXMLDOMAttribute( iface );
315 FIXME("(%p)->(%p %s %p) needs test\n", This, newNode, debugstr_variant(&refChild), outOldNode);
317 return node_insert_before(&This->node, newNode, &refChild, outOldNode);
320 static HRESULT WINAPI domattr_replaceChild(
321 IXMLDOMAttribute *iface,
322 IXMLDOMNode* newNode,
323 IXMLDOMNode* oldNode,
324 IXMLDOMNode** outOldNode)
326 domattr *This = impl_from_IXMLDOMAttribute( iface );
328 FIXME("(%p)->(%p %p %p) needs tests\n", This, newNode, oldNode, outOldNode);
330 return node_replace_child(&This->node, newNode, oldNode, outOldNode);
333 static HRESULT WINAPI domattr_removeChild(
334 IXMLDOMAttribute *iface,
335 IXMLDOMNode *child, IXMLDOMNode **oldChild)
337 domattr *This = impl_from_IXMLDOMAttribute( iface );
338 TRACE("(%p)->(%p %p)\n", This, child, oldChild);
339 return node_remove_child(&This->node, child, oldChild);
342 static HRESULT WINAPI domattr_appendChild(
343 IXMLDOMAttribute *iface,
344 IXMLDOMNode *child, IXMLDOMNode **outChild)
346 domattr *This = impl_from_IXMLDOMAttribute( iface );
347 TRACE("(%p)->(%p %p)\n", This, child, outChild);
348 return node_append_child(&This->node, child, outChild);
351 static HRESULT WINAPI domattr_hasChildNodes(
352 IXMLDOMAttribute *iface,
355 domattr *This = impl_from_IXMLDOMAttribute( iface );
356 TRACE("(%p)->(%p)\n", This, ret);
357 return node_has_childnodes(&This->node, ret);
360 static HRESULT WINAPI domattr_get_ownerDocument(
361 IXMLDOMAttribute *iface,
362 IXMLDOMDocument **doc)
364 domattr *This = impl_from_IXMLDOMAttribute( iface );
365 TRACE("(%p)->(%p)\n", This, doc);
366 return node_get_owner_doc(&This->node, doc);
369 static HRESULT WINAPI domattr_cloneNode(
370 IXMLDOMAttribute *iface,
371 VARIANT_BOOL deep, IXMLDOMNode** outNode)
373 domattr *This = impl_from_IXMLDOMAttribute( iface );
374 TRACE("(%p)->(%d %p)\n", This, deep, outNode);
375 return node_clone( &This->node, deep, outNode );
378 static HRESULT WINAPI domattr_get_nodeTypeString(
379 IXMLDOMAttribute *iface,
382 domattr *This = impl_from_IXMLDOMAttribute( iface );
383 static const WCHAR attributeW[] = {'a','t','t','r','i','b','u','t','e',0};
385 TRACE("(%p)->(%p)\n", This, p);
387 return return_bstr(attributeW, p);
390 static HRESULT WINAPI domattr_get_text(
391 IXMLDOMAttribute *iface,
394 domattr *This = impl_from_IXMLDOMAttribute( iface );
395 TRACE("(%p)->(%p)\n", This, p);
396 return node_get_text(&This->node, p);
399 static HRESULT WINAPI domattr_put_text(
400 IXMLDOMAttribute *iface,
403 domattr *This = impl_from_IXMLDOMAttribute( iface );
404 TRACE("(%p)->(%s)\n", This, debugstr_w(p));
405 return node_put_text( &This->node, p );
408 static HRESULT WINAPI domattr_get_specified(
409 IXMLDOMAttribute *iface,
410 VARIANT_BOOL* isSpecified)
412 domattr *This = impl_from_IXMLDOMAttribute( iface );
413 FIXME("(%p)->(%p) stub!\n", This, isSpecified);
414 *isSpecified = VARIANT_TRUE;
418 static HRESULT WINAPI domattr_get_definition(
419 IXMLDOMAttribute *iface,
420 IXMLDOMNode** definitionNode)
422 domattr *This = impl_from_IXMLDOMAttribute( iface );
423 FIXME("(%p)->(%p)\n", This, definitionNode);
427 static HRESULT WINAPI domattr_get_nodeTypedValue(
428 IXMLDOMAttribute *iface,
431 domattr *This = impl_from_IXMLDOMAttribute( iface );
432 FIXME("(%p)->(%p)\n", This, var1);
433 return return_null_var(var1);
436 static HRESULT WINAPI domattr_put_nodeTypedValue(
437 IXMLDOMAttribute *iface,
440 domattr *This = impl_from_IXMLDOMAttribute( iface );
441 FIXME("(%p)->(%s)\n", This, debugstr_variant(&typedValue));
445 static HRESULT WINAPI domattr_get_dataType(
446 IXMLDOMAttribute *iface,
449 domattr *This = impl_from_IXMLDOMAttribute( iface );
450 TRACE("(%p)->(%p)\n", This, typename);
451 return return_null_var( typename );
454 static HRESULT WINAPI domattr_put_dataType(
455 IXMLDOMAttribute *iface,
458 domattr *This = impl_from_IXMLDOMAttribute( iface );
460 FIXME("(%p)->(%s)\n", This, debugstr_w(p));
468 static HRESULT WINAPI domattr_get_xml(
469 IXMLDOMAttribute *iface,
472 domattr *This = impl_from_IXMLDOMAttribute( iface );
474 TRACE("(%p)->(%p)\n", This, p);
476 return node_get_xml(&This->node, FALSE, FALSE, p);
479 static HRESULT WINAPI domattr_transformNode(
480 IXMLDOMAttribute *iface,
481 IXMLDOMNode *node, BSTR *p)
483 domattr *This = impl_from_IXMLDOMAttribute( iface );
484 TRACE("(%p)->(%p %p)\n", This, node, p);
485 return node_transform_node(&This->node, node, p);
488 static HRESULT WINAPI domattr_selectNodes(
489 IXMLDOMAttribute *iface,
490 BSTR p, IXMLDOMNodeList** outList)
492 domattr *This = impl_from_IXMLDOMAttribute( iface );
493 TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outList);
494 return node_select_nodes(&This->node, p, outList);
497 static HRESULT WINAPI domattr_selectSingleNode(
498 IXMLDOMAttribute *iface,
499 BSTR p, IXMLDOMNode** outNode)
501 domattr *This = impl_from_IXMLDOMAttribute( iface );
502 TRACE("(%p)->(%s %p)\n", This, debugstr_w(p), outNode);
503 return node_select_singlenode(&This->node, p, outNode);
506 static HRESULT WINAPI domattr_get_parsed(
507 IXMLDOMAttribute *iface,
508 VARIANT_BOOL* isParsed)
510 domattr *This = impl_from_IXMLDOMAttribute( iface );
511 FIXME("(%p)->(%p) stub!\n", This, isParsed);
512 *isParsed = VARIANT_TRUE;
516 static HRESULT WINAPI domattr_get_namespaceURI(
517 IXMLDOMAttribute *iface,
520 domattr *This = impl_from_IXMLDOMAttribute( iface );
521 TRACE("(%p)->(%p)\n", This, p);
522 return node_get_namespaceURI(&This->node, p);
525 static HRESULT WINAPI domattr_get_prefix(
526 IXMLDOMAttribute *iface,
529 domattr *This = impl_from_IXMLDOMAttribute( iface );
530 TRACE("(%p)->(%p)\n", This, prefix);
531 return node_get_prefix( &This->node, prefix );
534 static HRESULT WINAPI domattr_get_baseName(
535 IXMLDOMAttribute *iface,
538 domattr *This = impl_from_IXMLDOMAttribute( iface );
539 TRACE("(%p)->(%p)\n", This, name);
540 return node_get_base_name( &This->node, name );
543 static HRESULT WINAPI domattr_transformNodeToObject(
544 IXMLDOMAttribute *iface,
545 IXMLDOMNode* domNode, VARIANT var1)
547 domattr *This = impl_from_IXMLDOMAttribute( iface );
548 FIXME("(%p)->(%p %s)\n", This, domNode, debugstr_variant(&var1));
552 static HRESULT WINAPI domattr_get_name(
553 IXMLDOMAttribute *iface,
556 domattr *This = impl_from_IXMLDOMAttribute( iface );
558 TRACE("(%p)->(%p)\n", This, p);
560 return node_get_nodeName(&This->node, p);
563 static HRESULT WINAPI domattr_get_value(
564 IXMLDOMAttribute *iface,
567 domattr *This = impl_from_IXMLDOMAttribute( iface );
569 TRACE("(%p)->(%p)\n", This, value);
571 return node_get_content(&This->node, value);
574 static HRESULT WINAPI domattr_put_value(
575 IXMLDOMAttribute *iface,
578 domattr *This = impl_from_IXMLDOMAttribute( iface );
580 TRACE("(%p)->(%s)\n", This, debugstr_variant(&value));
582 return node_put_value(&This->node, &value);
585 static const struct IXMLDOMAttributeVtbl domattr_vtbl =
587 domattr_QueryInterface,
590 domattr_GetTypeInfoCount,
592 domattr_GetIDsOfNames,
594 domattr_get_nodeName,
595 domattr_get_nodeValue,
596 domattr_put_nodeValue,
597 domattr_get_nodeType,
598 domattr_get_parentNode,
599 domattr_get_childNodes,
600 domattr_get_firstChild,
601 domattr_get_lastChild,
602 domattr_get_previousSibling,
603 domattr_get_nextSibling,
604 domattr_get_attributes,
605 domattr_insertBefore,
606 domattr_replaceChild,
609 domattr_hasChildNodes,
610 domattr_get_ownerDocument,
612 domattr_get_nodeTypeString,
615 domattr_get_specified,
616 domattr_get_definition,
617 domattr_get_nodeTypedValue,
618 domattr_put_nodeTypedValue,
619 domattr_get_dataType,
620 domattr_put_dataType,
622 domattr_transformNode,
624 domattr_selectSingleNode,
626 domattr_get_namespaceURI,
628 domattr_get_baseName,
629 domattr_transformNodeToObject,
635 IUnknown* create_attribute( xmlNodePtr attribute )
639 This = heap_alloc( sizeof *This );
643 This->IXMLDOMAttribute_iface.lpVtbl = &domattr_vtbl;
646 init_xmlnode(&This->node, attribute, (IXMLDOMNode*)&This->IXMLDOMAttribute_iface, NULL);
648 return (IUnknown*)&This->IXMLDOMAttribute_iface;