mshtml: Added IHTMLElement4::getAttributeNode implementation.
[wine] / dlls / mshtml / htmlattr.c
1 /*
2  * Copyright 2011 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19
20 #include <stdarg.h>
21
22 #define COBJMACROS
23
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winuser.h"
27 #include "ole2.h"
28
29 #include "mshtml_private.h"
30
31 #include "wine/debug.h"
32
33 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
34
35 static inline HTMLDOMAttribute *impl_from_IHTMLDOMAttribute(IHTMLDOMAttribute *iface)
36 {
37     return CONTAINING_RECORD(iface, HTMLDOMAttribute, IHTMLDOMAttribute_iface);
38 }
39
40 static HRESULT WINAPI HTMLDOMAttribute_QueryInterface(IHTMLDOMAttribute *iface,
41                                                  REFIID riid, void **ppv)
42 {
43     HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
44
45     if(IsEqualGUID(&IID_IUnknown, riid)) {
46         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
47         *ppv = &This->IHTMLDOMAttribute_iface;
48     }else if(IsEqualGUID(&IID_IHTMLDOMAttribute, riid)) {
49         TRACE("(%p)->(IID_IHTMLDOMAttribute %p)\n", This, ppv);
50         *ppv = &This->IHTMLDOMAttribute_iface;
51     }else {
52         WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
53         *ppv =  NULL;
54         return E_NOINTERFACE;
55     }
56
57     IUnknown_AddRef((IUnknown*)*ppv);
58     return S_OK;
59 }
60
61 static ULONG WINAPI HTMLDOMAttribute_AddRef(IHTMLDOMAttribute *iface)
62 {
63     HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
64     LONG ref = InterlockedIncrement(&This->ref);
65
66     TRACE("(%p) ref=%d\n", This, ref);
67
68     return ref;
69 }
70
71 static ULONG WINAPI HTMLDOMAttribute_Release(IHTMLDOMAttribute *iface)
72 {
73     HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
74     LONG ref = InterlockedDecrement(&This->ref);
75
76     TRACE("(%p) ref=%d\n", This, ref);
77
78     if(!ref) {
79         nsIDOMAttr_Release(This->nsattr);
80         heap_free(This);
81     }
82
83     return ref;
84 }
85
86 static HRESULT WINAPI HTMLDOMAttribute_GetTypeInfoCount(IHTMLDOMAttribute *iface, UINT *pctinfo)
87 {
88     HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
89     FIXME("%p\n", This);
90     return E_NOTIMPL;
91 }
92
93 static HRESULT WINAPI HTMLDOMAttribute_GetTypeInfo(IHTMLDOMAttribute *iface, UINT iTInfo,
94                                               LCID lcid, ITypeInfo **ppTInfo)
95 {
96     HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
97     FIXME("%p\n", This);
98     return E_NOTIMPL;
99 }
100
101 static HRESULT WINAPI HTMLDOMAttribute_GetIDsOfNames(IHTMLDOMAttribute *iface, REFIID riid,
102                                                 LPOLESTR *rgszNames, UINT cNames,
103                                                 LCID lcid, DISPID *rgDispId)
104 {
105     HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
106     FIXME("%p\n", This);
107     return E_NOTIMPL;
108 }
109
110 static HRESULT WINAPI HTMLDOMAttribute_Invoke(IHTMLDOMAttribute *iface, DISPID dispIdMember,
111                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
112                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
113 {
114     HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
115     FIXME("%p\n", This);
116     return E_NOTIMPL;
117 }
118
119 static HRESULT WINAPI HTMLDOMAttribute_get_nodeName(IHTMLDOMAttribute *iface, BSTR *p)
120 {
121     HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
122     FIXME("(%p)->(%p)\n", This, p);
123     return E_NOTIMPL;
124 }
125
126 static HRESULT WINAPI HTMLDOMAttribute_put_nodeName(IHTMLDOMAttribute *iface, VARIANT v)
127 {
128     HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
129     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
130     return E_NOTIMPL;
131 }
132
133 static HRESULT WINAPI HTMLDOMAttribute_get_nodeValue(IHTMLDOMAttribute *iface, VARIANT *p)
134 {
135     HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
136     FIXME("(%p)->(%p)\n", This, p);
137     return E_NOTIMPL;
138 }
139
140 static HRESULT WINAPI HTMLDOMAttribute_get_specified(IHTMLDOMAttribute *iface, VARIANT_BOOL *p)
141 {
142     HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
143     FIXME("(%p)->(%p)\n", This, p);
144     return E_NOTIMPL;
145 }
146
147 static const IHTMLDOMAttributeVtbl HTMLDOMAttributeVtbl = {
148     HTMLDOMAttribute_QueryInterface,
149     HTMLDOMAttribute_AddRef,
150     HTMLDOMAttribute_Release,
151     HTMLDOMAttribute_GetTypeInfoCount,
152     HTMLDOMAttribute_GetTypeInfo,
153     HTMLDOMAttribute_GetIDsOfNames,
154     HTMLDOMAttribute_Invoke,
155     HTMLDOMAttribute_get_nodeName,
156     HTMLDOMAttribute_put_nodeName,
157     HTMLDOMAttribute_get_nodeValue,
158     HTMLDOMAttribute_get_specified
159 };
160
161 HRESULT HTMLDOMAttribute_Create(HTMLDocumentNode *doc, nsIDOMAttr *nsattr, HTMLDOMAttribute **attr)
162 {
163     HTMLDOMAttribute *ret;
164
165     ret = heap_alloc_zero(sizeof(*ret));
166     if(!ret)
167         return E_OUTOFMEMORY;
168
169     ret->IHTMLDOMAttribute_iface.lpVtbl = &HTMLDOMAttributeVtbl;
170     ret->ref = 1;
171
172     nsIDOMAttr_AddRef(nsattr);
173     ret->nsattr = nsattr;
174
175     *attr = ret;
176     return S_OK;
177 }