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 #include <assert.h>
22
23 #define COBJMACROS
24
25 #include "windef.h"
26 #include "winbase.h"
27 #include "winuser.h"
28 #include "ole2.h"
29
30 #include "mshtml_private.h"
31
32 #include "wine/debug.h"
33
34 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
35
36 static inline HTMLDOMAttribute *impl_from_IHTMLDOMAttribute(IHTMLDOMAttribute *iface)
37 {
38 return CONTAINING_RECORD(iface, HTMLDOMAttribute, IHTMLDOMAttribute_iface);
39 }
40
41 static HRESULT WINAPI HTMLDOMAttribute_QueryInterface(IHTMLDOMAttribute *iface,
42 REFIID riid, void **ppv)
43 {
44 HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
45
46 if(IsEqualGUID(&IID_IUnknown, riid)) {
47 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
48 *ppv = &This->IHTMLDOMAttribute_iface;
49 }else if(IsEqualGUID(&IID_IHTMLDOMAttribute, riid)) {
50 TRACE("(%p)->(IID_IHTMLDOMAttribute %p)\n", This, ppv);
51 *ppv = &This->IHTMLDOMAttribute_iface;
52 }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
53 return *ppv ? S_OK : E_NOINTERFACE;
54 }else {
55 WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
56 *ppv = NULL;
57 return E_NOINTERFACE;
58 }
59
60 IUnknown_AddRef((IUnknown*)*ppv);
61 return S_OK;
62 }
63
64 static ULONG WINAPI HTMLDOMAttribute_AddRef(IHTMLDOMAttribute *iface)
65 {
66 HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
67 LONG ref = InterlockedIncrement(&This->ref);
68
69 TRACE("(%p) ref=%d\n", This, ref);
70
71 return ref;
72 }
73
74 static ULONG WINAPI HTMLDOMAttribute_Release(IHTMLDOMAttribute *iface)
75 {
76 HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
77 LONG ref = InterlockedDecrement(&This->ref);
78
79 TRACE("(%p) ref=%d\n", This, ref);
80
81 if(!ref) {
82 assert(!This->elem);
83 release_dispex(&This->dispex);
84 heap_free(This);
85 }
86
87 return ref;
88 }
89
90 static HRESULT WINAPI HTMLDOMAttribute_GetTypeInfoCount(IHTMLDOMAttribute *iface, UINT *pctinfo)
91 {
92 HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
93 return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
94 }
95
96 static HRESULT WINAPI HTMLDOMAttribute_GetTypeInfo(IHTMLDOMAttribute *iface, UINT iTInfo,
97 LCID lcid, ITypeInfo **ppTInfo)
98 {
99 HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
100 return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
101 }
102
103 static HRESULT WINAPI HTMLDOMAttribute_GetIDsOfNames(IHTMLDOMAttribute *iface, REFIID riid,
104 LPOLESTR *rgszNames, UINT cNames,
105 LCID lcid, DISPID *rgDispId)
106 {
107 HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
108 return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames, cNames,
109 lcid, rgDispId);
110 }
111
112 static HRESULT WINAPI HTMLDOMAttribute_Invoke(IHTMLDOMAttribute *iface, DISPID dispIdMember,
113 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
114 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
115 {
116 HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
117 return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid, lcid,
118 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
119 }
120
121 static HRESULT WINAPI HTMLDOMAttribute_get_nodeName(IHTMLDOMAttribute *iface, BSTR *p)
122 {
123 HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
124
125 TRACE("(%p)->(%p)\n", This, p);
126
127 return IDispatchEx_GetMemberName(&This->elem->node.dispex.IDispatchEx_iface, This->dispid, p);
128 }
129
130 static HRESULT WINAPI HTMLDOMAttribute_put_nodeName(IHTMLDOMAttribute *iface, VARIANT v)
131 {
132 HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
133 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
134 return E_NOTIMPL;
135 }
136
137 static HRESULT WINAPI HTMLDOMAttribute_get_nodeValue(IHTMLDOMAttribute *iface, VARIANT *p)
138 {
139 HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
140 DISPPARAMS dp = {NULL, NULL, 0, 0};
141 EXCEPINFO ei;
142
143 TRACE("(%p)->(%p)\n", This, p);
144
145 if(!This->elem) {
146 FIXME("NULL This->elem\n");
147 return E_UNEXPECTED;
148 }
149
150 memset(&ei, 0, sizeof(ei));
151 return IDispatchEx_InvokeEx(&This->elem->node.dispex.IDispatchEx_iface, This->dispid, LOCALE_SYSTEM_DEFAULT,
152 DISPATCH_PROPERTYGET, &dp, p, &ei, NULL);
153 }
154
155 static HRESULT WINAPI HTMLDOMAttribute_get_specified(IHTMLDOMAttribute *iface, VARIANT_BOOL *p)
156 {
157 HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface);
158 FIXME("(%p)->(%p)\n", This, p);
159 return E_NOTIMPL;
160 }
161
162 static const IHTMLDOMAttributeVtbl HTMLDOMAttributeVtbl = {
163 HTMLDOMAttribute_QueryInterface,
164 HTMLDOMAttribute_AddRef,
165 HTMLDOMAttribute_Release,
166 HTMLDOMAttribute_GetTypeInfoCount,
167 HTMLDOMAttribute_GetTypeInfo,
168 HTMLDOMAttribute_GetIDsOfNames,
169 HTMLDOMAttribute_Invoke,
170 HTMLDOMAttribute_get_nodeName,
171 HTMLDOMAttribute_put_nodeName,
172 HTMLDOMAttribute_get_nodeValue,
173 HTMLDOMAttribute_get_specified
174 };
175
176 static const tid_t HTMLDOMAttribute_iface_tids[] = {
177 IHTMLDOMAttribute_tid,
178 0
179 };
180 static dispex_static_data_t HTMLDOMAttribute_dispex = {
181 NULL,
182 DispHTMLDOMAttribute_tid,
183 0,
184 HTMLDOMAttribute_iface_tids
185 };
186
187 HRESULT HTMLDOMAttribute_Create(HTMLElement *elem, DISPID dispid, HTMLDOMAttribute **attr)
188 {
189 HTMLAttributeCollection *col;
190 HTMLDOMAttribute *ret;
191 HRESULT hres;
192
193 ret = heap_alloc_zero(sizeof(*ret));
194 if(!ret)
195 return E_OUTOFMEMORY;
196
197 hres = HTMLElement_get_attr_col(&elem->node, &col);
198 if(FAILED(hres)) {
199 heap_free(ret);
200 return hres;
201 }
202 IHTMLAttributeCollection_Release(&col->IHTMLAttributeCollection_iface);
203
204 ret->IHTMLDOMAttribute_iface.lpVtbl = &HTMLDOMAttributeVtbl;
205 ret->ref = 1;
206
207 ret->dispid = dispid;
208 ret->elem = elem;
209 list_add_tail(&elem->attrs->attrs, &ret->entry);
210
211 init_dispex(&ret->dispex, (IUnknown*)&ret->IHTMLDOMAttribute_iface,
212 &HTMLDOMAttribute_dispex);
213
214 *attr = ret;
215 return S_OK;
216 }
217
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.