dpnet/tests: Add a trailing '\n' to some ok() calls.
[wine.git] / dlls / mshtml / htmltable.c
blob8e64efad062a3f5f72497eca010ff249982859c9
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 <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 HTMLTable {
36 HTMLElement element;
38 IHTMLTable IHTMLTable_iface;
39 IHTMLTable2 IHTMLTable2_iface;
40 IHTMLTable3 IHTMLTable3_iface;
42 nsIDOMHTMLTableElement *nstable;
45 static inline HTMLTable *impl_from_IHTMLTable(IHTMLTable *iface)
47 return CONTAINING_RECORD(iface, HTMLTable, IHTMLTable_iface);
50 static inline HTMLTable *impl_from_IHTMLTable2(IHTMLTable2 *iface)
52 return CONTAINING_RECORD(iface, HTMLTable, IHTMLTable2_iface);
55 static inline HTMLTable *impl_from_IHTMLTable3(IHTMLTable3 *iface)
57 return CONTAINING_RECORD(iface, HTMLTable, IHTMLTable3_iface);
60 static HRESULT var2str(const VARIANT *p, nsAString *nsstr)
62 BSTR str;
63 BOOL ret;
64 HRESULT hres;
66 switch(V_VT(p)) {
67 case VT_BSTR:
68 return nsAString_Init(nsstr, V_BSTR(p))?
69 S_OK : E_OUTOFMEMORY;
70 case VT_R8:
71 hres = VarBstrFromR8(V_R8(p), 0, 0, &str);
72 break;
73 case VT_R4:
74 hres = VarBstrFromR4(V_R4(p), 0, 0, &str);
75 break;
76 case VT_I4:
77 hres = VarBstrFromI4(V_I4(p), 0, 0, &str);
78 break;
79 default:
80 FIXME("unsupported arg %s\n", debugstr_variant(p));
81 return E_NOTIMPL;
83 if (FAILED(hres))
84 return hres;
86 ret = nsAString_Init(nsstr, str);
87 SysFreeString(str);
88 return ret ? S_OK : E_OUTOFMEMORY;
91 static HRESULT nsstr_to_truncated_bstr(const nsAString *nsstr, BSTR *ret_ptr)
93 const PRUnichar *str, *ptr, *end = NULL;
94 BSTR ret;
96 nsAString_GetData(nsstr, &str);
98 for(ptr = str; isdigitW(*ptr); ptr++);
99 if(*ptr == '.') {
100 for(end = ptr++; isdigitW(*ptr); ptr++);
101 if(*ptr)
102 end = NULL;
105 ret = end ? SysAllocStringLen(str, end-str) : SysAllocString(str);
107 *ret_ptr = ret;
108 return ret ? S_OK : E_OUTOFMEMORY;
111 static HRESULT WINAPI HTMLTable_QueryInterface(IHTMLTable *iface,
112 REFIID riid, void **ppv)
114 HTMLTable *This = impl_from_IHTMLTable(iface);
116 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
119 static ULONG WINAPI HTMLTable_AddRef(IHTMLTable *iface)
121 HTMLTable *This = impl_from_IHTMLTable(iface);
123 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
126 static ULONG WINAPI HTMLTable_Release(IHTMLTable *iface)
128 HTMLTable *This = impl_from_IHTMLTable(iface);
130 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
133 static HRESULT WINAPI HTMLTable_GetTypeInfoCount(IHTMLTable *iface, UINT *pctinfo)
135 HTMLTable *This = impl_from_IHTMLTable(iface);
136 return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo);
139 static HRESULT WINAPI HTMLTable_GetTypeInfo(IHTMLTable *iface, UINT iTInfo,
140 LCID lcid, ITypeInfo **ppTInfo)
142 HTMLTable *This = impl_from_IHTMLTable(iface);
143 return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid,
144 ppTInfo);
147 static HRESULT WINAPI HTMLTable_GetIDsOfNames(IHTMLTable *iface, REFIID riid,
148 LPOLESTR *rgszNames, UINT cNames,
149 LCID lcid, DISPID *rgDispId)
151 HTMLTable *This = impl_from_IHTMLTable(iface);
152 return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames,
153 cNames, lcid, rgDispId);
156 static HRESULT WINAPI HTMLTable_Invoke(IHTMLTable *iface, DISPID dispIdMember,
157 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
158 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
160 HTMLTable *This = impl_from_IHTMLTable(iface);
161 return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid,
162 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
165 static HRESULT WINAPI HTMLTable_put_cols(IHTMLTable *iface, LONG v)
167 HTMLTable *This = impl_from_IHTMLTable(iface);
168 FIXME("(%p)->(%d)\n", This, v);
169 return E_NOTIMPL;
172 static HRESULT WINAPI HTMLTable_get_cols(IHTMLTable *iface, LONG *p)
174 HTMLTable *This = impl_from_IHTMLTable(iface);
175 FIXME("(%p)->(%p)\n", This, p);
176 return E_NOTIMPL;
179 static HRESULT WINAPI HTMLTable_put_border(IHTMLTable *iface, VARIANT v)
181 HTMLTable *This = impl_from_IHTMLTable(iface);
182 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
183 return E_NOTIMPL;
186 static HRESULT WINAPI HTMLTable_get_border(IHTMLTable *iface, VARIANT *p)
188 HTMLTable *This = impl_from_IHTMLTable(iface);
189 FIXME("(%p)->(%p)\n", This, p);
190 return E_NOTIMPL;
193 static HRESULT WINAPI HTMLTable_put_frame(IHTMLTable *iface, BSTR v)
195 HTMLTable *This = impl_from_IHTMLTable(iface);
196 nsAString str;
197 nsresult nsres;
199 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
201 nsAString_InitDepend(&str, v);
202 nsres = nsIDOMHTMLTableElement_SetFrame(This->nstable, &str);
203 nsAString_Finish(&str);
205 if (NS_FAILED(nsres)) {
206 ERR("SetFrame(%s) failed: %08x\n", debugstr_w(v), nsres);
207 return E_FAIL;
209 return S_OK;
212 static HRESULT WINAPI HTMLTable_get_frame(IHTMLTable *iface, BSTR *p)
214 HTMLTable *This = impl_from_IHTMLTable(iface);
215 nsAString str;
216 nsresult nsres;
218 TRACE("(%p)->(%p)\n", This, p);
220 nsAString_Init(&str, NULL);
221 nsres = nsIDOMHTMLTableElement_GetFrame(This->nstable, &str);
223 return return_nsstr(nsres, &str, p);
226 static HRESULT WINAPI HTMLTable_put_rules(IHTMLTable *iface, BSTR v)
228 HTMLTable *This = impl_from_IHTMLTable(iface);
229 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
230 return E_NOTIMPL;
233 static HRESULT WINAPI HTMLTable_get_rules(IHTMLTable *iface, BSTR *p)
235 HTMLTable *This = impl_from_IHTMLTable(iface);
236 FIXME("(%p)->(%p)\n", This, p);
237 return E_NOTIMPL;
240 static HRESULT WINAPI HTMLTable_put_cellSpacing(IHTMLTable *iface, VARIANT v)
242 HTMLTable *This = impl_from_IHTMLTable(iface);
243 nsAString nsstr;
244 WCHAR buf[64];
245 nsresult nsres;
247 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
249 switch(V_VT(&v)) {
250 case VT_BSTR:
251 nsAString_InitDepend(&nsstr, V_BSTR(&v));
252 break;
253 case VT_I4: {
254 static const WCHAR formatW[] = {'%','d',0};
255 sprintfW(buf, formatW, V_I4(&v));
256 nsAString_InitDepend(&nsstr, buf);
257 break;
259 default:
260 FIXME("unsupported arg %s\n", debugstr_variant(&v));
261 return E_NOTIMPL;
264 nsres = nsIDOMHTMLTableElement_SetCellSpacing(This->nstable, &nsstr);
265 nsAString_Finish(&nsstr);
266 if(NS_FAILED(nsres)) {
267 ERR("SetCellSpacing failed: %08x\n", nsres);
268 return E_FAIL;
271 return S_OK;
274 static HRESULT WINAPI HTMLTable_get_cellSpacing(IHTMLTable *iface, VARIANT *p)
276 HTMLTable *This = impl_from_IHTMLTable(iface);
277 nsAString nsstr;
278 nsresult nsres;
280 TRACE("(%p)->(%p)\n", This, p);
282 nsAString_Init(&nsstr, NULL);
283 nsres = nsIDOMHTMLTableElement_GetCellSpacing(This->nstable, &nsstr);
284 V_VT(p) = VT_BSTR;
285 return return_nsstr(nsres, &nsstr, &V_BSTR(p));
288 static HRESULT WINAPI HTMLTable_put_cellPadding(IHTMLTable *iface, VARIANT v)
290 HTMLTable *This = impl_from_IHTMLTable(iface);
291 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
292 return E_NOTIMPL;
295 static HRESULT WINAPI HTMLTable_get_cellPadding(IHTMLTable *iface, VARIANT *p)
297 HTMLTable *This = impl_from_IHTMLTable(iface);
298 FIXME("(%p)->(%p)\n", This, p);
299 return E_NOTIMPL;
302 static HRESULT WINAPI HTMLTable_put_background(IHTMLTable *iface, BSTR v)
304 HTMLTable *This = impl_from_IHTMLTable(iface);
305 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
306 return E_NOTIMPL;
309 static HRESULT WINAPI HTMLTable_get_background(IHTMLTable *iface, BSTR *p)
311 HTMLTable *This = impl_from_IHTMLTable(iface);
312 FIXME("(%p)->(%p)\n", This, p);
313 return E_NOTIMPL;
316 static HRESULT WINAPI HTMLTable_put_bgColor(IHTMLTable *iface, VARIANT v)
318 HTMLTable *This = impl_from_IHTMLTable(iface);
319 nsAString val;
320 nsresult nsres;
322 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
324 if(!variant_to_nscolor(&v, &val))
325 return S_OK;
327 nsres = nsIDOMHTMLTableElement_SetBgColor(This->nstable, &val);
328 nsAString_Finish(&val);
329 if (NS_FAILED(nsres)){
330 ERR("Set BgColor(%s) failed!\n", debugstr_variant(&v));
331 return E_FAIL;
334 return S_OK;
337 static HRESULT WINAPI HTMLTable_get_bgColor(IHTMLTable *iface, VARIANT *p)
339 HTMLTable *This = impl_from_IHTMLTable(iface);
340 nsAString strColor;
341 nsresult nsres;
342 HRESULT hres;
343 const PRUnichar *color;
345 TRACE("(%p)->(%p)\n", This, p);
347 nsAString_Init(&strColor, NULL);
348 nsres = nsIDOMHTMLTableElement_GetBgColor(This->nstable, &strColor);
350 if(NS_SUCCEEDED(nsres)) {
351 nsAString_GetData(&strColor, &color);
352 V_VT(p) = VT_BSTR;
353 hres = nscolor_to_str(color, &V_BSTR(p));
354 }else {
355 ERR("SetBgColor failed: %08x\n", nsres);
356 hres = E_FAIL;
359 nsAString_Finish(&strColor);
360 return hres;
363 static HRESULT WINAPI HTMLTable_put_borderColor(IHTMLTable *iface, VARIANT v)
365 HTMLTable *This = impl_from_IHTMLTable(iface);
366 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
367 return E_NOTIMPL;
370 static HRESULT WINAPI HTMLTable_get_borderColor(IHTMLTable *iface, VARIANT *p)
372 HTMLTable *This = impl_from_IHTMLTable(iface);
373 FIXME("(%p)->(%p)\n", This, p);
374 return E_NOTIMPL;
377 static HRESULT WINAPI HTMLTable_put_borderColorLight(IHTMLTable *iface, VARIANT v)
379 HTMLTable *This = impl_from_IHTMLTable(iface);
380 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
381 return E_NOTIMPL;
384 static HRESULT WINAPI HTMLTable_get_borderColorLight(IHTMLTable *iface, VARIANT *p)
386 HTMLTable *This = impl_from_IHTMLTable(iface);
387 FIXME("(%p)->(%p)\n", This, p);
388 return E_NOTIMPL;
391 static HRESULT WINAPI HTMLTable_put_borderColorDark(IHTMLTable *iface, VARIANT v)
393 HTMLTable *This = impl_from_IHTMLTable(iface);
394 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
395 return E_NOTIMPL;
398 static HRESULT WINAPI HTMLTable_get_borderColorDark(IHTMLTable *iface, VARIANT *p)
400 HTMLTable *This = impl_from_IHTMLTable(iface);
401 FIXME("(%p)->(%p)\n", This, p);
402 return E_NOTIMPL;
405 static HRESULT WINAPI HTMLTable_put_align(IHTMLTable *iface, BSTR v)
407 HTMLTable *This = impl_from_IHTMLTable(iface);
408 nsAString val;
409 nsresult nsres;
411 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
413 nsAString_InitDepend(&val, v);
415 nsres = nsIDOMHTMLTableElement_SetAlign(This->nstable, &val);
416 nsAString_Finish(&val);
417 if (NS_FAILED(nsres)){
418 ERR("Set Align(%s) failed!\n", debugstr_w(v));
419 return E_FAIL;
421 return S_OK;
424 static HRESULT WINAPI HTMLTable_get_align(IHTMLTable *iface, BSTR *p)
426 HTMLTable *This = impl_from_IHTMLTable(iface);
427 nsAString val;
428 nsresult nsres;
430 TRACE("(%p)->(%p)\n", This, p);
432 nsAString_Init(&val, NULL);
433 nsres = nsIDOMHTMLTableElement_GetAlign(This->nstable, &val);
435 return return_nsstr(nsres, &val, p);
438 static HRESULT WINAPI HTMLTable_refresh(IHTMLTable *iface)
440 HTMLTable *This = impl_from_IHTMLTable(iface);
441 FIXME("(%p)\n", This);
442 return E_NOTIMPL;
445 static HRESULT WINAPI HTMLTable_get_rows(IHTMLTable *iface, IHTMLElementCollection **p)
447 HTMLTable *This = impl_from_IHTMLTable(iface);
448 nsIDOMHTMLCollection *nscol;
449 nsresult nsres;
451 TRACE("(%p)->(%p)\n", This, p);
453 nsres = nsIDOMHTMLTableElement_GetRows(This->nstable, &nscol);
454 if(NS_FAILED(nsres)) {
455 ERR("GetRows failed: %08x\n", nsres);
456 return E_FAIL;
459 *p = create_collection_from_htmlcol(This->element.node.doc, nscol);
461 nsIDOMHTMLCollection_Release(nscol);
462 return S_OK;
465 static HRESULT WINAPI HTMLTable_put_width(IHTMLTable *iface, VARIANT v)
467 HTMLTable *This = impl_from_IHTMLTable(iface);
468 nsAString val;
469 HRESULT hres;
470 nsresult nsres;
472 TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
473 hres = var2str(&v, &val);
475 if (FAILED(hres)){
476 ERR("Set Width(%s) failed when initializing a nsAString, err = %08x\n",
477 debugstr_variant(&v), hres);
478 return hres;
481 nsres = nsIDOMHTMLTableElement_SetWidth(This->nstable, &val);
482 nsAString_Finish(&val);
484 if (NS_FAILED(nsres)){
485 ERR("Set Width(%s) failed, err = %08x\n", debugstr_variant(&v), nsres);
486 return E_FAIL;
488 return S_OK;
491 static HRESULT WINAPI HTMLTable_get_width(IHTMLTable *iface, VARIANT *p)
493 HTMLTable *This = impl_from_IHTMLTable(iface);
494 nsAString val;
495 BSTR bstr;
496 nsresult nsres;
497 HRESULT hres;
499 TRACE("(%p)->(%p)\n", This, p);
500 nsAString_Init(&val, NULL);
501 nsres = nsIDOMHTMLTableElement_GetWidth(This->nstable, &val);
502 if (NS_FAILED(nsres)){
503 ERR("Get Width failed!\n");
504 nsAString_Finish(&val);
505 return E_FAIL;
508 hres = nsstr_to_truncated_bstr(&val, &bstr);
509 nsAString_Finish(&val);
511 V_VT(p) = VT_BSTR;
512 V_BSTR(p) = bstr;
513 return hres;
516 static HRESULT WINAPI HTMLTable_put_height(IHTMLTable *iface, VARIANT v)
518 HTMLTable *This = impl_from_IHTMLTable(iface);
519 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
520 return E_NOTIMPL;
523 static HRESULT WINAPI HTMLTable_get_height(IHTMLTable *iface, VARIANT *p)
525 HTMLTable *This = impl_from_IHTMLTable(iface);
526 FIXME("(%p)->(%p)\n", This, p);
527 return E_NOTIMPL;
530 static HRESULT WINAPI HTMLTable_put_dataPageSize(IHTMLTable *iface, LONG v)
532 HTMLTable *This = impl_from_IHTMLTable(iface);
533 FIXME("(%p)->(%d)\n", This, v);
534 return E_NOTIMPL;
537 static HRESULT WINAPI HTMLTable_get_dataPageSize(IHTMLTable *iface, LONG *p)
539 HTMLTable *This = impl_from_IHTMLTable(iface);
540 FIXME("(%p)->(%p)\n", This, p);
541 return E_NOTIMPL;
544 static HRESULT WINAPI HTMLTable_nextPage(IHTMLTable *iface)
546 HTMLTable *This = impl_from_IHTMLTable(iface);
547 FIXME("(%p)\n", This);
548 return E_NOTIMPL;
551 static HRESULT WINAPI HTMLTable_previousPage(IHTMLTable *iface)
553 HTMLTable *This = impl_from_IHTMLTable(iface);
554 FIXME("(%p)\n", This);
555 return E_NOTIMPL;
558 static HRESULT WINAPI HTMLTable_get_tHead(IHTMLTable *iface, IHTMLTableSection **p)
560 HTMLTable *This = impl_from_IHTMLTable(iface);
561 FIXME("(%p)->(%p)\n", This, p);
562 return E_NOTIMPL;
565 static HRESULT WINAPI HTMLTable_get_tFoot(IHTMLTable *iface, IHTMLTableSection **p)
567 HTMLTable *This = impl_from_IHTMLTable(iface);
568 FIXME("(%p)->(%p)\n", This, p);
569 return E_NOTIMPL;
572 static HRESULT WINAPI HTMLTable_get_tBodies(IHTMLTable *iface, IHTMLElementCollection **p)
574 HTMLTable *This = impl_from_IHTMLTable(iface);
575 nsIDOMHTMLCollection *nscol = NULL;
576 nsresult nsres;
578 TRACE("(%p)->(%p)\n", This, p);
580 nsres = nsIDOMHTMLTableElement_GetTBodies(This->nstable, &nscol);
581 if(NS_FAILED(nsres)) {
582 ERR("GetTBodies failed: %08x\n", nsres);
583 return E_FAIL;
586 *p = create_collection_from_htmlcol(This->element.node.doc, nscol);
588 nsIDOMHTMLCollection_Release(nscol);
589 return S_OK;
592 static HRESULT WINAPI HTMLTable_get_caption(IHTMLTable *iface, IHTMLTableCaption **p)
594 HTMLTable *This = impl_from_IHTMLTable(iface);
595 FIXME("(%p)->(%p)\n", This, p);
596 return E_NOTIMPL;
599 static HRESULT WINAPI HTMLTable_createTHead(IHTMLTable *iface, IDispatch **head)
601 HTMLTable *This = impl_from_IHTMLTable(iface);
602 FIXME("(%p)->(%p)\n", This, head);
603 return E_NOTIMPL;
606 static HRESULT WINAPI HTMLTable_deleteTHead(IHTMLTable *iface)
608 HTMLTable *This = impl_from_IHTMLTable(iface);
609 FIXME("(%p)\n", This);
610 return E_NOTIMPL;
613 static HRESULT WINAPI HTMLTable_createTFoot(IHTMLTable *iface, IDispatch **foot)
615 HTMLTable *This = impl_from_IHTMLTable(iface);
616 FIXME("(%p)->(%p)\n", This, foot);
617 return E_NOTIMPL;
620 static HRESULT WINAPI HTMLTable_deleteTFoot(IHTMLTable *iface)
622 HTMLTable *This = impl_from_IHTMLTable(iface);
623 FIXME("(%p)\n", This);
624 return E_NOTIMPL;
627 static HRESULT WINAPI HTMLTable_createCaption(IHTMLTable *iface, IHTMLTableCaption **caption)
629 HTMLTable *This = impl_from_IHTMLTable(iface);
630 FIXME("(%p)->(%p)\n", This, caption);
631 return E_NOTIMPL;
634 static HRESULT WINAPI HTMLTable_deleteCaption(IHTMLTable *iface)
636 HTMLTable *This = impl_from_IHTMLTable(iface);
637 FIXME("(%p)\n", This);
638 return E_NOTIMPL;
641 static HRESULT WINAPI HTMLTable_insertRow(IHTMLTable *iface, LONG index, IDispatch **row)
643 HTMLTable *This = impl_from_IHTMLTable(iface);
644 nsIDOMHTMLElement *nselem;
645 HTMLElement *elem;
646 nsresult nsres;
647 HRESULT hres;
649 TRACE("(%p)->(%d %p)\n", This, index, row);
650 nsres = nsIDOMHTMLTableElement_InsertRow(This->nstable, index, &nselem);
651 if(NS_FAILED(nsres)) {
652 ERR("Insert Row at %d failed: %08x\n", index, nsres);
653 return E_FAIL;
656 hres = HTMLTableRow_Create(This->element.node.doc, nselem, &elem);
657 nsIDOMHTMLElement_Release(nselem);
658 if (FAILED(hres)) {
659 ERR("Create TableRow failed: %08x\n", hres);
660 return hres;
663 *row = (IDispatch *)&elem->IHTMLElement_iface;
664 return S_OK;
667 static HRESULT WINAPI HTMLTable_deleteRow(IHTMLTable *iface, LONG index)
669 HTMLTable *This = impl_from_IHTMLTable(iface);
670 nsresult nsres;
672 TRACE("(%p)->(%d)\n", This, index);
673 nsres = nsIDOMHTMLTableElement_DeleteRow(This->nstable, index);
674 if(NS_FAILED(nsres)) {
675 ERR("Delete Row failed: %08x\n", nsres);
676 return E_FAIL;
678 return S_OK;
681 static HRESULT WINAPI HTMLTable_get_readyState(IHTMLTable *iface, BSTR *p)
683 HTMLTable *This = impl_from_IHTMLTable(iface);
684 FIXME("(%p)->(%p)\n", This, p);
685 return E_NOTIMPL;
688 static HRESULT WINAPI HTMLTable_put_onreadystatechange(IHTMLTable *iface, VARIANT v)
690 HTMLTable *This = impl_from_IHTMLTable(iface);
691 FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
692 return E_NOTIMPL;
695 static HRESULT WINAPI HTMLTable_get_onreadystatechange(IHTMLTable *iface, VARIANT *p)
697 HTMLTable *This = impl_from_IHTMLTable(iface);
698 FIXME("(%p)->(%p)\n", This, p);
699 return E_NOTIMPL;
702 static const IHTMLTableVtbl HTMLTableVtbl = {
703 HTMLTable_QueryInterface,
704 HTMLTable_AddRef,
705 HTMLTable_Release,
706 HTMLTable_GetTypeInfoCount,
707 HTMLTable_GetTypeInfo,
708 HTMLTable_GetIDsOfNames,
709 HTMLTable_Invoke,
710 HTMLTable_put_cols,
711 HTMLTable_get_cols,
712 HTMLTable_put_border,
713 HTMLTable_get_border,
714 HTMLTable_put_frame,
715 HTMLTable_get_frame,
716 HTMLTable_put_rules,
717 HTMLTable_get_rules,
718 HTMLTable_put_cellSpacing,
719 HTMLTable_get_cellSpacing,
720 HTMLTable_put_cellPadding,
721 HTMLTable_get_cellPadding,
722 HTMLTable_put_background,
723 HTMLTable_get_background,
724 HTMLTable_put_bgColor,
725 HTMLTable_get_bgColor,
726 HTMLTable_put_borderColor,
727 HTMLTable_get_borderColor,
728 HTMLTable_put_borderColorLight,
729 HTMLTable_get_borderColorLight,
730 HTMLTable_put_borderColorDark,
731 HTMLTable_get_borderColorDark,
732 HTMLTable_put_align,
733 HTMLTable_get_align,
734 HTMLTable_refresh,
735 HTMLTable_get_rows,
736 HTMLTable_put_width,
737 HTMLTable_get_width,
738 HTMLTable_put_height,
739 HTMLTable_get_height,
740 HTMLTable_put_dataPageSize,
741 HTMLTable_get_dataPageSize,
742 HTMLTable_nextPage,
743 HTMLTable_previousPage,
744 HTMLTable_get_tHead,
745 HTMLTable_get_tFoot,
746 HTMLTable_get_tBodies,
747 HTMLTable_get_caption,
748 HTMLTable_createTHead,
749 HTMLTable_deleteTHead,
750 HTMLTable_createTFoot,
751 HTMLTable_deleteTFoot,
752 HTMLTable_createCaption,
753 HTMLTable_deleteCaption,
754 HTMLTable_insertRow,
755 HTMLTable_deleteRow,
756 HTMLTable_get_readyState,
757 HTMLTable_put_onreadystatechange,
758 HTMLTable_get_onreadystatechange
761 /* IHTMLTable2 */
762 static HRESULT WINAPI HTMLTable2_QueryInterface(IHTMLTable2 *iface,
763 REFIID riid, void **ppv)
765 HTMLTable *This = impl_from_IHTMLTable2(iface);
767 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
770 static ULONG WINAPI HTMLTable2_AddRef(IHTMLTable2 *iface)
772 HTMLTable *This = impl_from_IHTMLTable2(iface);
774 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
777 static ULONG WINAPI HTMLTable2_Release(IHTMLTable2 *iface)
779 HTMLTable *This = impl_from_IHTMLTable2(iface);
781 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
784 static HRESULT WINAPI HTMLTable2_GetTypeInfoCount(IHTMLTable2 *iface, UINT *pctinfo)
786 HTMLTable *This = impl_from_IHTMLTable2(iface);
787 return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo);
790 static HRESULT WINAPI HTMLTable2_GetTypeInfo(IHTMLTable2 *iface, UINT iTInfo,
791 LCID lcid, ITypeInfo **ppTInfo)
793 HTMLTable *This = impl_from_IHTMLTable2(iface);
794 return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid,
795 ppTInfo);
798 static HRESULT WINAPI HTMLTable2_GetIDsOfNames(IHTMLTable2 *iface, REFIID riid,
799 LPOLESTR *rgszNames, UINT cNames,
800 LCID lcid, DISPID *rgDispId)
802 HTMLTable *This = impl_from_IHTMLTable2(iface);
803 return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames,
804 cNames, lcid, rgDispId);
807 static HRESULT WINAPI HTMLTable2_Invoke(IHTMLTable2 *iface, DISPID dispIdMember,
808 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
809 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
811 HTMLTable *This = impl_from_IHTMLTable2(iface);
812 return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid,
813 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
816 static HRESULT WINAPI HTMLTable2_firstPage(IHTMLTable2 *iface)
818 HTMLTable *This = impl_from_IHTMLTable2(iface);
819 FIXME("(%p)->()\n", This);
820 return E_NOTIMPL;
823 static HRESULT WINAPI HTMLTable2_lastPage(IHTMLTable2 *iface)
825 HTMLTable *This = impl_from_IHTMLTable2(iface);
826 FIXME("(%p)->()\n", This);
827 return E_NOTIMPL;
830 static HRESULT WINAPI HTMLTable2_cells(IHTMLTable2 *iface, IHTMLElementCollection **p)
832 HTMLTable *This = impl_from_IHTMLTable2(iface);
833 FIXME("(%p)->(%p)\n", This, p);
834 return E_NOTIMPL;
837 static HRESULT WINAPI HTMLTable2_moveRow(IHTMLTable2 *iface, LONG indexFrom, LONG indexTo, IDispatch **row)
839 HTMLTable *This = impl_from_IHTMLTable2(iface);
840 FIXME("(%p)->(%d %d %p)\n", This, indexFrom, indexTo, row);
841 return E_NOTIMPL;
845 static const IHTMLTable2Vtbl HTMLTable2Vtbl = {
846 HTMLTable2_QueryInterface,
847 HTMLTable2_AddRef,
848 HTMLTable2_Release,
849 HTMLTable2_GetTypeInfoCount,
850 HTMLTable2_GetTypeInfo,
851 HTMLTable2_GetIDsOfNames,
852 HTMLTable2_Invoke,
853 HTMLTable2_firstPage,
854 HTMLTable2_lastPage,
855 HTMLTable2_cells,
856 HTMLTable2_moveRow
859 /* IHTMLTable3 */
860 static HRESULT WINAPI HTMLTable3_QueryInterface(IHTMLTable3 *iface,
861 REFIID riid, void **ppv)
863 HTMLTable *This = impl_from_IHTMLTable3(iface);
865 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
868 static ULONG WINAPI HTMLTable3_AddRef(IHTMLTable3 *iface)
870 HTMLTable *This = impl_from_IHTMLTable3(iface);
872 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
875 static ULONG WINAPI HTMLTable3_Release(IHTMLTable3 *iface)
877 HTMLTable *This = impl_from_IHTMLTable3(iface);
879 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
882 static HRESULT WINAPI HTMLTable3_GetTypeInfoCount(IHTMLTable3 *iface, UINT *pctinfo)
884 HTMLTable *This = impl_from_IHTMLTable3(iface);
885 return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo);
888 static HRESULT WINAPI HTMLTable3_GetTypeInfo(IHTMLTable3 *iface, UINT iTInfo,
889 LCID lcid, ITypeInfo **ppTInfo)
891 HTMLTable *This = impl_from_IHTMLTable3(iface);
892 return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid,
893 ppTInfo);
896 static HRESULT WINAPI HTMLTable3_GetIDsOfNames(IHTMLTable3 *iface, REFIID riid,
897 LPOLESTR *rgszNames, UINT cNames,
898 LCID lcid, DISPID *rgDispId)
900 HTMLTable *This = impl_from_IHTMLTable3(iface);
901 return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames,
902 cNames, lcid, rgDispId);
905 static HRESULT WINAPI HTMLTable3_Invoke(IHTMLTable3 *iface, DISPID dispIdMember,
906 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
907 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
909 HTMLTable *This = impl_from_IHTMLTable3(iface);
910 return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid,
911 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
914 static HRESULT WINAPI HTMLTable3_put_summary(IHTMLTable3 *iface, BSTR v)
916 HTMLTable *This = impl_from_IHTMLTable3(iface);
917 nsAString str;
918 nsresult nsres;
920 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
922 nsAString_InitDepend(&str, v);
924 nsres = nsIDOMHTMLTableElement_SetSummary(This->nstable, &str);
926 nsAString_Finish(&str);
927 if (NS_FAILED(nsres)) {
928 ERR("Set summary(%s) failed: %08x\n", debugstr_w(v), nsres);
929 return E_FAIL;
931 return S_OK;
934 static HRESULT WINAPI HTMLTable3_get_summary(IHTMLTable3 *iface, BSTR * p)
936 HTMLTable *This = impl_from_IHTMLTable3(iface);
937 nsAString str;
938 nsresult nsres;
940 TRACE("(%p)->(%p)\n", This, p);
942 nsAString_Init(&str, NULL);
943 nsres = nsIDOMHTMLTableElement_GetSummary(This->nstable, &str);
945 return return_nsstr(nsres, &str, p);
948 static const IHTMLTable3Vtbl HTMLTable3Vtbl = {
949 HTMLTable3_QueryInterface,
950 HTMLTable3_AddRef,
951 HTMLTable3_Release,
952 HTMLTable3_GetTypeInfoCount,
953 HTMLTable3_GetTypeInfo,
954 HTMLTable3_GetIDsOfNames,
955 HTMLTable3_Invoke,
956 HTMLTable3_put_summary,
957 HTMLTable3_get_summary
960 static inline HTMLTable *impl_from_HTMLDOMNode(HTMLDOMNode *iface)
962 return CONTAINING_RECORD(iface, HTMLTable, element.node);
965 static HRESULT HTMLTable_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
967 HTMLTable *This = impl_from_HTMLDOMNode(iface);
969 *ppv = NULL;
971 if(IsEqualGUID(&IID_IUnknown, riid)) {
972 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
973 *ppv = &This->IHTMLTable_iface;
974 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
975 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
976 *ppv = &This->IHTMLTable_iface;
977 }else if(IsEqualGUID(&IID_IHTMLTable, riid)) {
978 TRACE("(%p)->(IID_IHTMLTable %p)\n", This, ppv);
979 *ppv = &This->IHTMLTable_iface;
980 }else if(IsEqualGUID(&IID_IHTMLTable2, riid)) {
981 TRACE("(%p)->(IID_IHTMLTable2 %p)\n", This, ppv);
982 *ppv = &This->IHTMLTable2_iface;
983 }else if(IsEqualGUID(&IID_IHTMLTable3, riid)) {
984 TRACE("(%p)->(IID_IHTMLTable3 %p)\n", This, ppv);
985 *ppv = &This->IHTMLTable3_iface;
988 if(*ppv) {
989 IUnknown_AddRef((IUnknown*)*ppv);
990 return S_OK;
993 return HTMLElement_QI(&This->element.node, riid, ppv);
996 static void HTMLTable_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb)
998 HTMLTable *This = impl_from_HTMLDOMNode(iface);
1000 if(This->nstable)
1001 note_cc_edge((nsISupports*)This->nstable, "This->nstable", cb);
1004 static void HTMLTable_unlink(HTMLDOMNode *iface)
1006 HTMLTable *This = impl_from_HTMLDOMNode(iface);
1008 if(This->nstable) {
1009 nsIDOMHTMLTableElement *nstable = This->nstable;
1011 This->nstable = NULL;
1012 nsIDOMHTMLTableElement_Release(nstable);
1016 static const cpc_entry_t HTMLTable_cpc[] = {
1017 {&DIID_HTMLTableEvents},
1018 HTMLELEMENT_CPC,
1019 {NULL}
1022 static const NodeImplVtbl HTMLTableImplVtbl = {
1023 HTMLTable_QI,
1024 HTMLElement_destructor,
1025 HTMLTable_cpc,
1026 HTMLElement_clone,
1027 HTMLElement_handle_event,
1028 HTMLElement_get_attr_col,
1029 NULL,
1030 NULL,
1031 NULL,
1032 NULL,
1033 NULL,
1034 NULL,
1035 NULL,
1036 NULL,
1037 NULL,
1038 HTMLTable_traverse,
1039 HTMLTable_unlink
1042 static const tid_t HTMLTable_iface_tids[] = {
1043 HTMLELEMENT_TIDS,
1044 IHTMLTable_tid,
1045 IHTMLTable2_tid,
1046 IHTMLTable3_tid,
1050 static dispex_static_data_t HTMLTable_dispex = {
1051 NULL,
1052 DispHTMLTable_tid,
1053 NULL,
1054 HTMLTable_iface_tids
1057 HRESULT HTMLTable_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
1059 HTMLTable *ret;
1060 nsresult nsres;
1062 ret = heap_alloc_zero(sizeof(HTMLTable));
1063 if(!ret)
1064 return E_OUTOFMEMORY;
1066 ret->element.node.vtbl = &HTMLTableImplVtbl;
1067 ret->IHTMLTable_iface.lpVtbl = &HTMLTableVtbl;
1068 ret->IHTMLTable2_iface.lpVtbl = &HTMLTable2Vtbl;
1069 ret->IHTMLTable3_iface.lpVtbl = &HTMLTable3Vtbl;
1071 HTMLElement_Init(&ret->element, doc, nselem, &HTMLTable_dispex);
1073 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLTableElement, (void**)&ret->nstable);
1074 assert(nsres == NS_OK);
1076 *elem = &ret->element;
1077 return S_OK;