mshtml: Moved cloneNode implementation to vtbl.
[wine/multimedia.git] / dlls / mshtml / htmlanchor.c
blob9c4a48edd3b244b8db3137ce46391f808c4c75c4
1 /*
2 * Copyright 2007 Jacek Caban for CodeWeavers
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.
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.
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
19 #include <stdarg.h>
20 #include <stdio.h>
22 #define COBJMACROS
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winuser.h"
27 #include "ole2.h"
29 #include "wine/debug.h"
31 #include "mshtml_private.h"
33 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
35 typedef struct {
36 HTMLElement element;
38 const IHTMLAnchorElementVtbl *lpHTMLAnchorElementVtbl;
40 nsIDOMHTMLAnchorElement *nsanchor;
41 } HTMLAnchorElement;
43 #define HTMLANCHOR(x) (&(x)->lpHTMLAnchorElementVtbl)
45 #define HTMLANCHOR_THIS(iface) DEFINE_THIS(HTMLAnchorElement, HTMLAnchorElement, iface)
47 static HRESULT WINAPI HTMLAnchorElement_QueryInterface(IHTMLAnchorElement *iface,
48 REFIID riid, void **ppv)
50 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
52 return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv);
55 static ULONG WINAPI HTMLAnchorElement_AddRef(IHTMLAnchorElement *iface)
57 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
59 return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
62 static ULONG WINAPI HTMLAnchorElement_Release(IHTMLAnchorElement *iface)
64 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
66 return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
69 static HRESULT WINAPI HTMLAnchorElement_GetTypeInfoCount(IHTMLAnchorElement *iface, UINT *pctinfo)
71 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
72 return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->element.node.dispex), pctinfo);
75 static HRESULT WINAPI HTMLAnchorElement_GetTypeInfo(IHTMLAnchorElement *iface, UINT iTInfo,
76 LCID lcid, ITypeInfo **ppTInfo)
78 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
79 return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->element.node.dispex), iTInfo, lcid, ppTInfo);
82 static HRESULT WINAPI HTMLAnchorElement_GetIDsOfNames(IHTMLAnchorElement *iface, REFIID riid,
83 LPOLESTR *rgszNames, UINT cNames,
84 LCID lcid, DISPID *rgDispId)
86 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
87 return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->element.node.dispex), riid, rgszNames, cNames, lcid, rgDispId);
90 static HRESULT WINAPI HTMLAnchorElement_Invoke(IHTMLAnchorElement *iface, DISPID dispIdMember,
91 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
92 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
94 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
95 return IDispatchEx_Invoke(DISPATCHEX(&This->element.node.dispex), dispIdMember, riid, lcid,
96 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
99 static HRESULT WINAPI HTMLAnchorElement_put_href(IHTMLAnchorElement *iface, BSTR v)
101 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
102 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
103 return E_NOTIMPL;
106 static HRESULT WINAPI HTMLAnchorElement_get_href(IHTMLAnchorElement *iface, BSTR *p)
108 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
109 nsAString href_str;
110 nsresult nsres;
111 HRESULT hres;
113 TRACE("(%p)->(%p)\n", This, p);
115 nsAString_Init(&href_str, NULL);
116 nsres = nsIDOMHTMLAnchorElement_GetHref(This->nsanchor, &href_str);
117 if(NS_SUCCEEDED(nsres)) {
118 const PRUnichar *href;
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;
127 nsAString_Finish(&href_str);
128 return hres;
131 static HRESULT WINAPI HTMLAnchorElement_put_target(IHTMLAnchorElement *iface, BSTR v)
133 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
134 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
135 return E_NOTIMPL;
138 static HRESULT WINAPI HTMLAnchorElement_get_target(IHTMLAnchorElement *iface, BSTR *p)
140 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
141 FIXME("(%p)->(%p)\n", This, p);
142 return E_NOTIMPL;
145 static HRESULT WINAPI HTMLAnchorElement_put_rel(IHTMLAnchorElement *iface, BSTR v)
147 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
148 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
149 return E_NOTIMPL;
152 static HRESULT WINAPI HTMLAnchorElement_get_rel(IHTMLAnchorElement *iface, BSTR *p)
154 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
155 FIXME("(%p)->(%p)\n", This, p);
156 return E_NOTIMPL;
159 static HRESULT WINAPI HTMLAnchorElement_put_rev(IHTMLAnchorElement *iface, BSTR v)
161 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
162 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
163 return E_NOTIMPL;
166 static HRESULT WINAPI HTMLAnchorElement_get_rev(IHTMLAnchorElement *iface, BSTR *p)
168 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
169 FIXME("(%p)->(%p)\n", This, p);
170 return E_NOTIMPL;
173 static HRESULT WINAPI HTMLAnchorElement_put_urn(IHTMLAnchorElement *iface, BSTR v)
175 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
176 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
177 return E_NOTIMPL;
180 static HRESULT WINAPI HTMLAnchorElement_get_urn(IHTMLAnchorElement *iface, BSTR *p)
182 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
183 FIXME("(%p)->(%p)\n", This, p);
184 return E_NOTIMPL;
187 static HRESULT WINAPI HTMLAnchorElement_put_Methods(IHTMLAnchorElement *iface, BSTR v)
189 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
190 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
191 return E_NOTIMPL;
194 static HRESULT WINAPI HTMLAnchorElement_get_Methods(IHTMLAnchorElement *iface, BSTR *p)
196 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
197 FIXME("(%p)->(%p)\n", This, p);
198 return E_NOTIMPL;
201 static HRESULT WINAPI HTMLAnchorElement_put_name(IHTMLAnchorElement *iface, BSTR v)
203 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
204 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
205 return E_NOTIMPL;
208 static HRESULT WINAPI HTMLAnchorElement_get_name(IHTMLAnchorElement *iface, BSTR *p)
210 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
211 FIXME("(%p)->(%p)\n", This, p);
212 return E_NOTIMPL;
215 static HRESULT WINAPI HTMLAnchorElement_put_host(IHTMLAnchorElement *iface, BSTR v)
217 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
218 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
219 return E_NOTIMPL;
222 static HRESULT WINAPI HTMLAnchorElement_get_host(IHTMLAnchorElement *iface, BSTR *p)
224 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
225 FIXME("(%p)->(%p)\n", This, p);
226 return E_NOTIMPL;
229 static HRESULT WINAPI HTMLAnchorElement_put_hostname(IHTMLAnchorElement *iface, BSTR v)
231 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
232 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
233 return E_NOTIMPL;
236 static HRESULT WINAPI HTMLAnchorElement_get_hostname(IHTMLAnchorElement *iface, BSTR *p)
238 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
239 FIXME("(%p)->(%p)\n", This, p);
240 return E_NOTIMPL;
243 static HRESULT WINAPI HTMLAnchorElement_put_pathname(IHTMLAnchorElement *iface, BSTR v)
245 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
246 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
247 return E_NOTIMPL;
250 static HRESULT WINAPI HTMLAnchorElement_get_pathname(IHTMLAnchorElement *iface, BSTR *p)
252 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
253 FIXME("(%p)->(%p)\n", This, p);
254 return E_NOTIMPL;
257 static HRESULT WINAPI HTMLAnchorElement_put_port(IHTMLAnchorElement *iface, BSTR v)
259 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
260 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
261 return E_NOTIMPL;
264 static HRESULT WINAPI HTMLAnchorElement_get_port(IHTMLAnchorElement *iface, BSTR *p)
266 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
267 FIXME("(%p)->(%p)\n", This, p);
268 return E_NOTIMPL;
271 static HRESULT WINAPI HTMLAnchorElement_put_protocol(IHTMLAnchorElement *iface, BSTR v)
273 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
274 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
275 return E_NOTIMPL;
278 static HRESULT WINAPI HTMLAnchorElement_get_protocol(IHTMLAnchorElement *iface, BSTR *p)
280 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
281 FIXME("(%p)->(%p)\n", This, p);
282 return E_NOTIMPL;
285 static HRESULT WINAPI HTMLAnchorElement_put_search(IHTMLAnchorElement *iface, BSTR v)
287 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
288 FIXME("(%p)->(%p)\n", This, debugstr_w(v));
289 return E_NOTIMPL;
292 static HRESULT WINAPI HTMLAnchorElement_get_search(IHTMLAnchorElement *iface, BSTR *p)
294 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
295 FIXME("(%p)->(%p)\n", This, p);
296 return E_NOTIMPL;
299 static HRESULT WINAPI HTMLAnchorElement_put_hash(IHTMLAnchorElement *iface, BSTR v)
301 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
302 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
303 return E_NOTIMPL;
306 static HRESULT WINAPI HTMLAnchorElement_get_hash(IHTMLAnchorElement *iface, BSTR *p)
308 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
309 FIXME("(%p)->(%p)\n", This, p);
310 return E_NOTIMPL;
313 static HRESULT WINAPI HTMLAnchorElement_put_onblur(IHTMLAnchorElement *iface, VARIANT v)
315 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
317 TRACE("(%p)->()\n", This);
319 return IHTMLElement2_put_onblur(HTMLELEM2(&This->element), v);
322 static HRESULT WINAPI HTMLAnchorElement_get_onblur(IHTMLAnchorElement *iface, VARIANT *p)
324 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
326 TRACE("(%p)->(%p)\n", This, p);
328 return IHTMLElement2_get_onblur(HTMLELEM2(&This->element), p);
331 static HRESULT WINAPI HTMLAnchorElement_put_onfocus(IHTMLAnchorElement *iface, VARIANT v)
333 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
335 TRACE("(%p)->()\n", This);
337 return IHTMLElement2_put_onfocus(HTMLELEM2(&This->element), v);
340 static HRESULT WINAPI HTMLAnchorElement_get_onfocus(IHTMLAnchorElement *iface, VARIANT *p)
342 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
344 TRACE("(%p)->(%p)\n", This, p);
346 return IHTMLElement2_get_onfocus(HTMLELEM2(&This->element), p);
349 static HRESULT WINAPI HTMLAnchorElement_put_accessKey(IHTMLAnchorElement *iface, BSTR v)
351 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
353 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
355 return IHTMLElement2_put_accessKey(HTMLELEM2(&This->element), v);
358 static HRESULT WINAPI HTMLAnchorElement_get_accessKey(IHTMLAnchorElement *iface, BSTR *p)
360 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
362 TRACE("(%p)->(%p)\n", This, p);
364 return IHTMLElement2_get_accessKey(HTMLELEM2(&This->element), p);
367 static HRESULT WINAPI HTMLAnchorElement_get_protocolLong(IHTMLAnchorElement *iface, BSTR *p)
369 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
370 FIXME("(%p)->(%p)\n", This, p);
371 return E_NOTIMPL;
374 static HRESULT WINAPI HTMLAnchorElement_get_mimeType(IHTMLAnchorElement *iface, BSTR *p)
376 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
377 FIXME("(%p)->(%p)\n", This, p);
378 return E_NOTIMPL;
381 static HRESULT WINAPI HTMLAnchorElement_get_nameProp(IHTMLAnchorElement *iface, BSTR *p)
383 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
384 FIXME("(%p)->(%p)\n", This, p);
385 return E_NOTIMPL;
388 static HRESULT WINAPI HTMLAnchorElement_put_tabIndex(IHTMLAnchorElement *iface, short v)
390 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
392 TRACE("(%p)->()\n", This);
394 return IHTMLElement2_put_tabIndex(HTMLELEM2(&This->element), v);
397 static HRESULT WINAPI HTMLAnchorElement_get_tabIndex(IHTMLAnchorElement *iface, short *p)
399 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
401 TRACE("(%p)->(%p)\n", This, p);
403 return IHTMLElement2_get_tabIndex(HTMLELEM2(&This->element), p);
406 static HRESULT WINAPI HTMLAnchorElement_focus(IHTMLAnchorElement *iface)
408 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
410 TRACE("(%p)\n", This);
412 return IHTMLElement2_focus(HTMLELEM2(&This->element));
415 static HRESULT WINAPI HTMLAnchorElement_blur(IHTMLAnchorElement *iface)
417 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
419 TRACE("(%p)\n", This);
421 return IHTMLElement2_blur(HTMLELEM2(&This->element));
424 #undef HTMLANCHOR_THIS
426 static 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
477 #define HTMLANCHOR_NODE_THIS(iface) DEFINE_THIS2(HTMLAnchorElement, element.node, iface)
479 static HRESULT HTMLAnchorElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
481 HTMLAnchorElement *This = HTMLANCHOR_NODE_THIS(iface);
483 *ppv = NULL;
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);
496 if(*ppv) {
497 IUnknown_AddRef((IUnknown*)*ppv);
498 return S_OK;
501 return HTMLElement_QI(&This->element.node, riid, ppv);
504 static void HTMLAnchorElement_destructor(HTMLDOMNode *iface)
506 HTMLAnchorElement *This = HTMLANCHOR_NODE_THIS(iface);
508 if(This->nsanchor)
509 nsIDOMHTMLAnchorElement_Release(This->nsanchor);
511 HTMLElement_destructor(&This->element.node);
514 #undef HTMLANCHOR_NODE_THIS
516 static const NodeImplVtbl HTMLAnchorElementImplVtbl = {
517 HTMLAnchorElement_QI,
518 HTMLAnchorElement_destructor,
519 HTMLElement_clone
522 static const tid_t HTMLAnchorElement_iface_tids[] = {
523 IHTMLAnchorElement_tid,
524 HTMLELEMENT_TIDS,
525 IHTMLTextContainer_tid,
526 IHTMLUniqueName_tid,
530 static dispex_static_data_t HTMLAnchorElement_dispex = {
531 NULL,
532 DispHTMLAnchorElement_tid,
533 NULL,
534 HTMLAnchorElement_iface_tids
537 HTMLElement *HTMLAnchorElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem)
539 HTMLAnchorElement *ret = heap_alloc_zero(sizeof(HTMLAnchorElement));
540 nsresult nsres;
542 ret->lpHTMLAnchorElementVtbl = &HTMLAnchorElementVtbl;
543 ret->element.node.vtbl = &HTMLAnchorElementImplVtbl;
545 HTMLElement_Init(&ret->element, doc, nselem, &HTMLAnchorElement_dispex);
547 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLAnchorElement, (void**)&ret->nsanchor);
548 if(NS_FAILED(nsres))
549 ERR("Could not get nsIDOMHTMLAnchorElement iface: %08x\n", nsres);
551 return &ret->element;