[gdi32]
[reactos.git] / reactos / dll / win32 / 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
40 nsIDOMHTMLAnchorElement *nsanchor;
41 } HTMLAnchorElement;
42
43 #define HTMLANCHOR(x) (&(x)->lpHTMLAnchorElementVtbl)
44
45 #define HTMLANCHOR_THIS(iface) DEFINE_THIS(HTMLAnchorElement, HTMLAnchorElement, iface)
46
47 static HRESULT WINAPI HTMLAnchorElement_QueryInterface(IHTMLAnchorElement *iface,
48 REFIID riid, void **ppv)
49 {
50 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
51
52 return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv);
53 }
54
55 static ULONG WINAPI HTMLAnchorElement_AddRef(IHTMLAnchorElement *iface)
56 {
57 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
58
59 return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
60 }
61
62 static ULONG WINAPI HTMLAnchorElement_Release(IHTMLAnchorElement *iface)
63 {
64 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
65
66 return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
67 }
68
69 static HRESULT WINAPI HTMLAnchorElement_GetTypeInfoCount(IHTMLAnchorElement *iface, UINT *pctinfo)
70 {
71 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
72 return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->element.node.dispex), pctinfo);
73 }
74
75 static HRESULT WINAPI HTMLAnchorElement_GetTypeInfo(IHTMLAnchorElement *iface, UINT iTInfo,
76 LCID lcid, ITypeInfo **ppTInfo)
77 {
78 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
79 return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->element.node.dispex), iTInfo, lcid, ppTInfo);
80 }
81
82 static 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);
87 return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->element.node.dispex), riid, rgszNames, cNames, lcid, rgDispId);
88 }
89
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)
93 {
94 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
95 return IDispatchEx_Invoke(DISPATCHEX(&This->element.node.dispex), dispIdMember, riid, lcid,
96 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
97 }
98
99 static 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
106 static HRESULT WINAPI HTMLAnchorElement_get_href(IHTMLAnchorElement *iface, BSTR *p)
107 {
108 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
109 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;
129 }
130
131 static 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
138 static 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
145 static 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
152 static 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
159 static 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
166 static 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
173 static 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
180 static 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
187 static 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
194 static 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
201 static 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
208 static 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
215 static 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
222 static 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
229 static 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
236 static 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
243 static 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
250 static 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
257 static 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
264 static 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
271 static 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
278 static 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
285 static 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
292 static 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
299 static 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
306 static 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
313 static HRESULT WINAPI HTMLAnchorElement_put_onblur(IHTMLAnchorElement *iface, VARIANT v)
314 {
315 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
316 FIXME("(%p)->()\n", This);
317 return E_NOTIMPL;
318 }
319
320 static HRESULT WINAPI HTMLAnchorElement_get_onblur(IHTMLAnchorElement *iface, VARIANT *p)
321 {
322 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
323 FIXME("(%p)->(%p)\n", This, p);
324 return E_NOTIMPL;
325 }
326
327 static HRESULT WINAPI HTMLAnchorElement_put_onfocus(IHTMLAnchorElement *iface, VARIANT v)
328 {
329 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
330 FIXME("(%p)->()\n", This);
331 return E_NOTIMPL;
332 }
333
334 static HRESULT WINAPI HTMLAnchorElement_get_onfocus(IHTMLAnchorElement *iface, VARIANT *p)
335 {
336 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
337 FIXME("(%p)->(%p)\n", This, p);
338 return E_NOTIMPL;
339 }
340
341 static HRESULT WINAPI HTMLAnchorElement_put_accessKey(IHTMLAnchorElement *iface, BSTR v)
342 {
343 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
344 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
345 return E_NOTIMPL;
346 }
347
348 static HRESULT WINAPI HTMLAnchorElement_get_accessKey(IHTMLAnchorElement *iface, BSTR *p)
349 {
350 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
351 FIXME("(%p)->(%p)\n", This, p);
352 return E_NOTIMPL;
353 }
354
355 static HRESULT WINAPI HTMLAnchorElement_get_protocolLong(IHTMLAnchorElement *iface, BSTR *p)
356 {
357 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
358 FIXME("(%p)->(%p)\n", This, p);
359 return E_NOTIMPL;
360 }
361
362 static HRESULT WINAPI HTMLAnchorElement_get_mimeType(IHTMLAnchorElement *iface, BSTR *p)
363 {
364 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
365 FIXME("(%p)->(%p)\n", This, p);
366 return E_NOTIMPL;
367 }
368
369 static HRESULT WINAPI HTMLAnchorElement_get_nameProp(IHTMLAnchorElement *iface, BSTR *p)
370 {
371 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
372 FIXME("(%p)->(%p)\n", This, p);
373 return E_NOTIMPL;
374 }
375
376 static HRESULT WINAPI HTMLAnchorElement_put_tabIndex(IHTMLAnchorElement *iface, short v)
377 {
378 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
379 FIXME("(%p)->()\n", This);
380 return E_NOTIMPL;
381 }
382
383 static HRESULT WINAPI HTMLAnchorElement_get_tabIndex(IHTMLAnchorElement *iface, short *p)
384 {
385 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
386 FIXME("(%p)->(%p)\n", This, p);
387 return E_NOTIMPL;
388 }
389
390 static HRESULT WINAPI HTMLAnchorElement_focus(IHTMLAnchorElement *iface)
391 {
392 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
393 FIXME("(%p)\n", This);
394 return E_NOTIMPL;
395 }
396
397 static HRESULT WINAPI HTMLAnchorElement_blur(IHTMLAnchorElement *iface)
398 {
399 HTMLAnchorElement *This = HTMLANCHOR_THIS(iface);
400 FIXME("(%p)\n", This);
401 return E_NOTIMPL;
402 }
403
404 #undef HTMLANCHOR_THIS
405
406 static const IHTMLAnchorElementVtbl HTMLAnchorElementVtbl = {
407 HTMLAnchorElement_QueryInterface,
408 HTMLAnchorElement_AddRef,
409 HTMLAnchorElement_Release,
410 HTMLAnchorElement_GetTypeInfoCount,
411 HTMLAnchorElement_GetTypeInfo,
412 HTMLAnchorElement_GetIDsOfNames,
413 HTMLAnchorElement_Invoke,
414 HTMLAnchorElement_put_href,
415 HTMLAnchorElement_get_href,
416 HTMLAnchorElement_put_target,
417 HTMLAnchorElement_get_target,
418 HTMLAnchorElement_put_rel,
419 HTMLAnchorElement_get_rel,
420 HTMLAnchorElement_put_rev,
421 HTMLAnchorElement_get_rev,
422 HTMLAnchorElement_put_urn,
423 HTMLAnchorElement_get_urn,
424 HTMLAnchorElement_put_Methods,
425 HTMLAnchorElement_get_Methods,
426 HTMLAnchorElement_put_name,
427 HTMLAnchorElement_get_name,
428 HTMLAnchorElement_put_host,
429 HTMLAnchorElement_get_host,
430 HTMLAnchorElement_put_hostname,
431 HTMLAnchorElement_get_hostname,
432 HTMLAnchorElement_put_pathname,
433 HTMLAnchorElement_get_pathname,
434 HTMLAnchorElement_put_port,
435 HTMLAnchorElement_get_port,
436 HTMLAnchorElement_put_protocol,
437 HTMLAnchorElement_get_protocol,
438 HTMLAnchorElement_put_search,
439 HTMLAnchorElement_get_search,
440 HTMLAnchorElement_put_hash,
441 HTMLAnchorElement_get_hash,
442 HTMLAnchorElement_put_onblur,
443 HTMLAnchorElement_get_onblur,
444 HTMLAnchorElement_put_onfocus,
445 HTMLAnchorElement_get_onfocus,
446 HTMLAnchorElement_put_accessKey,
447 HTMLAnchorElement_get_accessKey,
448 HTMLAnchorElement_get_protocolLong,
449 HTMLAnchorElement_get_mimeType,
450 HTMLAnchorElement_get_nameProp,
451 HTMLAnchorElement_put_tabIndex,
452 HTMLAnchorElement_get_tabIndex,
453 HTMLAnchorElement_focus,
454 HTMLAnchorElement_blur
455 };
456
457 #define HTMLANCHOR_NODE_THIS(iface) DEFINE_THIS2(HTMLAnchorElement, element.node, iface)
458
459 static HRESULT HTMLAnchorElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
460 {
461 HTMLAnchorElement *This = HTMLANCHOR_NODE_THIS(iface);
462
463 *ppv = NULL;
464
465 if(IsEqualGUID(&IID_IUnknown, riid)) {
466 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
467 *ppv = HTMLANCHOR(This);
468 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
469 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
470 *ppv = HTMLANCHOR(This);
471 }else if(IsEqualGUID(&IID_IHTMLAnchorElement, riid)) {
472 TRACE("(%p)->(IID_IHTMLAnchorElement %p)\n", This, ppv);
473 *ppv = HTMLANCHOR(This);
474 }
475
476 if(*ppv) {
477 IUnknown_AddRef((IUnknown*)*ppv);
478 return S_OK;
479 }
480
481 return HTMLElement_QI(&This->element.node, riid, ppv);
482 }
483
484 static void HTMLAnchorElement_destructor(HTMLDOMNode *iface)
485 {
486 HTMLAnchorElement *This = HTMLANCHOR_NODE_THIS(iface);
487
488 if(This->nsanchor)
489 nsIDOMHTMLAnchorElement_Release(This->nsanchor);
490
491 HTMLElement_destructor(&This->element.node);
492 }
493
494 #undef HTMLANCHOR_NODE_THIS
495
496 static const NodeImplVtbl HTMLAnchorElementImplVtbl = {
497 HTMLAnchorElement_QI,
498 HTMLAnchorElement_destructor
499 };
500
501 static const tid_t HTMLAnchorElement_iface_tids[] = {
502 IHTMLAnchorElement_tid,
503 IHTMLDOMNode_tid,
504 IHTMLDOMNode2_tid,
505 IHTMLElement_tid,
506 IHTMLElement2_tid,
507 IHTMLElement3_tid,
508 IHTMLElement4_tid,
509 IHTMLTextContainer_tid,
510 IHTMLUniqueName_tid,
511 0
512 };
513
514 static dispex_static_data_t HTMLAnchorElement_dispex = {
515 NULL,
516 DispHTMLAnchorElement_tid,
517 NULL,
518 HTMLAnchorElement_iface_tids
519 };
520
521 HTMLElement *HTMLAnchorElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem)
522 {
523 HTMLAnchorElement *ret = heap_alloc_zero(sizeof(HTMLAnchorElement));
524 nsresult nsres;
525
526 ret->lpHTMLAnchorElementVtbl = &HTMLAnchorElementVtbl;
527 ret->element.node.vtbl = &HTMLAnchorElementImplVtbl;
528
529 HTMLElement_Init(&ret->element, doc, nselem, &HTMLAnchorElement_dispex);
530
531 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLAnchorElement, (void**)&ret->nsanchor);
532 if(NS_FAILED(nsres))
533 ERR("Could not get nsIDOMHTMLAnchorElement iface: %08x\n", nsres);
534
535 return &ret->element;
536 }