ntdll/tests: Use correct prototype for RtlCreateUnicodeString[FromAsciiz].
[wine.git] / dlls / mshtml / htmlimg.c
blob5a347a574a19e239906c4eb3c562668dc6c2cb61
1 /*
2 * Copyright 2008 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 <assert.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"
32 #include "htmlevent.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
36 typedef struct {
37 HTMLElement element;
39 IHTMLImgElement IHTMLImgElement_iface;
41 nsIDOMHTMLImageElement *nsimg;
42 } HTMLImgElement;
44 static inline HTMLImgElement *impl_from_IHTMLImgElement(IHTMLImgElement *iface)
46 return CONTAINING_RECORD(iface, HTMLImgElement, IHTMLImgElement_iface);
49 static HRESULT WINAPI HTMLImgElement_QueryInterface(IHTMLImgElement *iface, REFIID riid, void **ppv)
51 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
53 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
56 static ULONG WINAPI HTMLImgElement_AddRef(IHTMLImgElement *iface)
58 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
60 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
63 static ULONG WINAPI HTMLImgElement_Release(IHTMLImgElement *iface)
65 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
67 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
70 static HRESULT WINAPI HTMLImgElement_GetTypeInfoCount(IHTMLImgElement *iface, UINT *pctinfo)
72 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
73 return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo);
76 static HRESULT WINAPI HTMLImgElement_GetTypeInfo(IHTMLImgElement *iface, UINT iTInfo,
77 LCID lcid, ITypeInfo **ppTInfo)
79 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
80 return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid,
81 ppTInfo);
84 static HRESULT WINAPI HTMLImgElement_GetIDsOfNames(IHTMLImgElement *iface, REFIID riid,
85 LPOLESTR *rgszNames, UINT cNames,
86 LCID lcid, DISPID *rgDispId)
88 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
89 return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames,
90 cNames, lcid, rgDispId);
93 static HRESULT WINAPI HTMLImgElement_Invoke(IHTMLImgElement *iface, DISPID dispIdMember,
94 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
95 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
97 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
98 return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid,
99 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
102 static HRESULT WINAPI HTMLImgElement_put_isMap(IHTMLImgElement *iface, VARIANT_BOOL v)
104 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
105 FIXME("(%p)->(%x)\n", This, v);
106 return E_NOTIMPL;
109 static HRESULT WINAPI HTMLImgElement_get_isMap(IHTMLImgElement *iface, VARIANT_BOOL *p)
111 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
112 FIXME("(%p)->(%p)\n", This, p);
113 return E_NOTIMPL;
116 static HRESULT WINAPI HTMLImgElement_put_useMap(IHTMLImgElement *iface, BSTR v)
118 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
119 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
120 return E_NOTIMPL;
123 static HRESULT WINAPI HTMLImgElement_get_useMap(IHTMLImgElement *iface, BSTR *p)
125 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
126 FIXME("(%p)->(%p)\n", This, p);
127 return E_NOTIMPL;
130 static HRESULT WINAPI HTMLImgElement_get_mimeType(IHTMLImgElement *iface, BSTR *p)
132 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
133 FIXME("(%p)->(%p)\n", This, p);
134 return E_NOTIMPL;
137 static HRESULT WINAPI HTMLImgElement_get_fileSize(IHTMLImgElement *iface, BSTR *p)
139 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
140 FIXME("(%p)->(%p)\n", This, p);
141 return E_NOTIMPL;
144 static HRESULT WINAPI HTMLImgElement_get_fileCreatedDate(IHTMLImgElement *iface, BSTR *p)
146 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
147 FIXME("(%p)->(%p)\n", This, p);
148 return E_NOTIMPL;
151 static HRESULT WINAPI HTMLImgElement_get_fileModifiedDate(IHTMLImgElement *iface, BSTR *p)
153 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
154 FIXME("(%p)->(%p)\n", This, p);
155 return E_NOTIMPL;
158 static HRESULT WINAPI HTMLImgElement_get_fileUpdatedDate(IHTMLImgElement *iface, BSTR *p)
160 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
161 FIXME("(%p)->(%p)\n", This, p);
162 return E_NOTIMPL;
165 static HRESULT WINAPI HTMLImgElement_get_protocol(IHTMLImgElement *iface, BSTR *p)
167 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
168 FIXME("(%p)->(%p)\n", This, p);
169 return E_NOTIMPL;
172 static HRESULT WINAPI HTMLImgElement_get_href(IHTMLImgElement *iface, BSTR *p)
174 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
175 FIXME("(%p)->(%p)\n", This, p);
176 return E_NOTIMPL;
179 static HRESULT WINAPI HTMLImgElement_get_nameProp(IHTMLImgElement *iface, BSTR *p)
181 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
182 FIXME("(%p)->(%p)\n", This, p);
183 return E_NOTIMPL;
186 static HRESULT WINAPI HTMLImgElement_put_border(IHTMLImgElement *iface, VARIANT v)
188 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
189 FIXME("(%p)->()\n", This);
190 return E_NOTIMPL;
193 static HRESULT WINAPI HTMLImgElement_get_border(IHTMLImgElement *iface, VARIANT *p)
195 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
196 FIXME("(%p)->(%p)\n", This, p);
197 return E_NOTIMPL;
200 static HRESULT WINAPI HTMLImgElement_put_vspace(IHTMLImgElement *iface, LONG v)
202 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
203 FIXME("(%p)->(%d)\n", This, v);
204 return E_NOTIMPL;
207 static HRESULT WINAPI HTMLImgElement_get_vspace(IHTMLImgElement *iface, LONG *p)
209 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
210 FIXME("(%p)->(%p)\n", This, p);
211 return E_NOTIMPL;
214 static HRESULT WINAPI HTMLImgElement_put_hspace(IHTMLImgElement *iface, LONG v)
216 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
217 FIXME("(%p)->(%d)\n", This, v);
218 return E_NOTIMPL;
221 static HRESULT WINAPI HTMLImgElement_get_hspace(IHTMLImgElement *iface, LONG *p)
223 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
224 FIXME("(%p)->(%p)\n", This, p);
225 return E_NOTIMPL;
228 static HRESULT WINAPI HTMLImgElement_put_alt(IHTMLImgElement *iface, BSTR v)
230 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
231 nsAString alt_str;
232 nsresult nsres;
234 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
236 nsAString_InitDepend(&alt_str, v);
237 nsres = nsIDOMHTMLImageElement_SetAlt(This->nsimg, &alt_str);
238 nsAString_Finish(&alt_str);
239 if(NS_FAILED(nsres))
240 ERR("SetAlt failed: %08x\n", nsres);
242 return S_OK;
245 static HRESULT WINAPI HTMLImgElement_get_alt(IHTMLImgElement *iface, BSTR *p)
247 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
248 nsAString alt_str;
249 nsresult nsres;
251 TRACE("(%p)->(%p)\n", This, p);
253 nsAString_Init(&alt_str, NULL);
254 nsres = nsIDOMHTMLImageElement_GetAlt(This->nsimg, &alt_str);
255 return return_nsstr(nsres, &alt_str, p);
258 static HRESULT WINAPI HTMLImgElement_put_src(IHTMLImgElement *iface, BSTR v)
260 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
261 nsAString src_str;
262 nsresult nsres;
264 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
266 nsAString_InitDepend(&src_str, v);
267 nsres = nsIDOMHTMLImageElement_SetSrc(This->nsimg, &src_str);
268 nsAString_Finish(&src_str);
269 if(NS_FAILED(nsres))
270 ERR("SetSrc failed: %08x\n", nsres);
272 return NS_OK;
275 static HRESULT WINAPI HTMLImgElement_get_src(IHTMLImgElement *iface, BSTR *p)
277 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
278 const PRUnichar *src;
279 nsAString src_str;
280 nsresult nsres;
281 HRESULT hres = S_OK;
283 static const WCHAR blockedW[] = {'B','L','O','C','K','E','D',':',':',0};
285 TRACE("(%p)->(%p)\n", This, p);
287 nsAString_Init(&src_str, NULL);
288 nsres = nsIDOMHTMLImageElement_GetSrc(This->nsimg, &src_str);
289 if(NS_SUCCEEDED(nsres)) {
290 nsAString_GetData(&src_str, &src);
292 if(!strncmpiW(src, blockedW, sizeof(blockedW)/sizeof(WCHAR)-1)) {
293 TRACE("returning BLOCKED::\n");
294 *p = SysAllocString(blockedW);
295 if(!*p)
296 hres = E_OUTOFMEMORY;
297 }else {
298 hres = nsuri_to_url(src, TRUE, p);
300 }else {
301 ERR("GetSrc failed: %08x\n", nsres);
302 hres = E_FAIL;
305 nsAString_Finish(&src_str);
306 return hres;
309 static HRESULT WINAPI HTMLImgElement_put_lowsrc(IHTMLImgElement *iface, BSTR v)
311 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
312 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
313 return E_NOTIMPL;
316 static HRESULT WINAPI HTMLImgElement_get_lowsrc(IHTMLImgElement *iface, BSTR *p)
318 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
319 FIXME("(%p)->(%p)\n", This, p);
320 return E_NOTIMPL;
323 static HRESULT WINAPI HTMLImgElement_put_vrml(IHTMLImgElement *iface, BSTR v)
325 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
326 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
327 return E_NOTIMPL;
330 static HRESULT WINAPI HTMLImgElement_get_vrml(IHTMLImgElement *iface, BSTR *p)
332 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
333 FIXME("(%p)->(%p)\n", This, p);
334 return E_NOTIMPL;
337 static HRESULT WINAPI HTMLImgElement_put_dynsrc(IHTMLImgElement *iface, BSTR v)
339 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
340 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
341 return E_NOTIMPL;
344 static HRESULT WINAPI HTMLImgElement_get_dynsrc(IHTMLImgElement *iface, BSTR *p)
346 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
347 FIXME("(%p)->(%p)\n", This, p);
348 return E_NOTIMPL;
351 static HRESULT WINAPI HTMLImgElement_get_readyState(IHTMLImgElement *iface, BSTR *p)
353 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
354 FIXME("(%p)->(%p)\n", This, p);
355 return E_NOTIMPL;
358 static HRESULT WINAPI HTMLImgElement_get_complete(IHTMLImgElement *iface, VARIANT_BOOL *p)
360 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
361 cpp_bool complete;
362 nsresult nsres;
364 TRACE("(%p)->(%p)\n", This, p);
366 nsres = nsIDOMHTMLImageElement_GetComplete(This->nsimg, &complete);
367 if(NS_FAILED(nsres)) {
368 ERR("GetComplete failed: %08x\n", nsres);
369 return E_FAIL;
372 *p = complete ? VARIANT_TRUE : VARIANT_FALSE;
373 return S_OK;
376 static HRESULT WINAPI HTMLImgElement_put_loop(IHTMLImgElement *iface, VARIANT v)
378 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
379 FIXME("(%p)->()\n", This);
380 return E_NOTIMPL;
383 static HRESULT WINAPI HTMLImgElement_get_loop(IHTMLImgElement *iface, VARIANT *p)
385 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
386 FIXME("(%p)->(%p)\n", This, p);
387 return E_NOTIMPL;
390 static HRESULT WINAPI HTMLImgElement_put_align(IHTMLImgElement *iface, BSTR v)
392 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
393 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
394 return E_NOTIMPL;
397 static HRESULT WINAPI HTMLImgElement_get_align(IHTMLImgElement *iface, BSTR *p)
399 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
400 FIXME("(%p)->(%p)\n", This, p);
401 return E_NOTIMPL;
404 static HRESULT WINAPI HTMLImgElement_put_onload(IHTMLImgElement *iface, VARIANT v)
406 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
408 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
410 return set_node_event(&This->element.node, EVENTID_LOAD, &v);
413 static HRESULT WINAPI HTMLImgElement_get_onload(IHTMLImgElement *iface, VARIANT *p)
415 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
417 TRACE("(%p)->(%p)\n", This, p);
419 return get_node_event(&This->element.node, EVENTID_LOAD, p);
422 static HRESULT WINAPI HTMLImgElement_put_onerror(IHTMLImgElement *iface, VARIANT v)
424 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
426 TRACE("(%p)->()\n", This);
428 return set_node_event(&This->element.node, EVENTID_ERROR, &v);
431 static HRESULT WINAPI HTMLImgElement_get_onerror(IHTMLImgElement *iface, VARIANT *p)
433 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
435 TRACE("(%p)->(%p)\n", This, p);
437 return get_node_event(&This->element.node, EVENTID_ERROR, p);
440 static HRESULT WINAPI HTMLImgElement_put_onabort(IHTMLImgElement *iface, VARIANT v)
442 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
444 TRACE("(%p)->()\n", This);
446 return set_node_event(&This->element.node, EVENTID_ABORT, &v);
449 static HRESULT WINAPI HTMLImgElement_get_onabort(IHTMLImgElement *iface, VARIANT *p)
451 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
453 TRACE("(%p)->(%p)\n", This, p);
455 return get_node_event(&This->element.node, EVENTID_ABORT, p);
458 static HRESULT WINAPI HTMLImgElement_put_name(IHTMLImgElement *iface, BSTR v)
460 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
461 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
462 return E_NOTIMPL;
465 static HRESULT WINAPI HTMLImgElement_get_name(IHTMLImgElement *iface, BSTR *p)
467 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
468 nsAString name;
469 nsresult nsres;
471 TRACE("(%p)->(%p)\n", This, p);
473 nsAString_Init(&name, NULL);
474 nsres = nsIDOMHTMLImageElement_GetName(This->nsimg, &name);
475 return return_nsstr(nsres, &name, p);
478 static HRESULT WINAPI HTMLImgElement_put_width(IHTMLImgElement *iface, LONG v)
480 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
481 nsresult nsres;
483 TRACE("(%p)->(%d)\n", This, v);
485 nsres = nsIDOMHTMLImageElement_SetWidth(This->nsimg, v);
486 if(NS_FAILED(nsres)) {
487 ERR("SetWidth failed: %08x\n", nsres);
488 return E_FAIL;
491 return S_OK;
494 static HRESULT WINAPI HTMLImgElement_get_width(IHTMLImgElement *iface, LONG *p)
496 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
497 UINT32 width;
498 nsresult nsres;
500 TRACE("(%p)->(%p)\n", This, p);
502 nsres = nsIDOMHTMLImageElement_GetWidth(This->nsimg, &width);
503 if(NS_FAILED(nsres)) {
504 ERR("GetWidth failed: %08x\n", nsres);
505 return E_FAIL;
508 *p = width;
509 return S_OK;
512 static HRESULT WINAPI HTMLImgElement_put_height(IHTMLImgElement *iface, LONG v)
514 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
515 nsresult nsres;
517 TRACE("(%p)->(%d)\n", This, v);
519 nsres = nsIDOMHTMLImageElement_SetHeight(This->nsimg, v);
520 if(NS_FAILED(nsres)) {
521 ERR("SetHeight failed: %08x\n", nsres);
522 return E_FAIL;
525 return S_OK;
528 static HRESULT WINAPI HTMLImgElement_get_height(IHTMLImgElement *iface, LONG *p)
530 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
531 UINT32 height;
532 nsresult nsres;
534 TRACE("(%p)->(%p)\n", This, p);
536 nsres = nsIDOMHTMLImageElement_GetHeight(This->nsimg, &height);
537 if(NS_FAILED(nsres)) {
538 ERR("GetHeight failed: %08x\n", nsres);
539 return E_FAIL;
542 *p = height;
543 return S_OK;
546 static HRESULT WINAPI HTMLImgElement_put_start(IHTMLImgElement *iface, BSTR v)
548 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
549 FIXME("(%p)->()\n", This);
550 return E_NOTIMPL;
553 static HRESULT WINAPI HTMLImgElement_get_start(IHTMLImgElement *iface, BSTR *p)
555 HTMLImgElement *This = impl_from_IHTMLImgElement(iface);
556 FIXME("(%p)->(%p)\n", This, p);
557 return E_NOTIMPL;
560 static const IHTMLImgElementVtbl HTMLImgElementVtbl = {
561 HTMLImgElement_QueryInterface,
562 HTMLImgElement_AddRef,
563 HTMLImgElement_Release,
564 HTMLImgElement_GetTypeInfoCount,
565 HTMLImgElement_GetTypeInfo,
566 HTMLImgElement_GetIDsOfNames,
567 HTMLImgElement_Invoke,
568 HTMLImgElement_put_isMap,
569 HTMLImgElement_get_isMap,
570 HTMLImgElement_put_useMap,
571 HTMLImgElement_get_useMap,
572 HTMLImgElement_get_mimeType,
573 HTMLImgElement_get_fileSize,
574 HTMLImgElement_get_fileCreatedDate,
575 HTMLImgElement_get_fileModifiedDate,
576 HTMLImgElement_get_fileUpdatedDate,
577 HTMLImgElement_get_protocol,
578 HTMLImgElement_get_href,
579 HTMLImgElement_get_nameProp,
580 HTMLImgElement_put_border,
581 HTMLImgElement_get_border,
582 HTMLImgElement_put_vspace,
583 HTMLImgElement_get_vspace,
584 HTMLImgElement_put_hspace,
585 HTMLImgElement_get_hspace,
586 HTMLImgElement_put_alt,
587 HTMLImgElement_get_alt,
588 HTMLImgElement_put_src,
589 HTMLImgElement_get_src,
590 HTMLImgElement_put_lowsrc,
591 HTMLImgElement_get_lowsrc,
592 HTMLImgElement_put_vrml,
593 HTMLImgElement_get_vrml,
594 HTMLImgElement_put_dynsrc,
595 HTMLImgElement_get_dynsrc,
596 HTMLImgElement_get_readyState,
597 HTMLImgElement_get_complete,
598 HTMLImgElement_put_loop,
599 HTMLImgElement_get_loop,
600 HTMLImgElement_put_align,
601 HTMLImgElement_get_align,
602 HTMLImgElement_put_onload,
603 HTMLImgElement_get_onload,
604 HTMLImgElement_put_onerror,
605 HTMLImgElement_get_onerror,
606 HTMLImgElement_put_onabort,
607 HTMLImgElement_get_onabort,
608 HTMLImgElement_put_name,
609 HTMLImgElement_get_name,
610 HTMLImgElement_put_width,
611 HTMLImgElement_get_width,
612 HTMLImgElement_put_height,
613 HTMLImgElement_get_height,
614 HTMLImgElement_put_start,
615 HTMLImgElement_get_start
618 static inline HTMLImgElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface)
620 return CONTAINING_RECORD(iface, HTMLImgElement, element.node);
623 static HRESULT HTMLImgElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
625 HTMLImgElement *This = impl_from_HTMLDOMNode(iface);
627 *ppv = NULL;
629 if(IsEqualGUID(&IID_IHTMLImgElement, riid)) {
630 TRACE("(%p)->(IID_IHTMLImgElement %p)\n", This, ppv);
631 *ppv = &This->IHTMLImgElement_iface;
632 }else {
633 return HTMLElement_QI(&This->element.node, riid, ppv);
636 IUnknown_AddRef((IUnknown*)*ppv);
637 return S_OK;
640 static HRESULT HTMLImgElement_get_readystate(HTMLDOMNode *iface, BSTR *p)
642 HTMLImgElement *This = impl_from_HTMLDOMNode(iface);
644 return IHTMLImgElement_get_readyState(&This->IHTMLImgElement_iface, p);
647 static const NodeImplVtbl HTMLImgElementImplVtbl = {
648 HTMLImgElement_QI,
649 HTMLElement_destructor,
650 HTMLElement_cpc,
651 HTMLElement_clone,
652 HTMLElement_handle_event,
653 HTMLElement_get_attr_col,
654 NULL,
655 NULL,
656 NULL,
657 NULL,
658 NULL,
659 HTMLImgElement_get_readystate
662 static const tid_t HTMLImgElement_iface_tids[] = {
663 HTMLELEMENT_TIDS,
664 IHTMLImgElement_tid,
667 static dispex_static_data_t HTMLImgElement_dispex = {
668 NULL,
669 DispHTMLImg_tid,
670 NULL,
671 HTMLImgElement_iface_tids
674 HRESULT HTMLImgElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
676 HTMLImgElement *ret;
677 nsresult nsres;
679 ret = heap_alloc_zero(sizeof(HTMLImgElement));
680 if(!ret)
681 return E_OUTOFMEMORY;
683 ret->IHTMLImgElement_iface.lpVtbl = &HTMLImgElementVtbl;
684 ret->element.node.vtbl = &HTMLImgElementImplVtbl;
686 HTMLElement_Init(&ret->element, doc, nselem, &HTMLImgElement_dispex);
688 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLImageElement, (void**)&ret->nsimg);
690 /* Share nsimg reference with nsnode */
691 assert(nsres == NS_OK && (nsIDOMNode*)ret->nsimg == ret->element.node.nsnode);
692 nsIDOMNode_Release(ret->element.node.nsnode);
694 *elem = &ret->element;
695 return S_OK;
698 static inline HTMLImageElementFactory *impl_from_IHTMLImageElementFactory(IHTMLImageElementFactory *iface)
700 return CONTAINING_RECORD(iface, HTMLImageElementFactory, IHTMLImageElementFactory_iface);
703 static HRESULT WINAPI HTMLImageElementFactory_QueryInterface(IHTMLImageElementFactory *iface,
704 REFIID riid, void **ppv)
706 HTMLImageElementFactory *This = impl_from_IHTMLImageElementFactory(iface);
708 *ppv = NULL;
710 if(IsEqualGUID(&IID_IUnknown, riid)) {
711 TRACE("(%p)->(IID_Unknown %p)\n", This, ppv);
712 *ppv = &This->IHTMLImageElementFactory_iface;
713 }else if(IsEqualGUID(&IID_IHTMLImageElementFactory, riid)) {
714 TRACE("(%p)->(IID_IHTMLImageElementFactory %p)\n", This, ppv);
715 *ppv = &This->IHTMLImageElementFactory_iface;
716 }else if(dispex_query_interface(&This->dispex, riid, ppv))
717 return *ppv ? S_OK : E_NOINTERFACE;
719 if(*ppv) {
720 IUnknown_AddRef((IUnknown*)*ppv);
721 return S_OK;
724 WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
725 return E_NOINTERFACE;
728 static ULONG WINAPI HTMLImageElementFactory_AddRef(IHTMLImageElementFactory *iface)
730 HTMLImageElementFactory *This = impl_from_IHTMLImageElementFactory(iface);
731 LONG ref = InterlockedIncrement(&This->ref);
733 TRACE("(%p) ref=%d\n", This, ref);
735 return ref;
738 static ULONG WINAPI HTMLImageElementFactory_Release(IHTMLImageElementFactory *iface)
740 HTMLImageElementFactory *This = impl_from_IHTMLImageElementFactory(iface);
741 LONG ref = InterlockedDecrement(&This->ref);
743 TRACE("(%p) ref=%d\n", This, ref);
745 if(!ref)
746 heap_free(This);
748 return ref;
751 static HRESULT WINAPI HTMLImageElementFactory_GetTypeInfoCount(IHTMLImageElementFactory *iface,
752 UINT *pctinfo)
754 HTMLImageElementFactory *This = impl_from_IHTMLImageElementFactory(iface);
755 FIXME("(%p)->(%p)\n", This, pctinfo);
756 return E_NOTIMPL;
759 static HRESULT WINAPI HTMLImageElementFactory_GetTypeInfo(IHTMLImageElementFactory *iface,
760 UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
762 HTMLImageElementFactory *This = impl_from_IHTMLImageElementFactory(iface);
763 FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
764 return E_NOTIMPL;
767 static HRESULT WINAPI HTMLImageElementFactory_GetIDsOfNames(IHTMLImageElementFactory *iface,
768 REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid,
769 DISPID *rgDispId)
771 HTMLImageElementFactory *This = impl_from_IHTMLImageElementFactory(iface);
772 FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames,
773 cNames, lcid, rgDispId);
774 return E_NOTIMPL;
777 static HRESULT WINAPI HTMLImageElementFactory_Invoke(IHTMLImageElementFactory *iface,
778 DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
779 DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo,
780 UINT *puArgErr)
782 HTMLImageElementFactory *This = impl_from_IHTMLImageElementFactory(iface);
783 FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
784 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
785 return E_NOTIMPL;
788 static LONG var_to_size(const VARIANT *v)
790 switch(V_VT(v)) {
791 case VT_EMPTY:
792 return 0;
793 case VT_I4:
794 return V_I4(v);
795 case VT_BSTR: {
796 LONG ret;
797 HRESULT hres;
799 hres = VarI4FromStr(V_BSTR(v), 0, 0, &ret);
800 if(FAILED(hres)) {
801 FIXME("VarI4FromStr failed: %08x\n", hres);
802 return 0;
804 return ret;
806 default:
807 FIXME("unsupported size %s\n", debugstr_variant(v));
809 return 0;
812 static HRESULT WINAPI HTMLImageElementFactory_create(IHTMLImageElementFactory *iface,
813 VARIANT width, VARIANT height, IHTMLImgElement **img_elem)
815 HTMLImageElementFactory *This = impl_from_IHTMLImageElementFactory(iface);
816 HTMLDocumentNode *doc;
817 IHTMLImgElement *img;
818 HTMLElement *elem;
819 nsIDOMHTMLElement *nselem;
820 LONG l;
821 HRESULT hres;
823 static const PRUnichar imgW[] = {'I','M','G',0};
825 TRACE("(%p)->(%s %s %p)\n", This, debugstr_variant(&width),
826 debugstr_variant(&height), img_elem);
828 if(!This->window || !This->window->doc) {
829 WARN("NULL doc\n");
830 return E_UNEXPECTED;
833 doc = This->window->doc;
835 *img_elem = NULL;
837 hres = create_nselem(doc, imgW, &nselem);
838 if(FAILED(hres))
839 return hres;
841 hres = HTMLElement_Create(doc, (nsIDOMNode*)nselem, FALSE, &elem);
842 nsIDOMHTMLElement_Release(nselem);
843 if(FAILED(hres)) {
844 ERR("HTMLElement_Create failed\n");
845 return hres;
848 hres = IHTMLElement_QueryInterface(&elem->IHTMLElement_iface, &IID_IHTMLImgElement,
849 (void**)&img);
850 IHTMLElement_Release(&elem->IHTMLElement_iface);
851 if(FAILED(hres)) {
852 ERR("IHTMLElement_QueryInterface failed: 0x%08x\n", hres);
853 return hres;
856 l = var_to_size(&width);
857 if(l)
858 IHTMLImgElement_put_width(img, l);
859 l = var_to_size(&height);
860 if(l)
861 IHTMLImgElement_put_height(img, l);
863 *img_elem = img;
864 return S_OK;
867 static const IHTMLImageElementFactoryVtbl HTMLImageElementFactoryVtbl = {
868 HTMLImageElementFactory_QueryInterface,
869 HTMLImageElementFactory_AddRef,
870 HTMLImageElementFactory_Release,
871 HTMLImageElementFactory_GetTypeInfoCount,
872 HTMLImageElementFactory_GetTypeInfo,
873 HTMLImageElementFactory_GetIDsOfNames,
874 HTMLImageElementFactory_Invoke,
875 HTMLImageElementFactory_create
878 static inline HTMLImageElementFactory *impl_from_DispatchEx(DispatchEx *iface)
880 return CONTAINING_RECORD(iface, HTMLImageElementFactory, dispex);
883 static HRESULT HTMLImageElementFactory_value(DispatchEx *dispex, LCID lcid,
884 WORD flags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei,
885 IServiceProvider *caller)
887 HTMLImageElementFactory *This = impl_from_DispatchEx(dispex);
888 IHTMLImgElement *img;
889 VARIANT empty, *width, *height;
890 HRESULT hres;
891 int argc = params->cArgs - params->cNamedArgs;
893 V_VT(res) = VT_NULL;
895 V_VT(&empty) = VT_EMPTY;
897 width = argc >= 1 ? params->rgvarg + (params->cArgs - 1) : &empty;
898 height = argc >= 2 ? params->rgvarg + (params->cArgs - 2) : &empty;
900 hres = IHTMLImageElementFactory_create(&This->IHTMLImageElementFactory_iface, *width, *height,
901 &img);
902 if(FAILED(hres))
903 return hres;
905 V_VT(res) = VT_DISPATCH;
906 V_DISPATCH(res) = (IDispatch*)img;
908 return S_OK;
911 static const tid_t HTMLImageElementFactory_iface_tids[] = {
912 IHTMLImageElementFactory_tid,
916 static const dispex_static_data_vtbl_t HTMLImageElementFactory_dispex_vtbl = {
917 HTMLImageElementFactory_value,
918 NULL,
919 NULL,
920 NULL
923 static dispex_static_data_t HTMLImageElementFactory_dispex = {
924 &HTMLImageElementFactory_dispex_vtbl,
925 IHTMLImageElementFactory_tid,
926 NULL,
927 HTMLImageElementFactory_iface_tids
930 HRESULT HTMLImageElementFactory_Create(HTMLInnerWindow *window, HTMLImageElementFactory **ret_val)
932 HTMLImageElementFactory *ret;
934 ret = heap_alloc(sizeof(HTMLImageElementFactory));
935 if(!ret)
936 return E_OUTOFMEMORY;
938 ret->IHTMLImageElementFactory_iface.lpVtbl = &HTMLImageElementFactoryVtbl;
939 ret->ref = 1;
940 ret->window = window;
942 init_dispex(&ret->dispex, (IUnknown*)&ret->IHTMLImageElementFactory_iface,
943 &HTMLImageElementFactory_dispex);
945 *ret_val = ret;
946 return S_OK;