mshtml: Moved cloneNode implementation to vtbl.
[wine] / dlls / mshtml / htmlembed.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 IHTMLEmbedElementVtbl *lpIHTMLEmbedElementVtbl;
39 } HTMLEmbedElement;
40
41 #define HTMLEMBED(x)  (&(x)->lpIHTMLEmbedElementVtbl)
42
43 #define HTMLEMBED_THIS(iface) DEFINE_THIS(HTMLEmbedElement, IHTMLEmbedElement, iface)
44
45 static HRESULT WINAPI HTMLEmbedElement_QueryInterface(IHTMLEmbedElement *iface,
46         REFIID riid, void **ppv)
47 {
48     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
49
50     return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv);
51 }
52
53 static ULONG WINAPI HTMLEmbedElement_AddRef(IHTMLEmbedElement *iface)
54 {
55     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
56
57     return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
58 }
59
60 static ULONG WINAPI HTMLEmbedElement_Release(IHTMLEmbedElement *iface)
61 {
62     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
63
64     return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
65 }
66
67 static HRESULT WINAPI HTMLEmbedElement_GetTypeInfoCount(IHTMLEmbedElement *iface, UINT *pctinfo)
68 {
69     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
70     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->element.node.dispex), pctinfo);
71 }
72
73 static HRESULT WINAPI HTMLEmbedElement_GetTypeInfo(IHTMLEmbedElement *iface, UINT iTInfo,
74         LCID lcid, ITypeInfo **ppTInfo)
75 {
76     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
77     return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->element.node.dispex), iTInfo, lcid, ppTInfo);
78 }
79
80 static HRESULT WINAPI HTMLEmbedElement_GetIDsOfNames(IHTMLEmbedElement *iface, REFIID riid,
81         LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
82 {
83     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
84     return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->element.node.dispex), riid, rgszNames, cNames, lcid, rgDispId);
85 }
86
87 static HRESULT WINAPI HTMLEmbedElement_Invoke(IHTMLEmbedElement *iface, DISPID dispIdMember,
88         REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
89         VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
90 {
91     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
92     return IDispatchEx_Invoke(DISPATCHEX(&This->element.node.dispex), dispIdMember, riid, lcid, wFlags, pDispParams,
93             pVarResult, pExcepInfo, puArgErr);
94 }
95
96 static HRESULT WINAPI HTMLEmbedElement_put_hidden(IHTMLEmbedElement *iface, BSTR v)
97 {
98     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
99     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
100     return E_NOTIMPL;
101 }
102
103 static HRESULT WINAPI HTMLEmbedElement_get_hidden(IHTMLEmbedElement *iface, BSTR *p)
104 {
105     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
106     FIXME("(%p)->(%p)\n", This, p);
107     return E_NOTIMPL;
108 }
109
110 static HRESULT WINAPI HTMLEmbedElement_get_palete(IHTMLEmbedElement *iface, BSTR *p)
111 {
112     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
113     FIXME("(%p)->(%p)\n", This, p);
114     return E_NOTIMPL;
115 }
116
117 static HRESULT WINAPI HTMLEmbedElement_get_pluginspage(IHTMLEmbedElement *iface, BSTR *p)
118 {
119     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
120     FIXME("(%p)->(%p)\n", This, p);
121     return E_NOTIMPL;
122 }
123
124 static HRESULT WINAPI HTMLEmbedElement_put_src(IHTMLEmbedElement *iface, BSTR v)
125 {
126     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
127     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
128     return E_NOTIMPL;
129 }
130
131 static HRESULT WINAPI HTMLEmbedElement_get_src(IHTMLEmbedElement *iface, BSTR *p)
132 {
133     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
134     FIXME("(%p)->(%p)\n", This, p);
135     return E_NOTIMPL;
136 }
137
138 static HRESULT WINAPI HTMLEmbedElement_put_units(IHTMLEmbedElement *iface, BSTR v)
139 {
140     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
141     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
142     return E_NOTIMPL;
143 }
144
145 static HRESULT WINAPI HTMLEmbedElement_get_units(IHTMLEmbedElement *iface, BSTR *p)
146 {
147     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
148     FIXME("(%p)->(%p)\n", This, p);
149     return E_NOTIMPL;
150 }
151
152 static HRESULT WINAPI HTMLEmbedElement_put_name(IHTMLEmbedElement *iface, BSTR v)
153 {
154     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
155     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
156     return E_NOTIMPL;
157 }
158
159 static HRESULT WINAPI HTMLEmbedElement_get_name(IHTMLEmbedElement *iface, BSTR *p)
160 {
161     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
162     FIXME("(%p)->(%p)\n", This, p);
163     return E_NOTIMPL;
164 }
165
166 static HRESULT WINAPI HTMLEmbedElement_put_width(IHTMLEmbedElement *iface, VARIANT v)
167 {
168     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
169     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
170     return E_NOTIMPL;
171 }
172
173 static HRESULT WINAPI HTMLEmbedElement_get_width(IHTMLEmbedElement *iface, VARIANT *p)
174 {
175     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
176     FIXME("(%p)->(%p)\n", This, p);
177     return E_NOTIMPL;
178 }
179
180 static HRESULT WINAPI HTMLEmbedElement_put_height(IHTMLEmbedElement *iface, VARIANT v)
181 {
182     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
183     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
184     return E_NOTIMPL;
185 }
186
187 static HRESULT WINAPI HTMLEmbedElement_get_height(IHTMLEmbedElement *iface, VARIANT *p)
188 {
189     HTMLEmbedElement *This = HTMLEMBED_THIS(iface);
190     FIXME("(%p)->(%p)\n", This, p);
191     return E_NOTIMPL;
192 }
193
194 #undef HTMLEMBED_THIS
195
196 static const IHTMLEmbedElementVtbl HTMLEmbedElementVtbl = {
197     HTMLEmbedElement_QueryInterface,
198     HTMLEmbedElement_AddRef,
199     HTMLEmbedElement_Release,
200     HTMLEmbedElement_GetTypeInfoCount,
201     HTMLEmbedElement_GetTypeInfo,
202     HTMLEmbedElement_GetIDsOfNames,
203     HTMLEmbedElement_Invoke,
204     HTMLEmbedElement_put_hidden,
205     HTMLEmbedElement_get_hidden,
206     HTMLEmbedElement_get_palete,
207     HTMLEmbedElement_get_pluginspage,
208     HTMLEmbedElement_put_src,
209     HTMLEmbedElement_get_src,
210     HTMLEmbedElement_put_units,
211     HTMLEmbedElement_get_units,
212     HTMLEmbedElement_put_name,
213     HTMLEmbedElement_get_name,
214     HTMLEmbedElement_put_width,
215     HTMLEmbedElement_get_width,
216     HTMLEmbedElement_put_height,
217     HTMLEmbedElement_get_height
218 };
219
220 #define HTMLEMBED_NODE_THIS(iface) DEFINE_THIS2(HTMLEmbedElement, element.node, iface)
221
222 static HRESULT HTMLEmbedElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
223 {
224     HTMLEmbedElement *This = HTMLEMBED_NODE_THIS(iface);
225
226     if(IsEqualGUID(&IID_IUnknown, riid)) {
227         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
228         *ppv = HTMLEMBED(This);
229     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
230         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
231         *ppv = HTMLEMBED(This);
232     }else if(IsEqualGUID(&IID_IHTMLEmbedElement, riid)) {
233         TRACE("(%p)->(IID_IHTMLEmbedElement %p)\n", This, ppv);
234         *ppv = HTMLEMBED(This);
235     }else {
236         return HTMLElement_QI(&This->element.node, riid, ppv);
237     }
238
239     IUnknown_AddRef((IUnknown*)*ppv);
240     return S_OK;
241 }
242
243 static void HTMLEmbedElement_destructor(HTMLDOMNode *iface)
244 {
245     HTMLEmbedElement *This = HTMLEMBED_NODE_THIS(iface);
246
247     HTMLElement_destructor(&This->element.node);
248 }
249
250 #undef HTMLEMBED_NODE_THIS
251
252 static const NodeImplVtbl HTMLEmbedElementImplVtbl = {
253     HTMLEmbedElement_QI,
254     HTMLEmbedElement_destructor,
255     HTMLElement_clone
256 };
257
258 static const tid_t HTMLEmbedElement_iface_tids[] = {
259     HTMLELEMENT_TIDS,
260     IHTMLEmbedElement_tid,
261     0
262 };
263 static dispex_static_data_t HTMLEmbedElement_dispex = {
264     NULL,
265     DispHTMLEmbed_tid,
266     NULL,
267     HTMLEmbedElement_iface_tids
268 };
269
270 HTMLElement *HTMLEmbedElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem)
271 {
272     HTMLEmbedElement *ret = heap_alloc_zero(sizeof(*ret));
273
274     ret->lpIHTMLEmbedElementVtbl = &HTMLEmbedElementVtbl;
275     ret->element.node.vtbl = &HTMLEmbedElementImplVtbl;
276
277     HTMLElement_Init(&ret->element, doc, nselem, &HTMLEmbedElement_dispex);
278     return &ret->element;
279 }