mshtml: Silence IMarshal QueryInterface FIXME.
[wine] / dlls / mshtml / htmlanchor.c
1 /*
2  * Copyright 2007 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 #include <stdio.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 "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 IHTMLAnchorElementVtbl *lpHTMLAnchorElementVtbl;
39 } HTMLAnchorElement;
40
41 #define HTMLANCHOR(x)  ((IHTMLAnchorElement*)  &(x)->lpHTMLAnchorElementVtbl)
42
43 #define HTMLANCHOR_THIS(iface) DEFINE_THIS(HTMLAnchorElement, HTMLAnchorElement, iface)
44
45 static HRESULT WINAPI HTMLAnchorElement_QueryInterface(IHTMLAnchorElement *iface,
46         REFIID riid, void **ppv)
47 {
48     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
49
50     return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv);
51 }
52
53 static ULONG WINAPI HTMLAnchorElement_AddRef(IHTMLAnchorElement *iface)
54 {
55     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
56
57     return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
58 }
59
60 static ULONG WINAPI HTMLAnchorElement_Release(IHTMLAnchorElement *iface)
61 {
62     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
63
64     return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
65 }
66
67 static HRESULT WINAPI HTMLAnchorElement_GetTypeInfoCount(IHTMLAnchorElement *iface, UINT *pctinfo)
68 {
69     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
70     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->element.node.dispex), pctinfo);
71 }
72
73 static HRESULT WINAPI HTMLAnchorElement_GetTypeInfo(IHTMLAnchorElement *iface, UINT iTInfo,
74                                               LCID lcid, ITypeInfo **ppTInfo)
75 {
76     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
77     return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->element.node.dispex), iTInfo, lcid, ppTInfo);
78 }
79
80 static HRESULT WINAPI HTMLAnchorElement_GetIDsOfNames(IHTMLAnchorElement *iface, REFIID riid,
81                                                 LPOLESTR *rgszNames, UINT cNames,
82                                                 LCID lcid, DISPID *rgDispId)
83 {
84     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
85     return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->element.node.dispex), riid, rgszNames, cNames, lcid, rgDispId);
86 }
87
88 static HRESULT WINAPI HTMLAnchorElement_Invoke(IHTMLAnchorElement *iface, DISPID dispIdMember,
89                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
90                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
91 {
92     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
93     return IDispatchEx_Invoke(DISPATCHEX(&This->element.node.dispex), dispIdMember, riid, lcid,
94             wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
95 }
96
97 static HRESULT WINAPI HTMLAnchorElement_put_href(IHTMLAnchorElement *iface, BSTR v)
98 {
99     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
100     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
101     return E_NOTIMPL;
102 }
103
104 static HRESULT WINAPI HTMLAnchorElement_get_href(IHTMLAnchorElement *iface, BSTR *p)
105 {
106     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
107     FIXME("(%p)->(%p)\n", This, p);
108     return E_NOTIMPL;
109 }
110
111 static HRESULT WINAPI HTMLAnchorElement_put_target(IHTMLAnchorElement *iface, BSTR v)
112 {
113     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
114     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
115     return E_NOTIMPL;
116 }
117
118 static HRESULT WINAPI HTMLAnchorElement_get_target(IHTMLAnchorElement *iface, BSTR *p)
119 {
120     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
121     FIXME("(%p)->(%p)\n", This, p);
122     return E_NOTIMPL;
123 }
124
125 static HRESULT WINAPI HTMLAnchorElement_put_rel(IHTMLAnchorElement *iface, BSTR v)
126 {
127     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
128     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
129     return E_NOTIMPL;
130 }
131
132 static HRESULT WINAPI HTMLAnchorElement_get_rel(IHTMLAnchorElement *iface, BSTR *p)
133 {
134     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
135     FIXME("(%p)->(%p)\n", This, p);
136     return E_NOTIMPL;
137 }
138
139 static HRESULT WINAPI HTMLAnchorElement_put_rev(IHTMLAnchorElement *iface, BSTR v)
140 {
141     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
142     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
143     return E_NOTIMPL;
144 }
145
146 static HRESULT WINAPI HTMLAnchorElement_get_rev(IHTMLAnchorElement *iface, BSTR *p)
147 {
148     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
149     FIXME("(%p)->(%p)\n", This, p);
150     return E_NOTIMPL;
151 }
152
153 static HRESULT WINAPI HTMLAnchorElement_put_urn(IHTMLAnchorElement *iface, BSTR v)
154 {
155     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
156     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
157     return E_NOTIMPL;
158 }
159
160 static HRESULT WINAPI HTMLAnchorElement_get_urn(IHTMLAnchorElement *iface, BSTR *p)
161 {
162     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
163     FIXME("(%p)->(%p)\n", This, p);
164     return E_NOTIMPL;
165 }
166
167 static HRESULT WINAPI HTMLAnchorElement_put_Methods(IHTMLAnchorElement *iface, BSTR v)
168 {
169     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
170     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
171     return E_NOTIMPL;
172 }
173
174 static HRESULT WINAPI HTMLAnchorElement_get_Methods(IHTMLAnchorElement *iface, BSTR *p)
175 {
176     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
177     FIXME("(%p)->(%p)\n", This, p);
178     return E_NOTIMPL;
179 }
180
181 static HRESULT WINAPI HTMLAnchorElement_put_name(IHTMLAnchorElement *iface, BSTR v)
182 {
183     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
184     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
185     return E_NOTIMPL;
186 }
187
188 static HRESULT WINAPI HTMLAnchorElement_get_name(IHTMLAnchorElement *iface, BSTR *p)
189 {
190     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
191     FIXME("(%p)->(%p)\n", This, p);
192     return E_NOTIMPL;
193 }
194
195 static HRESULT WINAPI HTMLAnchorElement_put_host(IHTMLAnchorElement *iface, BSTR v)
196 {
197     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
198     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
199     return E_NOTIMPL;
200 }
201
202 static HRESULT WINAPI HTMLAnchorElement_get_host(IHTMLAnchorElement *iface, BSTR *p)
203 {
204     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
205     FIXME("(%p)->(%p)\n", This, p);
206     return E_NOTIMPL;
207 }
208
209 static HRESULT WINAPI HTMLAnchorElement_put_hostname(IHTMLAnchorElement *iface, BSTR v)
210 {
211     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
212     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
213     return E_NOTIMPL;
214 }
215
216 static HRESULT WINAPI HTMLAnchorElement_get_hostname(IHTMLAnchorElement *iface, BSTR *p)
217 {
218     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
219     FIXME("(%p)->(%p)\n", This, p);
220     return E_NOTIMPL;
221 }
222
223 static HRESULT WINAPI HTMLAnchorElement_put_pathname(IHTMLAnchorElement *iface, BSTR v)
224 {
225     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
226     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
227     return E_NOTIMPL;
228 }
229
230 static HRESULT WINAPI HTMLAnchorElement_get_pathname(IHTMLAnchorElement *iface, BSTR *p)
231 {
232     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
233     FIXME("(%p)->(%p)\n", This, p);
234     return E_NOTIMPL;
235 }
236
237 static HRESULT WINAPI HTMLAnchorElement_put_port(IHTMLAnchorElement *iface, BSTR v)
238 {
239     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
240     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
241     return E_NOTIMPL;
242 }
243
244 static HRESULT WINAPI HTMLAnchorElement_get_port(IHTMLAnchorElement *iface, BSTR *p)
245 {
246     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
247     FIXME("(%p)->(%p)\n", This, p);
248     return E_NOTIMPL;
249 }
250
251 static HRESULT WINAPI HTMLAnchorElement_put_protocol(IHTMLAnchorElement *iface, BSTR v)
252 {
253     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
254     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
255     return E_NOTIMPL;
256 }
257
258 static HRESULT WINAPI HTMLAnchorElement_get_protocol(IHTMLAnchorElement *iface, BSTR *p)
259 {
260     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
261     FIXME("(%p)->(%p)\n", This, p);
262     return E_NOTIMPL;
263 }
264
265 static HRESULT WINAPI HTMLAnchorElement_put_search(IHTMLAnchorElement *iface, BSTR v)
266 {
267     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
268     FIXME("(%p)->(%p)\n", This, debugstr_w(v));
269     return E_NOTIMPL;
270 }
271
272 static HRESULT WINAPI HTMLAnchorElement_get_search(IHTMLAnchorElement *iface, BSTR *p)
273 {
274     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
275     FIXME("(%p)->(%p)\n", This, p);
276     return E_NOTIMPL;
277 }
278
279 static HRESULT WINAPI HTMLAnchorElement_put_hash(IHTMLAnchorElement *iface, BSTR v)
280 {
281     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
282     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
283     return E_NOTIMPL;
284 }
285
286 static HRESULT WINAPI HTMLAnchorElement_get_hash(IHTMLAnchorElement *iface, BSTR *p)
287 {
288     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
289     FIXME("(%p)->(%p)\n", This, p);
290     return E_NOTIMPL;
291 }
292
293 static HRESULT WINAPI HTMLAnchorElement_put_onblur(IHTMLAnchorElement *iface, VARIANT v)
294 {
295     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
296     FIXME("(%p)->()\n", This);
297     return E_NOTIMPL;
298 }
299
300 static HRESULT WINAPI HTMLAnchorElement_get_onblur(IHTMLAnchorElement *iface, VARIANT *p)
301 {
302     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
303     FIXME("(%p)->(%p)\n", This, p);
304     return E_NOTIMPL;
305 }
306
307 static HRESULT WINAPI HTMLAnchorElement_put_onfocus(IHTMLAnchorElement *iface, VARIANT v)
308 {
309     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
310     FIXME("(%p)->()\n", This);
311     return E_NOTIMPL;
312 }
313
314 static HRESULT WINAPI HTMLAnchorElement_get_onfocus(IHTMLAnchorElement *iface, VARIANT *p)
315 {
316     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
317     FIXME("(%p)->(%p)\n", This, p);
318     return E_NOTIMPL;
319 }
320
321 static HRESULT WINAPI HTMLAnchorElement_put_accessKey(IHTMLAnchorElement *iface, BSTR v)
322 {
323     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
324     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
325     return E_NOTIMPL;
326 }
327
328 static HRESULT WINAPI HTMLAnchorElement_get_accessKey(IHTMLAnchorElement *iface, BSTR *p)
329 {
330     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
331     FIXME("(%p)->(%p)\n", This, p);
332     return E_NOTIMPL;
333 }
334
335 static HRESULT WINAPI HTMLAnchorElement_get_protocolLong(IHTMLAnchorElement *iface, BSTR *p)
336 {
337     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
338     FIXME("(%p)->(%p)\n", This, p);
339     return E_NOTIMPL;
340 }
341
342 static HRESULT WINAPI HTMLAnchorElement_get_mimeType(IHTMLAnchorElement *iface, BSTR *p)
343 {
344     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
345     FIXME("(%p)->(%p)\n", This, p);
346     return E_NOTIMPL;
347 }
348
349 static HRESULT WINAPI HTMLAnchorElement_get_nameProp(IHTMLAnchorElement *iface, BSTR *p)
350 {
351     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
352     FIXME("(%p)->(%p)\n", This, p);
353     return E_NOTIMPL;
354 }
355
356 static HRESULT WINAPI HTMLAnchorElement_put_tabIndex(IHTMLAnchorElement *iface, short v)
357 {
358     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
359     FIXME("(%p)->()\n", This);
360     return E_NOTIMPL;
361 }
362
363 static HRESULT WINAPI HTMLAnchorElement_get_tabIndex(IHTMLAnchorElement *iface, short *p)
364 {
365     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
366     FIXME("(%p)->(%p)\n", This, p);
367     return E_NOTIMPL;
368 }
369
370 static HRESULT WINAPI HTMLAnchorElement_focus(IHTMLAnchorElement *iface)
371 {
372     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
373     FIXME("(%p)\n", This);
374     return E_NOTIMPL;
375 }
376
377 static HRESULT WINAPI HTMLAnchorElement_blur(IHTMLAnchorElement *iface)
378 {
379     HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
380     FIXME("(%p)\n", This);
381     return E_NOTIMPL;
382 }
383
384 #undef HTMLANCHOR_THIS
385
386 static const IHTMLAnchorElementVtbl HTMLAnchorElementVtbl = {
387     HTMLAnchorElement_QueryInterface,
388     HTMLAnchorElement_AddRef,
389     HTMLAnchorElement_Release,
390     HTMLAnchorElement_GetTypeInfoCount,
391     HTMLAnchorElement_GetTypeInfo,
392     HTMLAnchorElement_GetIDsOfNames,
393     HTMLAnchorElement_Invoke,
394     HTMLAnchorElement_put_href,
395     HTMLAnchorElement_get_href,
396     HTMLAnchorElement_put_target,
397     HTMLAnchorElement_get_target,
398     HTMLAnchorElement_put_rel,
399     HTMLAnchorElement_get_rel,
400     HTMLAnchorElement_put_rev,
401     HTMLAnchorElement_get_rev,
402     HTMLAnchorElement_put_urn,
403     HTMLAnchorElement_get_urn,
404     HTMLAnchorElement_put_Methods,
405     HTMLAnchorElement_get_Methods,
406     HTMLAnchorElement_put_name,
407     HTMLAnchorElement_get_name,
408     HTMLAnchorElement_put_host,
409     HTMLAnchorElement_get_host,
410     HTMLAnchorElement_put_hostname,
411     HTMLAnchorElement_get_hostname,
412     HTMLAnchorElement_put_pathname,
413     HTMLAnchorElement_get_pathname,
414     HTMLAnchorElement_put_port,
415     HTMLAnchorElement_get_port,
416     HTMLAnchorElement_put_protocol,
417     HTMLAnchorElement_get_protocol,
418     HTMLAnchorElement_put_search,
419     HTMLAnchorElement_get_search,
420     HTMLAnchorElement_put_hash,
421     HTMLAnchorElement_get_hash,
422     HTMLAnchorElement_put_onblur,
423     HTMLAnchorElement_get_onblur,
424     HTMLAnchorElement_put_onfocus,
425     HTMLAnchorElement_get_onfocus,
426     HTMLAnchorElement_put_accessKey,
427     HTMLAnchorElement_get_accessKey,
428     HTMLAnchorElement_get_protocolLong,
429     HTMLAnchorElement_get_mimeType,
430     HTMLAnchorElement_get_nameProp,
431     HTMLAnchorElement_put_tabIndex,
432     HTMLAnchorElement_get_tabIndex,
433     HTMLAnchorElement_focus,
434     HTMLAnchorElement_blur
435 };
436
437 #define HTMLANCHOR_NODE_THIS(iface) DEFINE_THIS2(HTMLAnchorElement, element.node, iface)
438
439 static HRESULT HTMLAnchorElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
440 {
441     HTMLAnchorElement *This = HTMLANCHOR_NODE_THIS(iface);
442
443     *ppv = NULL;
444
445     if(IsEqualGUID(&IID_IUnknown, riid)) {
446         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
447         *ppv = HTMLANCHOR(This);
448     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
449         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
450         *ppv = HTMLANCHOR(This);
451     }else if(IsEqualGUID(&IID_IHTMLAnchorElement, riid)) {
452         TRACE("(%p)->(IID_IHTMLAnchorElement %p)\n", This, ppv);
453         *ppv = HTMLANCHOR(This);
454     }
455
456     if(*ppv) {
457         IUnknown_AddRef((IUnknown*)*ppv);
458         return S_OK;
459     }
460
461     return HTMLElement_QI(&This->element.node, riid, ppv);
462 }
463
464 static void HTMLAnchorElement_destructor(HTMLDOMNode *iface)
465 {
466     HTMLAnchorElement *This = HTMLANCHOR_NODE_THIS(iface);
467     HTMLElement_destructor(&This->element.node);
468 }
469
470 #undef HTMLANCHOR_NODE_THIS
471
472 static const NodeImplVtbl HTMLAnchorElementImplVtbl = {
473     HTMLAnchorElement_QI,
474     HTMLAnchorElement_destructor
475 };
476
477 HTMLElement *HTMLAnchorElement_Create(nsIDOMHTMLElement *nselem)
478 {
479     HTMLAnchorElement *ret = heap_alloc_zero(sizeof(HTMLAnchorElement));
480
481     HTMLElement_Init(&ret->element);
482
483     ret->lpHTMLAnchorElementVtbl = &HTMLAnchorElementVtbl;
484     ret->element.node.vtbl = &HTMLAnchorElementImplVtbl;
485
486     return &ret->element;
487 }