blob: ae269ee252bc1ea89b1e3256601d09a2855d9a31 [file] [log] [blame]
Jacek Cabanbb907852007-09-12 23:38:14 +02001/*
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
Jacek Cabanbb907852007-09-12 23:38:14 +020019#include <stdarg.h>
20#include <stdio.h>
21
22#define COBJMACROS
23
24#include "windef.h"
25#include "winbase.h"
26#include "winuser.h"
Jacek Cabanbb907852007-09-12 23:38:14 +020027#include "ole2.h"
28
29#include "wine/debug.h"
30
31#include "mshtml_private.h"
32
33WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
34
35typedef struct {
Jacek Cabanf68e24a2007-09-15 16:04:57 +020036 HTMLElement element;
Jacek Cabanbb907852007-09-12 23:38:14 +020037
Jacek Cabanf68e24a2007-09-15 16:04:57 +020038 const IHTMLAnchorElementVtbl *lpHTMLAnchorElementVtbl;
Jacek Caban407e54b2009-10-02 13:52:36 +020039
40 nsIDOMHTMLAnchorElement *nsanchor;
Jacek Cabanbb907852007-09-12 23:38:14 +020041} HTMLAnchorElement;
42
Michael Stefaniuc25e90e22009-02-16 09:53:46 +010043#define HTMLANCHOR(x) (&(x)->lpHTMLAnchorElementVtbl)
Jacek Cabanbb907852007-09-12 23:38:14 +020044
45#define HTMLANCHOR_THIS(iface) DEFINE_THIS(HTMLAnchorElement, HTMLAnchorElement, iface)
46
47static HRESULT WINAPI HTMLAnchorElement_QueryInterface(IHTMLAnchorElement *iface,
48 REFIID riid, void **ppv)
49{
50 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Jacek Cabanbb907852007-09-12 23:38:14 +020051
Jacek Cabanf56c1a62007-10-04 02:10:36 +020052 return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv);
Jacek Cabanbb907852007-09-12 23:38:14 +020053}
54
55static ULONG WINAPI HTMLAnchorElement_AddRef(IHTMLAnchorElement *iface)
56{
57 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
58
Jacek Cabana95bfed2007-09-19 12:40:41 +020059 return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
Jacek Cabanbb907852007-09-12 23:38:14 +020060}
61
62static ULONG WINAPI HTMLAnchorElement_Release(IHTMLAnchorElement *iface)
63{
64 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
65
Jacek Cabana95bfed2007-09-19 12:40:41 +020066 return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
Jacek Cabanbb907852007-09-12 23:38:14 +020067}
68
69static HRESULT WINAPI HTMLAnchorElement_GetTypeInfoCount(IHTMLAnchorElement *iface, UINT *pctinfo)
70{
71 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Alistair Leslie-Hughes164e2642008-08-17 21:58:05 +100072 return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->element.node.dispex), pctinfo);
Jacek Cabanbb907852007-09-12 23:38:14 +020073}
74
75static HRESULT WINAPI HTMLAnchorElement_GetTypeInfo(IHTMLAnchorElement *iface, UINT iTInfo,
76 LCID lcid, ITypeInfo **ppTInfo)
77{
78 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Alistair Leslie-Hughes164e2642008-08-17 21:58:05 +100079 return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->element.node.dispex), iTInfo, lcid, ppTInfo);
Jacek Cabanbb907852007-09-12 23:38:14 +020080}
81
82static HRESULT WINAPI HTMLAnchorElement_GetIDsOfNames(IHTMLAnchorElement *iface, REFIID riid,
83 LPOLESTR *rgszNames, UINT cNames,
84 LCID lcid, DISPID *rgDispId)
85{
86 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Alistair Leslie-Hughes164e2642008-08-17 21:58:05 +100087 return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->element.node.dispex), riid, rgszNames, cNames, lcid, rgDispId);
Jacek Cabanbb907852007-09-12 23:38:14 +020088}
89
90static HRESULT WINAPI HTMLAnchorElement_Invoke(IHTMLAnchorElement *iface, DISPID dispIdMember,
91 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
92 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
93{
94 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Alistair Leslie-Hughes164e2642008-08-17 21:58:05 +100095 return IDispatchEx_Invoke(DISPATCHEX(&This->element.node.dispex), dispIdMember, riid, lcid,
96 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
Jacek Cabanbb907852007-09-12 23:38:14 +020097}
98
99static HRESULT WINAPI HTMLAnchorElement_put_href(IHTMLAnchorElement *iface, BSTR v)
100{
101 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
102 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
103 return E_NOTIMPL;
104}
105
106static HRESULT WINAPI HTMLAnchorElement_get_href(IHTMLAnchorElement *iface, BSTR *p)
107{
108 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Jacek Caban407e54b2009-10-02 13:52:36 +0200109 nsAString href_str;
110 nsresult nsres;
111 HRESULT hres;
112
113 TRACE("(%p)->(%p)\n", This, p);
114
115 nsAString_Init(&href_str, NULL);
116 nsres = nsIDOMHTMLAnchorElement_GetHref(This->nsanchor, &href_str);
117 if(NS_SUCCEEDED(nsres)) {
118 const PRUnichar *href;
119
120 nsAString_GetData(&href_str, &href);
121 hres = nsuri_to_url(href, TRUE, p);
122 }else {
123 ERR("GetHref failed: %08x\n", nsres);
124 hres = E_FAIL;
125 }
126
127 nsAString_Finish(&href_str);
128 return hres;
Jacek Cabanbb907852007-09-12 23:38:14 +0200129}
130
131static HRESULT WINAPI HTMLAnchorElement_put_target(IHTMLAnchorElement *iface, BSTR v)
132{
133 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
134 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
135 return E_NOTIMPL;
136}
137
138static HRESULT WINAPI HTMLAnchorElement_get_target(IHTMLAnchorElement *iface, BSTR *p)
139{
140 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
141 FIXME("(%p)->(%p)\n", This, p);
142 return E_NOTIMPL;
143}
144
145static HRESULT WINAPI HTMLAnchorElement_put_rel(IHTMLAnchorElement *iface, BSTR v)
146{
147 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
148 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
149 return E_NOTIMPL;
150}
151
152static HRESULT WINAPI HTMLAnchorElement_get_rel(IHTMLAnchorElement *iface, BSTR *p)
153{
154 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
155 FIXME("(%p)->(%p)\n", This, p);
156 return E_NOTIMPL;
157}
158
159static HRESULT WINAPI HTMLAnchorElement_put_rev(IHTMLAnchorElement *iface, BSTR v)
160{
161 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
162 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
163 return E_NOTIMPL;
164}
165
166static HRESULT WINAPI HTMLAnchorElement_get_rev(IHTMLAnchorElement *iface, BSTR *p)
167{
168 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
169 FIXME("(%p)->(%p)\n", This, p);
170 return E_NOTIMPL;
171}
172
173static HRESULT WINAPI HTMLAnchorElement_put_urn(IHTMLAnchorElement *iface, BSTR v)
174{
175 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
176 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
177 return E_NOTIMPL;
178}
179
180static HRESULT WINAPI HTMLAnchorElement_get_urn(IHTMLAnchorElement *iface, BSTR *p)
181{
182 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
183 FIXME("(%p)->(%p)\n", This, p);
184 return E_NOTIMPL;
185}
186
187static HRESULT WINAPI HTMLAnchorElement_put_Methods(IHTMLAnchorElement *iface, BSTR v)
188{
189 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
190 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
191 return E_NOTIMPL;
192}
193
194static HRESULT WINAPI HTMLAnchorElement_get_Methods(IHTMLAnchorElement *iface, BSTR *p)
195{
196 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
197 FIXME("(%p)->(%p)\n", This, p);
198 return E_NOTIMPL;
199}
200
201static HRESULT WINAPI HTMLAnchorElement_put_name(IHTMLAnchorElement *iface, BSTR v)
202{
203 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
204 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
205 return E_NOTIMPL;
206}
207
208static HRESULT WINAPI HTMLAnchorElement_get_name(IHTMLAnchorElement *iface, BSTR *p)
209{
210 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
211 FIXME("(%p)->(%p)\n", This, p);
212 return E_NOTIMPL;
213}
214
215static HRESULT WINAPI HTMLAnchorElement_put_host(IHTMLAnchorElement *iface, BSTR v)
216{
217 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
218 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
219 return E_NOTIMPL;
220}
221
222static HRESULT WINAPI HTMLAnchorElement_get_host(IHTMLAnchorElement *iface, BSTR *p)
223{
224 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
225 FIXME("(%p)->(%p)\n", This, p);
226 return E_NOTIMPL;
227}
228
229static HRESULT WINAPI HTMLAnchorElement_put_hostname(IHTMLAnchorElement *iface, BSTR v)
230{
231 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
232 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
233 return E_NOTIMPL;
234}
235
236static HRESULT WINAPI HTMLAnchorElement_get_hostname(IHTMLAnchorElement *iface, BSTR *p)
237{
238 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
239 FIXME("(%p)->(%p)\n", This, p);
240 return E_NOTIMPL;
241}
242
243static HRESULT WINAPI HTMLAnchorElement_put_pathname(IHTMLAnchorElement *iface, BSTR v)
244{
245 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
246 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
247 return E_NOTIMPL;
248}
249
250static HRESULT WINAPI HTMLAnchorElement_get_pathname(IHTMLAnchorElement *iface, BSTR *p)
251{
252 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
253 FIXME("(%p)->(%p)\n", This, p);
254 return E_NOTIMPL;
255}
256
257static HRESULT WINAPI HTMLAnchorElement_put_port(IHTMLAnchorElement *iface, BSTR v)
258{
259 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
260 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
261 return E_NOTIMPL;
262}
263
264static HRESULT WINAPI HTMLAnchorElement_get_port(IHTMLAnchorElement *iface, BSTR *p)
265{
266 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
267 FIXME("(%p)->(%p)\n", This, p);
268 return E_NOTIMPL;
269}
270
271static HRESULT WINAPI HTMLAnchorElement_put_protocol(IHTMLAnchorElement *iface, BSTR v)
272{
273 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
274 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
275 return E_NOTIMPL;
276}
277
278static HRESULT WINAPI HTMLAnchorElement_get_protocol(IHTMLAnchorElement *iface, BSTR *p)
279{
280 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
281 FIXME("(%p)->(%p)\n", This, p);
282 return E_NOTIMPL;
283}
284
285static HRESULT WINAPI HTMLAnchorElement_put_search(IHTMLAnchorElement *iface, BSTR v)
286{
287 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
288 FIXME("(%p)->(%p)\n", This, debugstr_w(v));
289 return E_NOTIMPL;
290}
291
292static HRESULT WINAPI HTMLAnchorElement_get_search(IHTMLAnchorElement *iface, BSTR *p)
293{
294 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
295 FIXME("(%p)->(%p)\n", This, p);
296 return E_NOTIMPL;
297}
298
299static HRESULT WINAPI HTMLAnchorElement_put_hash(IHTMLAnchorElement *iface, BSTR v)
300{
301 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
302 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
303 return E_NOTIMPL;
304}
305
306static HRESULT WINAPI HTMLAnchorElement_get_hash(IHTMLAnchorElement *iface, BSTR *p)
307{
308 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
309 FIXME("(%p)->(%p)\n", This, p);
310 return E_NOTIMPL;
311}
312
313static HRESULT WINAPI HTMLAnchorElement_put_onblur(IHTMLAnchorElement *iface, VARIANT v)
314{
315 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Jacek Caban2f0373d2009-11-23 15:37:26 +0100316
317 TRACE("(%p)->()\n", This);
318
319 return IHTMLElement2_put_onblur(HTMLELEM2(&This->element), v);
Jacek Cabanbb907852007-09-12 23:38:14 +0200320}
321
322static HRESULT WINAPI HTMLAnchorElement_get_onblur(IHTMLAnchorElement *iface, VARIANT *p)
323{
324 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Jacek Caban2f0373d2009-11-23 15:37:26 +0100325
326 TRACE("(%p)->(%p)\n", This, p);
327
328 return IHTMLElement2_get_onblur(HTMLELEM2(&This->element), p);
Jacek Cabanbb907852007-09-12 23:38:14 +0200329}
330
331static HRESULT WINAPI HTMLAnchorElement_put_onfocus(IHTMLAnchorElement *iface, VARIANT v)
332{
333 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Jacek Caban2f0373d2009-11-23 15:37:26 +0100334
335 TRACE("(%p)->()\n", This);
336
337 return IHTMLElement2_put_onfocus(HTMLELEM2(&This->element), v);
Jacek Cabanbb907852007-09-12 23:38:14 +0200338}
339
340static HRESULT WINAPI HTMLAnchorElement_get_onfocus(IHTMLAnchorElement *iface, VARIANT *p)
341{
342 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Jacek Caban2f0373d2009-11-23 15:37:26 +0100343
344 TRACE("(%p)->(%p)\n", This, p);
345
346 return IHTMLElement2_get_onfocus(HTMLELEM2(&This->element), p);
Jacek Cabanbb907852007-09-12 23:38:14 +0200347}
348
349static HRESULT WINAPI HTMLAnchorElement_put_accessKey(IHTMLAnchorElement *iface, BSTR v)
350{
351 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Jacek Caban2f0373d2009-11-23 15:37:26 +0100352
353 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
354
355 return IHTMLElement2_put_accessKey(HTMLELEM2(&This->element), v);
Jacek Cabanbb907852007-09-12 23:38:14 +0200356}
357
358static HRESULT WINAPI HTMLAnchorElement_get_accessKey(IHTMLAnchorElement *iface, BSTR *p)
359{
360 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Jacek Caban2f0373d2009-11-23 15:37:26 +0100361
362 TRACE("(%p)->(%p)\n", This, p);
363
364 return IHTMLElement2_get_accessKey(HTMLELEM2(&This->element), p);
Jacek Cabanbb907852007-09-12 23:38:14 +0200365}
366
367static HRESULT WINAPI HTMLAnchorElement_get_protocolLong(IHTMLAnchorElement *iface, BSTR *p)
368{
369 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
370 FIXME("(%p)->(%p)\n", This, p);
371 return E_NOTIMPL;
372}
373
374static HRESULT WINAPI HTMLAnchorElement_get_mimeType(IHTMLAnchorElement *iface, BSTR *p)
375{
376 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
377 FIXME("(%p)->(%p)\n", This, p);
378 return E_NOTIMPL;
379}
380
381static HRESULT WINAPI HTMLAnchorElement_get_nameProp(IHTMLAnchorElement *iface, BSTR *p)
382{
383 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
384 FIXME("(%p)->(%p)\n", This, p);
385 return E_NOTIMPL;
386}
387
388static HRESULT WINAPI HTMLAnchorElement_put_tabIndex(IHTMLAnchorElement *iface, short v)
389{
390 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Jacek Caban2f0373d2009-11-23 15:37:26 +0100391
392 TRACE("(%p)->()\n", This);
393
394 return IHTMLElement2_put_tabIndex(HTMLELEM2(&This->element), v);
Jacek Cabanbb907852007-09-12 23:38:14 +0200395}
396
397static HRESULT WINAPI HTMLAnchorElement_get_tabIndex(IHTMLAnchorElement *iface, short *p)
398{
399 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Jacek Caban2f0373d2009-11-23 15:37:26 +0100400
401 TRACE("(%p)->(%p)\n", This, p);
402
403 return IHTMLElement2_get_tabIndex(HTMLELEM2(&This->element), p);
Jacek Cabanbb907852007-09-12 23:38:14 +0200404}
405
406static HRESULT WINAPI HTMLAnchorElement_focus(IHTMLAnchorElement *iface)
407{
408 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Jacek Caban2f0373d2009-11-23 15:37:26 +0100409
410 TRACE("(%p)\n", This);
411
412 return IHTMLElement2_focus(HTMLELEM2(&This->element));
Jacek Cabanbb907852007-09-12 23:38:14 +0200413}
414
415static HRESULT WINAPI HTMLAnchorElement_blur(IHTMLAnchorElement *iface)
416{
417 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
Jacek Caban2f0373d2009-11-23 15:37:26 +0100418
419 TRACE("(%p)\n", This);
420
421 return IHTMLElement2_blur(HTMLELEM2(&This->element));
Jacek Cabanbb907852007-09-12 23:38:14 +0200422}
423
Jacek Cabanf56c1a62007-10-04 02:10:36 +0200424#undef HTMLANCHOR_THIS
425
Jacek Cabanbb907852007-09-12 23:38:14 +0200426static const IHTMLAnchorElementVtbl HTMLAnchorElementVtbl = {
427 HTMLAnchorElement_QueryInterface,
428 HTMLAnchorElement_AddRef,
429 HTMLAnchorElement_Release,
430 HTMLAnchorElement_GetTypeInfoCount,
431 HTMLAnchorElement_GetTypeInfo,
432 HTMLAnchorElement_GetIDsOfNames,
433 HTMLAnchorElement_Invoke,
434 HTMLAnchorElement_put_href,
435 HTMLAnchorElement_get_href,
436 HTMLAnchorElement_put_target,
437 HTMLAnchorElement_get_target,
438 HTMLAnchorElement_put_rel,
439 HTMLAnchorElement_get_rel,
440 HTMLAnchorElement_put_rev,
441 HTMLAnchorElement_get_rev,
442 HTMLAnchorElement_put_urn,
443 HTMLAnchorElement_get_urn,
444 HTMLAnchorElement_put_Methods,
445 HTMLAnchorElement_get_Methods,
446 HTMLAnchorElement_put_name,
447 HTMLAnchorElement_get_name,
448 HTMLAnchorElement_put_host,
449 HTMLAnchorElement_get_host,
450 HTMLAnchorElement_put_hostname,
451 HTMLAnchorElement_get_hostname,
452 HTMLAnchorElement_put_pathname,
453 HTMLAnchorElement_get_pathname,
454 HTMLAnchorElement_put_port,
455 HTMLAnchorElement_get_port,
456 HTMLAnchorElement_put_protocol,
457 HTMLAnchorElement_get_protocol,
458 HTMLAnchorElement_put_search,
459 HTMLAnchorElement_get_search,
460 HTMLAnchorElement_put_hash,
461 HTMLAnchorElement_get_hash,
462 HTMLAnchorElement_put_onblur,
463 HTMLAnchorElement_get_onblur,
464 HTMLAnchorElement_put_onfocus,
465 HTMLAnchorElement_get_onfocus,
466 HTMLAnchorElement_put_accessKey,
467 HTMLAnchorElement_get_accessKey,
468 HTMLAnchorElement_get_protocolLong,
469 HTMLAnchorElement_get_mimeType,
470 HTMLAnchorElement_get_nameProp,
471 HTMLAnchorElement_put_tabIndex,
472 HTMLAnchorElement_get_tabIndex,
473 HTMLAnchorElement_focus,
474 HTMLAnchorElement_blur
475};
476
Jacek Cabane04cdbb2007-10-04 02:08:56 +0200477#define HTMLANCHOR_NODE_THIS(iface) DEFINE_THIS2(HTMLAnchorElement, element.node, iface)
478
Jacek Cabanf56c1a62007-10-04 02:10:36 +0200479static HRESULT HTMLAnchorElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
480{
481 HTMLAnchorElement *This = HTMLANCHOR_NODE_THIS(iface);
482
483 *ppv = NULL;
484
485 if(IsEqualGUID(&IID_IUnknown, riid)) {
486 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
487 *ppv = HTMLANCHOR(This);
488 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
489 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
490 *ppv = HTMLANCHOR(This);
491 }else if(IsEqualGUID(&IID_IHTMLAnchorElement, riid)) {
492 TRACE("(%p)->(IID_IHTMLAnchorElement %p)\n", This, ppv);
493 *ppv = HTMLANCHOR(This);
494 }
495
496 if(*ppv) {
497 IUnknown_AddRef((IUnknown*)*ppv);
498 return S_OK;
499 }
500
501 return HTMLElement_QI(&This->element.node, riid, ppv);
502}
503
Jacek Cabane04cdbb2007-10-04 02:08:56 +0200504static void HTMLAnchorElement_destructor(HTMLDOMNode *iface)
505{
506 HTMLAnchorElement *This = HTMLANCHOR_NODE_THIS(iface);
Jacek Caban407e54b2009-10-02 13:52:36 +0200507
508 if(This->nsanchor)
509 nsIDOMHTMLAnchorElement_Release(This->nsanchor);
510
Jacek Cabanf9036c82007-10-04 02:09:48 +0200511 HTMLElement_destructor(&This->element.node);
Jacek Cabane04cdbb2007-10-04 02:08:56 +0200512}
513
514#undef HTMLANCHOR_NODE_THIS
515
Jacek Cabanf9036c82007-10-04 02:09:48 +0200516static const NodeImplVtbl HTMLAnchorElementImplVtbl = {
Jacek Cabanf56c1a62007-10-04 02:10:36 +0200517 HTMLAnchorElement_QI,
Jacek Cabanf9036c82007-10-04 02:09:48 +0200518 HTMLAnchorElement_destructor
519};
520
Jacek Cabandf90f662009-10-02 13:51:19 +0200521static const tid_t HTMLAnchorElement_iface_tids[] = {
522 IHTMLAnchorElement_tid,
Jacek Cabanb00bd142010-01-28 02:09:02 +0100523 HTMLELEMENT_TIDS,
Jacek Cabandf90f662009-10-02 13:51:19 +0200524 IHTMLTextContainer_tid,
525 IHTMLUniqueName_tid,
526 0
527};
528
529static dispex_static_data_t HTMLAnchorElement_dispex = {
530 NULL,
531 DispHTMLAnchorElement_tid,
532 NULL,
533 HTMLAnchorElement_iface_tids
534};
535
Jacek Caband3a9f162009-11-01 19:16:48 +0100536HTMLElement *HTMLAnchorElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem)
Jacek Cabanbb907852007-09-12 23:38:14 +0200537{
Jacek Caban38b14272008-04-23 16:44:21 +0200538 HTMLAnchorElement *ret = heap_alloc_zero(sizeof(HTMLAnchorElement));
Jacek Caban407e54b2009-10-02 13:52:36 +0200539 nsresult nsres;
Jacek Cabanbb907852007-09-12 23:38:14 +0200540
541 ret->lpHTMLAnchorElementVtbl = &HTMLAnchorElementVtbl;
Jacek Cabanf9036c82007-10-04 02:09:48 +0200542 ret->element.node.vtbl = &HTMLAnchorElementImplVtbl;
Jacek Cabanbb907852007-09-12 23:38:14 +0200543
Jacek Caband3a9f162009-11-01 19:16:48 +0100544 HTMLElement_Init(&ret->element, doc, nselem, &HTMLAnchorElement_dispex);
Jacek Cabandf90f662009-10-02 13:51:19 +0200545
Jacek Caban407e54b2009-10-02 13:52:36 +0200546 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLAnchorElement, (void**)&ret->nsanchor);
547 if(NS_FAILED(nsres))
548 ERR("Could not get nsIDOMHTMLAnchorElement iface: %08x\n", nsres);
549
Jacek Cabanf68e24a2007-09-15 16:04:57 +0200550 return &ret->element;
Jacek Cabanbb907852007-09-12 23:38:14 +0200551}