mshtml: Moved cloneNode implementation to vtbl.
[wine] / dlls / mshtml / htmlobject.c
1 /*
2  * Copyright 2010 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 #include <stdarg.h>
20
21 #define COBJMACROS
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "winreg.h"
27 #include "ole2.h"
28
29 #include "wine/debug.h"
30
31 #include "mshtml_private.h"
32
33 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
34
35 typedef struct {
36     HTMLElement element;
37
38     const IHTMLObjectElementVtbl *lpIHTMLObjectElementVtbl;
39
40     nsIDOMHTMLObjectElement *nsobject;
41 } HTMLObjectElement;
42
43 #define HTMLOBJECT(x)  (&(x)->lpIHTMLObjectElementVtbl)
44
45 #define HTMLOBJECT_THIS(iface) DEFINE_THIS(HTMLObjectElement, IHTMLObjectElement, iface)
46
47 static HRESULT WINAPI HTMLObjectElement_QueryInterface(IHTMLObjectElement *iface,
48         REFIID riid, void **ppv)
49 {
50     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
51
52     return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv);
53 }
54
55 static ULONG WINAPI HTMLObjectElement_AddRef(IHTMLObjectElement *iface)
56 {
57     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
58
59     return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
60 }
61
62 static ULONG WINAPI HTMLObjectElement_Release(IHTMLObjectElement *iface)
63 {
64     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
65
66     return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
67 }
68
69 static HRESULT WINAPI HTMLObjectElement_GetTypeInfoCount(IHTMLObjectElement *iface, UINT *pctinfo)
70 {
71     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
72     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->element.node.dispex), pctinfo);
73 }
74
75 static HRESULT WINAPI HTMLObjectElement_GetTypeInfo(IHTMLObjectElement *iface, UINT iTInfo,
76                                               LCID lcid, ITypeInfo **ppTInfo)
77 {
78     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
79     return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->element.node.dispex), iTInfo, lcid, ppTInfo);
80 }
81
82 static HRESULT WINAPI HTMLObjectElement_GetIDsOfNames(IHTMLObjectElement *iface, REFIID riid,
83                                                 LPOLESTR *rgszNames, UINT cNames,
84                                                 LCID lcid, DISPID *rgDispId)
85 {
86     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
87     return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->element.node.dispex), riid, rgszNames, cNames, lcid, rgDispId);
88 }
89
90 static HRESULT WINAPI HTMLObjectElement_Invoke(IHTMLObjectElement *iface, DISPID dispIdMember,
91                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
92                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
93 {
94     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
95     return IDispatchEx_Invoke(DISPATCHEX(&This->element.node.dispex), dispIdMember, riid, lcid, wFlags, pDispParams,
96             pVarResult, pExcepInfo, puArgErr);
97 }
98
99 static HRESULT WINAPI HTMLObjectElement_get_object(IHTMLObjectElement *iface, IDispatch **p)
100 {
101     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
102     FIXME("(%p)->(%p)\n", This, p);
103     return E_NOTIMPL;
104 }
105
106 static HRESULT WINAPI HTMLObjectElement_get_classid(IHTMLObjectElement *iface, BSTR *p)
107 {
108     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
109     FIXME("(%p)->(%p)\n", This, p);
110     return E_NOTIMPL;
111 }
112
113 static HRESULT WINAPI HTMLObjectElement_get_data(IHTMLObjectElement *iface, BSTR *p)
114 {
115     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
116     FIXME("(%p)->(%p)\n", This, p);
117     return E_NOTIMPL;
118 }
119
120 static HRESULT WINAPI HTMLObjectElement_put_recordset(IHTMLObjectElement *iface, IDispatch *v)
121 {
122     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
123     FIXME("(%p)->(%p)\n", This, v);
124     return E_NOTIMPL;
125 }
126
127 static HRESULT WINAPI HTMLObjectElement_get_recordset(IHTMLObjectElement *iface, IDispatch **p)
128 {
129     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
130     FIXME("(%p)->(%p)\n", This, p);
131     return E_NOTIMPL;
132 }
133
134 static HRESULT WINAPI HTMLObjectElement_put_align(IHTMLObjectElement *iface, BSTR v)
135 {
136     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
137     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
138     return E_NOTIMPL;
139 }
140
141 static HRESULT WINAPI HTMLObjectElement_get_align(IHTMLObjectElement *iface, BSTR *p)
142 {
143     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
144     FIXME("(%p)->(%p)\n", This, p);
145     return E_NOTIMPL;
146 }
147
148 static HRESULT WINAPI HTMLObjectElement_put_name(IHTMLObjectElement *iface, BSTR v)
149 {
150     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
151     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
152     return E_NOTIMPL;
153 }
154
155 static HRESULT WINAPI HTMLObjectElement_get_name(IHTMLObjectElement *iface, BSTR *p)
156 {
157     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
158     FIXME("(%p)->(%p)\n", This, p);
159     return E_NOTIMPL;
160 }
161
162 static HRESULT WINAPI HTMLObjectElement_put_codeBase(IHTMLObjectElement *iface, BSTR v)
163 {
164     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
165     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
166     return E_NOTIMPL;
167 }
168
169 static HRESULT WINAPI HTMLObjectElement_get_codeBase(IHTMLObjectElement *iface, BSTR *p)
170 {
171     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
172     FIXME("(%p)->(%p)\n", This, p);
173     return E_NOTIMPL;
174 }
175
176 static HRESULT WINAPI HTMLObjectElement_put_codeType(IHTMLObjectElement *iface, BSTR v)
177 {
178     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
179     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
180     return E_NOTIMPL;
181 }
182
183 static HRESULT WINAPI HTMLObjectElement_get_codeType(IHTMLObjectElement *iface, BSTR *p)
184 {
185     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
186     FIXME("(%p)->(%p)\n", This, p);
187     return E_NOTIMPL;
188 }
189
190 static HRESULT WINAPI HTMLObjectElement_put_code(IHTMLObjectElement *iface, BSTR v)
191 {
192     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
193     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
194     return E_NOTIMPL;
195 }
196
197 static HRESULT WINAPI HTMLObjectElement_get_code(IHTMLObjectElement *iface, BSTR *p)
198 {
199     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
200     FIXME("(%p)->(%p)\n", This, p);
201     return E_NOTIMPL;
202 }
203
204 static HRESULT WINAPI HTMLObjectElement_get_BaseHref(IHTMLObjectElement *iface, BSTR *p)
205 {
206     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
207     FIXME("(%p)->(%p)\n", This, p);
208     return E_NOTIMPL;
209 }
210
211 static HRESULT WINAPI HTMLObjectElement_put_type(IHTMLObjectElement *iface, BSTR v)
212 {
213     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
214     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
215     return E_NOTIMPL;
216 }
217
218 static HRESULT WINAPI HTMLObjectElement_get_type(IHTMLObjectElement *iface, BSTR *p)
219 {
220     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
221     FIXME("(%p)->(%p)\n", This, p);
222     return E_NOTIMPL;
223 }
224
225 static HRESULT WINAPI HTMLObjectElement_get_form(IHTMLObjectElement *iface, IHTMLFormElement **p)
226 {
227     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
228     FIXME("(%p)->(%p)\n", This, p);
229     return E_NOTIMPL;
230 }
231
232 static HRESULT WINAPI HTMLObjectElement_put_width(IHTMLObjectElement *iface, VARIANT v)
233 {
234     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
235     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
236     return E_NOTIMPL;
237 }
238
239 static HRESULT WINAPI HTMLObjectElement_get_width(IHTMLObjectElement *iface, VARIANT *p)
240 {
241     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
242     FIXME("(%p)->(%p)\n", This, p);
243     return E_NOTIMPL;
244 }
245
246 static HRESULT WINAPI HTMLObjectElement_put_height(IHTMLObjectElement *iface, VARIANT v)
247 {
248     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
249     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
250     return E_NOTIMPL;
251 }
252
253 static HRESULT WINAPI HTMLObjectElement_get_height(IHTMLObjectElement *iface, VARIANT *p)
254 {
255     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
256     FIXME("(%p)->(%p)\n", This, p);
257     return E_NOTIMPL;
258 }
259
260 static HRESULT WINAPI HTMLObjectElement_get_readyState(IHTMLObjectElement *iface, LONG *p)
261 {
262     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
263     FIXME("(%p)->(%p)\n", This, p);
264     return E_NOTIMPL;
265 }
266
267 static HRESULT WINAPI HTMLObjectElement_put_onreadystatechange(IHTMLObjectElement *iface, VARIANT v)
268 {
269     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
270     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
271     return E_NOTIMPL;
272 }
273
274 static HRESULT WINAPI HTMLObjectElement_get_onreadystatechange(IHTMLObjectElement *iface, VARIANT *p)
275 {
276     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
277     FIXME("(%p)->(%p)\n", This, p);
278     return E_NOTIMPL;
279 }
280
281 static HRESULT WINAPI HTMLObjectElement_put_onerror(IHTMLObjectElement *iface, VARIANT v)
282 {
283     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
284     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
285     return E_NOTIMPL;
286 }
287
288 static HRESULT WINAPI HTMLObjectElement_get_onerror(IHTMLObjectElement *iface, VARIANT *p)
289 {
290     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
291     FIXME("(%p)->(%p)\n", This, p);
292     return E_NOTIMPL;
293 }
294
295 static HRESULT WINAPI HTMLObjectElement_put_altHtml(IHTMLObjectElement *iface, BSTR v)
296 {
297     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
298     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
299     return E_NOTIMPL;
300 }
301
302 static HRESULT WINAPI HTMLObjectElement_get_altHtml(IHTMLObjectElement *iface, BSTR *p)
303 {
304     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
305     FIXME("(%p)->(%p)\n", This, p);
306     return E_NOTIMPL;
307 }
308
309 static HRESULT WINAPI HTMLObjectElement_put_vspace(IHTMLObjectElement *iface, LONG v)
310 {
311     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
312     FIXME("(%p)->(%d)\n", This, v);
313     return E_NOTIMPL;
314 }
315
316 static HRESULT WINAPI HTMLObjectElement_get_vspace(IHTMLObjectElement *iface, LONG *p)
317 {
318     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
319     PRInt32 vspace;
320     nsresult nsres;
321
322     TRACE("(%p)->(%p)\n", This, p);
323
324     nsres = nsIDOMHTMLObjectElement_GetVspace(This->nsobject, &vspace);
325     if(NS_FAILED(nsres)) {
326         ERR("GetVspace failed: %08x\n", nsres);
327         return E_FAIL;
328     }
329
330     *p = vspace;
331     return S_OK;
332 }
333
334 static HRESULT WINAPI HTMLObjectElement_put_hspace(IHTMLObjectElement *iface, LONG v)
335 {
336     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
337     FIXME("(%p)->(%d)\n", This, v);
338     return E_NOTIMPL;
339 }
340
341 static HRESULT WINAPI HTMLObjectElement_get_hspace(IHTMLObjectElement *iface, LONG *p)
342 {
343     HTMLObjectElement *This = HTMLOBJECT_THIS(iface);
344     FIXME("(%p)->(%p)\n", This, p);
345     return E_NOTIMPL;
346 }
347
348 #undef HTMLOBJECT_THIS
349
350 static const IHTMLObjectElementVtbl HTMLObjectElementVtbl = {
351     HTMLObjectElement_QueryInterface,
352     HTMLObjectElement_AddRef,
353     HTMLObjectElement_Release,
354     HTMLObjectElement_GetTypeInfoCount,
355     HTMLObjectElement_GetTypeInfo,
356     HTMLObjectElement_GetIDsOfNames,
357     HTMLObjectElement_Invoke,
358     HTMLObjectElement_get_object,
359     HTMLObjectElement_get_classid,
360     HTMLObjectElement_get_data,
361     HTMLObjectElement_put_recordset,
362     HTMLObjectElement_get_recordset,
363     HTMLObjectElement_put_align,
364     HTMLObjectElement_get_align,
365     HTMLObjectElement_put_name,
366     HTMLObjectElement_get_name,
367     HTMLObjectElement_put_codeBase,
368     HTMLObjectElement_get_codeBase,
369     HTMLObjectElement_put_codeType,
370     HTMLObjectElement_get_codeType,
371     HTMLObjectElement_put_code,
372     HTMLObjectElement_get_code,
373     HTMLObjectElement_get_BaseHref,
374     HTMLObjectElement_put_type,
375     HTMLObjectElement_get_type,
376     HTMLObjectElement_get_form,
377     HTMLObjectElement_put_width,
378     HTMLObjectElement_get_width,
379     HTMLObjectElement_put_height,
380     HTMLObjectElement_get_height,
381     HTMLObjectElement_get_readyState,
382     HTMLObjectElement_put_onreadystatechange,
383     HTMLObjectElement_get_onreadystatechange,
384     HTMLObjectElement_put_onerror,
385     HTMLObjectElement_get_onerror,
386     HTMLObjectElement_put_altHtml,
387     HTMLObjectElement_get_altHtml,
388     HTMLObjectElement_put_vspace,
389     HTMLObjectElement_get_vspace,
390     HTMLObjectElement_put_hspace,
391     HTMLObjectElement_get_hspace
392 };
393
394 #define HTMLOBJECT_NODE_THIS(iface) DEFINE_THIS2(HTMLObjectElement, element.node, iface)
395
396 static HRESULT HTMLObjectElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
397 {
398     HTMLObjectElement *This = HTMLOBJECT_NODE_THIS(iface);
399
400     if(IsEqualGUID(&IID_IUnknown, riid)) {
401         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
402         *ppv = HTMLOBJECT(This);
403     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
404         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
405         *ppv = HTMLOBJECT(This);
406     }else if(IsEqualGUID(&IID_IHTMLObjectElement, riid)) {
407         TRACE("(%p)->(IID_IHTMLObjectElement %p)\n", This, ppv);
408         *ppv = HTMLOBJECT(This);
409     }else {
410         return HTMLElement_QI(&This->element.node, riid, ppv);
411     }
412
413     IUnknown_AddRef((IUnknown*)*ppv);
414     return S_OK;
415 }
416
417 static void HTMLObjectElement_destructor(HTMLDOMNode *iface)
418 {
419     HTMLObjectElement *This = HTMLOBJECT_NODE_THIS(iface);
420
421     if(This->nsobject)
422         nsIDOMHTMLObjectElement_Release(This->nsobject);
423
424     HTMLElement_destructor(&This->element.node);
425 }
426
427 #undef HTMLOBJECT_NODE_THIS
428
429 static const NodeImplVtbl HTMLObjectElementImplVtbl = {
430     HTMLObjectElement_QI,
431     HTMLObjectElement_destructor,
432     HTMLElement_clone
433 };
434
435 static const tid_t HTMLObjectElement_iface_tids[] = {
436     HTMLELEMENT_TIDS,
437     IHTMLObjectElement_tid,
438     0
439 };
440 static dispex_static_data_t HTMLObjectElement_dispex = {
441     NULL,
442     DispHTMLObjectElement_tid,
443     NULL,
444     HTMLObjectElement_iface_tids
445 };
446
447 HTMLElement *HTMLObjectElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem)
448 {
449     HTMLObjectElement *ret = heap_alloc_zero(sizeof(*ret));
450     nsresult nsres;
451
452     ret->lpIHTMLObjectElementVtbl = &HTMLObjectElementVtbl;
453     ret->element.node.vtbl = &HTMLObjectElementImplVtbl;
454
455     HTMLElement_Init(&ret->element, doc, nselem, &HTMLObjectElement_dispex);
456
457     nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLObjectElement, (void**)&ret->nsobject);
458     if(NS_FAILED(nsres))
459         ERR("Could not get nsIDOMHTMLObjectElement iface: %08x\n", nsres);
460
461     return &ret->element;
462 }