gdiplus/tests: Check more return values (Coverity).
[wine.git] / dlls / mshtml / htmltablecell.c
blobd7fc73b8431cb255f2a14ff16233f76cbc7d521e
1 /*
2 * Copyright 2012 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"
33 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
35 struct HTMLTableCell {
36 HTMLElement element;
38 IHTMLTableCell IHTMLTableCell_iface;
40 nsIDOMHTMLTableCellElement *nscell;
43 static inline HTMLTableCell *impl_from_IHTMLTableCell(IHTMLTableCell *iface)
45 return CONTAINING_RECORD(iface, HTMLTableCell, IHTMLTableCell_iface);
48 static HRESULT WINAPI HTMLTableCell_QueryInterface(IHTMLTableCell *iface, REFIID riid, void **ppv)
50 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
52 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
55 static ULONG WINAPI HTMLTableCell_AddRef(IHTMLTableCell *iface)
57 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
59 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
62 static ULONG WINAPI HTMLTableCell_Release(IHTMLTableCell *iface)
64 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
66 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
69 static HRESULT WINAPI HTMLTableCell_GetTypeInfoCount(IHTMLTableCell *iface, UINT *pctinfo)
71 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
72 return IDispatchEx_GetTypeInfoCount(&This->element.node.event_target.dispex.IDispatchEx_iface, pctinfo);
75 static HRESULT WINAPI HTMLTableCell_GetTypeInfo(IHTMLTableCell *iface, UINT iTInfo,
76 LCID lcid, ITypeInfo **ppTInfo)
78 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
79 return IDispatchEx_GetTypeInfo(&This->element.node.event_target.dispex.IDispatchEx_iface, iTInfo, lcid,
80 ppTInfo);
83 static HRESULT WINAPI HTMLTableCell_GetIDsOfNames(IHTMLTableCell *iface, REFIID riid,
84 LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
86 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
87 return IDispatchEx_GetIDsOfNames(&This->element.node.event_target.dispex.IDispatchEx_iface, riid, rgszNames,
88 cNames, lcid, rgDispId);
91 static HRESULT WINAPI HTMLTableCell_Invoke(IHTMLTableCell *iface, DISPID dispIdMember, REFIID riid,
92 LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo,
93 UINT *puArgErr)
95 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
96 return IDispatchEx_Invoke(&This->element.node.event_target.dispex.IDispatchEx_iface, dispIdMember, riid,
97 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
100 static HRESULT WINAPI HTMLTableCell_put_rowSpan(IHTMLTableCell *iface, LONG v)
102 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
103 nsresult nsres;
105 TRACE("(%p)->(%d)\n", This, v);
107 if(v <= 0)
108 return E_INVALIDARG;
110 nsres = nsIDOMHTMLTableCellElement_SetRowSpan(This->nscell, v);
111 if(NS_FAILED(nsres)) {
112 ERR("SetRowSpan failed: %08x\n", nsres);
113 return E_FAIL;
116 return S_OK;
119 static HRESULT WINAPI HTMLTableCell_get_rowSpan(IHTMLTableCell *iface, LONG *p)
121 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
122 nsresult nsres;
124 TRACE("(%p)->(%p)\n", This, p);
126 nsres = nsIDOMHTMLTableCellElement_GetRowSpan(This->nscell, p);
127 if(NS_FAILED(nsres)) {
128 ERR("GetRowSpan failed: %08x\n", nsres);
129 return E_FAIL;
132 return S_OK;
135 static HRESULT WINAPI HTMLTableCell_put_colSpan(IHTMLTableCell *iface, LONG v)
137 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
138 nsresult nsres;
140 TRACE("(%p)->(%d)\n", This, v);
142 if(v <= 0)
143 return E_INVALIDARG;
145 nsres = nsIDOMHTMLTableCellElement_SetColSpan(This->nscell, v);
146 if(NS_FAILED(nsres)) {
147 ERR("SetColSpan failed: %08x\n", nsres);
148 return E_FAIL;
151 return S_OK;
154 static HRESULT WINAPI HTMLTableCell_get_colSpan(IHTMLTableCell *iface, LONG *p)
156 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
157 nsresult nsres;
159 TRACE("(%p)->(%p)\n", This, p);
161 nsres = nsIDOMHTMLTableCellElement_GetColSpan(This->nscell, p);
162 if(NS_FAILED(nsres)) {
163 ERR("GetColSpan failed: %08x\n", nsres);
164 return E_FAIL;
167 return S_OK;
170 static HRESULT WINAPI HTMLTableCell_put_align(IHTMLTableCell *iface, BSTR v)
172 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
173 nsAString str;
174 nsresult nsres;
176 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
178 nsAString_InitDepend(&str, v);
179 nsres = nsIDOMHTMLTableCellElement_SetAlign(This->nscell, &str);
180 nsAString_Finish(&str);
181 if (NS_FAILED(nsres)) {
182 ERR("Set Align failed: %08x\n", nsres);
183 return E_FAIL;
185 return S_OK;
188 static HRESULT WINAPI HTMLTableCell_get_align(IHTMLTableCell *iface, BSTR *p)
190 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
191 nsAString str;
192 nsresult nsres;
194 TRACE("(%p)->(%p)\n", This, p);
196 nsAString_Init(&str, NULL);
197 nsres = nsIDOMHTMLTableCellElement_GetAlign(This->nscell, &str);
199 return return_nsstr(nsres, &str, p);
202 static HRESULT WINAPI HTMLTableCell_put_vAlign(IHTMLTableCell *iface, BSTR v)
204 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
205 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
206 return E_NOTIMPL;
209 static HRESULT WINAPI HTMLTableCell_get_vAlign(IHTMLTableCell *iface, BSTR *p)
211 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
212 FIXME("(%p)->(%p)\n", This, p);
213 return E_NOTIMPL;
216 static HRESULT WINAPI HTMLTableCell_put_bgColor(IHTMLTableCell *iface, VARIANT v)
218 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
219 nsAString strColor;
220 nsresult nsres;
222 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
224 if(!variant_to_nscolor(&v, &strColor))
225 return S_OK;
227 nsres = nsIDOMHTMLTableCellElement_SetBgColor(This->nscell, &strColor);
228 nsAString_Finish(&strColor);
229 if(NS_FAILED(nsres)) {
230 ERR("SetBgColor(%s) failed: %08x\n", debugstr_variant(&v), nsres);
231 return E_FAIL;
234 return S_OK;
237 static HRESULT WINAPI HTMLTableCell_get_bgColor(IHTMLTableCell *iface, VARIANT *p)
239 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
240 nsAString strColor;
241 nsresult nsres;
242 HRESULT hres;
244 TRACE("(%p)->(%p)\n", This, p);
246 nsAString_Init(&strColor, NULL);
247 nsres = nsIDOMHTMLTableCellElement_GetBgColor(This->nscell, &strColor);
249 if(NS_SUCCEEDED(nsres)) {
250 const PRUnichar *color;
251 nsAString_GetData(&strColor, &color);
252 V_VT(p) = VT_BSTR;
253 hres = nscolor_to_str(color, &V_BSTR(p));
254 }else {
255 ERR("GetBgColor failed: %08x\n", nsres);
256 hres = E_FAIL;
258 nsAString_Finish(&strColor);
259 return hres;
262 static HRESULT WINAPI HTMLTableCell_put_noWrap(IHTMLTableCell *iface, VARIANT_BOOL v)
264 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
265 FIXME("(%p)->(%x)\n", This, v);
266 return E_NOTIMPL;
269 static HRESULT WINAPI HTMLTableCell_get_noWrap(IHTMLTableCell *iface, VARIANT_BOOL *p)
271 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
272 FIXME("(%p)->(%p)\n", This, p);
273 return E_NOTIMPL;
276 static HRESULT WINAPI HTMLTableCell_put_background(IHTMLTableCell *iface, BSTR v)
278 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
279 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
280 return E_NOTIMPL;
283 static HRESULT WINAPI HTMLTableCell_get_background(IHTMLTableCell *iface, BSTR *p)
285 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
286 FIXME("(%p)->(%p)\n", This, p);
287 return E_NOTIMPL;
290 static HRESULT WINAPI HTMLTableCell_put_borderColor(IHTMLTableCell *iface, VARIANT v)
292 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
293 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
294 return E_NOTIMPL;
297 static HRESULT WINAPI HTMLTableCell_get_borderColor(IHTMLTableCell *iface, VARIANT *p)
299 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
300 FIXME("(%p)->(%p)\n", This, p);
301 return E_NOTIMPL;
304 static HRESULT WINAPI HTMLTableCell_put_borderColorLight(IHTMLTableCell *iface, VARIANT v)
306 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
307 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
308 return E_NOTIMPL;
311 static HRESULT WINAPI HTMLTableCell_get_borderColorLight(IHTMLTableCell *iface, VARIANT *p)
313 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
314 FIXME("(%p)->(%p)\n", This, p);
315 return E_NOTIMPL;
318 static HRESULT WINAPI HTMLTableCell_put_borderColorDark(IHTMLTableCell *iface, VARIANT v)
320 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
321 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
322 return E_NOTIMPL;
325 static HRESULT WINAPI HTMLTableCell_get_borderColorDark(IHTMLTableCell *iface, VARIANT *p)
327 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
328 FIXME("(%p)->(%p)\n", This, p);
329 return E_NOTIMPL;
332 static HRESULT WINAPI HTMLTableCell_put_width(IHTMLTableCell *iface, VARIANT v)
334 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
335 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
336 return E_NOTIMPL;
339 static HRESULT WINAPI HTMLTableCell_get_width(IHTMLTableCell *iface, VARIANT *p)
341 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
342 FIXME("(%p)->(%p)\n", This, p);
343 return E_NOTIMPL;
346 static HRESULT WINAPI HTMLTableCell_put_height(IHTMLTableCell *iface, VARIANT v)
348 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
349 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
350 return E_NOTIMPL;
353 static HRESULT WINAPI HTMLTableCell_get_height(IHTMLTableCell *iface, VARIANT *p)
355 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
356 FIXME("(%p)->(%p)\n", This, p);
357 return E_NOTIMPL;
360 static HRESULT WINAPI HTMLTableCell_get_cellIndex(IHTMLTableCell *iface, LONG *p)
362 HTMLTableCell *This = impl_from_IHTMLTableCell(iface);
363 nsresult nsres;
365 TRACE("(%p)->(%p)\n", This, p);
366 nsres = nsIDOMHTMLTableCellElement_GetCellIndex(This->nscell, p);
367 if (NS_FAILED(nsres)) {
368 ERR("Get CellIndex failed: %08x\n", nsres);
369 return E_FAIL;
372 return S_OK;
375 static const IHTMLTableCellVtbl HTMLTableCellVtbl = {
376 HTMLTableCell_QueryInterface,
377 HTMLTableCell_AddRef,
378 HTMLTableCell_Release,
379 HTMLTableCell_GetTypeInfoCount,
380 HTMLTableCell_GetTypeInfo,
381 HTMLTableCell_GetIDsOfNames,
382 HTMLTableCell_Invoke,
383 HTMLTableCell_put_rowSpan,
384 HTMLTableCell_get_rowSpan,
385 HTMLTableCell_put_colSpan,
386 HTMLTableCell_get_colSpan,
387 HTMLTableCell_put_align,
388 HTMLTableCell_get_align,
389 HTMLTableCell_put_vAlign,
390 HTMLTableCell_get_vAlign,
391 HTMLTableCell_put_bgColor,
392 HTMLTableCell_get_bgColor,
393 HTMLTableCell_put_noWrap,
394 HTMLTableCell_get_noWrap,
395 HTMLTableCell_put_background,
396 HTMLTableCell_get_background,
397 HTMLTableCell_put_borderColor,
398 HTMLTableCell_get_borderColor,
399 HTMLTableCell_put_borderColorLight,
400 HTMLTableCell_get_borderColorLight,
401 HTMLTableCell_put_borderColorDark,
402 HTMLTableCell_get_borderColorDark,
403 HTMLTableCell_put_width,
404 HTMLTableCell_get_width,
405 HTMLTableCell_put_height,
406 HTMLTableCell_get_height,
407 HTMLTableCell_get_cellIndex
410 static inline HTMLTableCell *impl_from_HTMLDOMNode(HTMLDOMNode *iface)
412 return CONTAINING_RECORD(iface, HTMLTableCell, element.node);
415 static HRESULT HTMLTableCell_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
417 HTMLTableCell *This = impl_from_HTMLDOMNode(iface);
419 if(IsEqualGUID(&IID_IUnknown, riid)) {
420 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
421 *ppv = &This->IHTMLTableCell_iface;
422 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
423 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
424 *ppv = &This->IHTMLTableCell_iface;
425 }else if(IsEqualGUID(&IID_IHTMLTableCell, riid)) {
426 TRACE("(%p)->(IID_IHTMLTableCell %p)\n", This, ppv);
427 *ppv = &This->IHTMLTableCell_iface;
428 }else {
429 return HTMLElement_QI(&This->element.node, riid, ppv);
432 IUnknown_AddRef((IUnknown*)*ppv);
433 return S_OK;
436 static void HTMLTableCell_destructor(HTMLDOMNode *iface)
438 HTMLTableCell *This = impl_from_HTMLDOMNode(iface);
440 HTMLElement_destructor(&This->element.node);
443 static void HTMLTableCell_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb)
445 HTMLTableCell *This = impl_from_HTMLDOMNode(iface);
447 if(This->nscell)
448 note_cc_edge((nsISupports*)This->nscell, "This->nstablecell", cb);
451 static void HTMLTableCell_unlink(HTMLDOMNode *iface)
453 HTMLTableCell *This = impl_from_HTMLDOMNode(iface);
455 if(This->nscell) {
456 nsIDOMHTMLTableCellElement *nscell = This->nscell;
458 This->nscell = NULL;
459 nsIDOMHTMLTableCellElement_Release(nscell);
463 static const NodeImplVtbl HTMLTableCellImplVtbl = {
464 &CLSID_HTMLTableCell,
465 HTMLTableCell_QI,
466 HTMLTableCell_destructor,
467 HTMLElement_cpc,
468 HTMLElement_clone,
469 HTMLElement_handle_event,
470 HTMLElement_get_attr_col,
471 NULL,
472 NULL,
473 NULL,
474 NULL,
475 NULL,
476 NULL,
477 NULL,
478 NULL,
479 HTMLTableCell_traverse,
480 HTMLTableCell_unlink
483 static const tid_t HTMLTableCell_iface_tids[] = {
484 HTMLELEMENT_TIDS,
485 IHTMLTableCell_tid,
489 static dispex_static_data_t HTMLTableCell_dispex = {
490 NULL,
491 DispHTMLTableCell_tid,
492 HTMLTableCell_iface_tids,
493 HTMLElement_init_dispex_info
496 HRESULT HTMLTableCell_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
498 HTMLTableCell *ret;
499 nsresult nsres;
501 ret = heap_alloc_zero(sizeof(*ret));
502 if(!ret)
503 return E_OUTOFMEMORY;
505 ret->IHTMLTableCell_iface.lpVtbl = &HTMLTableCellVtbl;
506 ret->element.node.vtbl = &HTMLTableCellImplVtbl;
508 HTMLElement_Init(&ret->element, doc, nselem, &HTMLTableCell_dispex);
510 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLTableCellElement, (void**)&ret->nscell);
511 assert(nsres == NS_OK);
513 *elem = &ret->element;
514 return S_OK;