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