|  | /* | 
|  | * Copyright 2007 Jacek Caban for CodeWeavers | 
|  | * | 
|  | * This library is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU Lesser General Public | 
|  | * License as published by the Free Software Foundation; either | 
|  | * version 2.1 of the License, or (at your option) any later version. | 
|  | * | 
|  | * This library is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | * Lesser General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU Lesser General Public | 
|  | * License along with this library; if not, write to the Free Software | 
|  | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | 
|  | */ | 
|  |  | 
|  | #include <stdarg.h> | 
|  |  | 
|  | #define COBJMACROS | 
|  |  | 
|  | #include "windef.h" | 
|  | #include "winbase.h" | 
|  | #include "winuser.h" | 
|  | #include "ole2.h" | 
|  |  | 
|  | #include "wine/debug.h" | 
|  |  | 
|  | #include "mshtml_private.h" | 
|  |  | 
|  | WINE_DEFAULT_DEBUG_CHANNEL(mshtml); | 
|  |  | 
|  | struct HTMLTable { | 
|  | HTMLElement element; | 
|  |  | 
|  | IHTMLTable  IHTMLTable_iface; | 
|  | IHTMLTable2 IHTMLTable2_iface; | 
|  | IHTMLTable3 IHTMLTable3_iface; | 
|  |  | 
|  | ConnectionPoint cp; | 
|  | nsIDOMHTMLTableElement *nstable; | 
|  | }; | 
|  |  | 
|  | static inline HTMLTable *impl_from_IHTMLTable(IHTMLTable *iface) | 
|  | { | 
|  | return CONTAINING_RECORD(iface, HTMLTable, IHTMLTable_iface); | 
|  | } | 
|  |  | 
|  | static inline HTMLTable *impl_from_IHTMLTable2(IHTMLTable2 *iface) | 
|  | { | 
|  | return CONTAINING_RECORD(iface, HTMLTable, IHTMLTable2_iface); | 
|  | } | 
|  |  | 
|  | static inline HTMLTable *impl_from_IHTMLTable3(IHTMLTable3 *iface) | 
|  | { | 
|  | return CONTAINING_RECORD(iface, HTMLTable, IHTMLTable3_iface); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_QueryInterface(IHTMLTable *iface, | 
|  | REFIID riid, void **ppv) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  |  | 
|  | return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv); | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI HTMLTable_AddRef(IHTMLTable *iface) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  |  | 
|  | return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface); | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI HTMLTable_Release(IHTMLTable *iface) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  |  | 
|  | return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_GetTypeInfoCount(IHTMLTable *iface, UINT *pctinfo) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_GetTypeInfo(IHTMLTable *iface, UINT iTInfo, | 
|  | LCID lcid, ITypeInfo **ppTInfo) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid, | 
|  | ppTInfo); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_GetIDsOfNames(IHTMLTable *iface, REFIID riid, | 
|  | LPOLESTR *rgszNames, UINT cNames, | 
|  | LCID lcid, DISPID *rgDispId) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames, | 
|  | cNames, lcid, rgDispId); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_Invoke(IHTMLTable *iface, DISPID dispIdMember, | 
|  | REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, | 
|  | VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid, | 
|  | lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_cols(IHTMLTable *iface, LONG v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%d)\n", This, v); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_cols(IHTMLTable *iface, LONG *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_border(IHTMLTable *iface, VARIANT v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(v)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_border(IHTMLTable *iface, VARIANT *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_frame(IHTMLTable *iface, BSTR v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%s)\n", This, debugstr_w(v)); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_frame(IHTMLTable *iface, BSTR *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_rules(IHTMLTable *iface, BSTR v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%s)\n", This, debugstr_w(v)); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_rules(IHTMLTable *iface, BSTR *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_cellSpacing(IHTMLTable *iface, VARIANT v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(v)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_cellSpacing(IHTMLTable *iface, VARIANT *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_cellPadding(IHTMLTable *iface, VARIANT v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(v)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_cellPadding(IHTMLTable *iface, VARIANT *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_background(IHTMLTable *iface, BSTR v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%s)\n", This, debugstr_w(v)); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_background(IHTMLTable *iface, BSTR *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_bgColor(IHTMLTable *iface, VARIANT v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(v)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_bgColor(IHTMLTable *iface, VARIANT *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_borderColor(IHTMLTable *iface, VARIANT v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(v)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_borderColor(IHTMLTable *iface, VARIANT *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_borderColorLight(IHTMLTable *iface, VARIANT v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(v)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_borderColorLight(IHTMLTable *iface, VARIANT *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_borderColorDark(IHTMLTable *iface, VARIANT v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(v)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_borderColorDark(IHTMLTable *iface, VARIANT *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_align(IHTMLTable *iface, BSTR v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%s)\n", This, debugstr_w(v)); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_align(IHTMLTable *iface, BSTR *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_refresh(IHTMLTable *iface) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_rows(IHTMLTable *iface, IHTMLElementCollection **p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | nsIDOMHTMLCollection *nscol; | 
|  | nsresult nsres; | 
|  |  | 
|  | TRACE("(%p)->(%p)\n", This, p); | 
|  |  | 
|  | nsres = nsIDOMHTMLTableElement_GetRows(This->nstable, &nscol); | 
|  | if(NS_FAILED(nsres)) { | 
|  | ERR("GetRows failed: %08x\n", nsres); | 
|  | return E_FAIL; | 
|  | } | 
|  |  | 
|  | *p = create_collection_from_htmlcol(This->element.node.doc, (IUnknown*)&This->IHTMLTable_iface, | 
|  | nscol); | 
|  |  | 
|  | nsIDOMHTMLCollection_Release(nscol); | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_width(IHTMLTable *iface, VARIANT v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(v)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_width(IHTMLTable *iface, VARIANT *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_height(IHTMLTable *iface, VARIANT v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(v)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_height(IHTMLTable *iface, VARIANT *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_dataPageSize(IHTMLTable *iface, LONG v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%d)\n", This, v); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_dataPageSize(IHTMLTable *iface, LONG *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_nextPage(IHTMLTable *iface) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_previousPage(IHTMLTable *iface) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_tHead(IHTMLTable *iface, IHTMLTableSection **p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_tFoot(IHTMLTable *iface, IHTMLTableSection **p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_tBodies(IHTMLTable *iface, IHTMLElementCollection **p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_caption(IHTMLTable *iface, IHTMLTableCaption **p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_createTHead(IHTMLTable *iface, IDispatch **head) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, head); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_deleteTHead(IHTMLTable *iface) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_createTFoot(IHTMLTable *iface, IDispatch **foot) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, foot); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_deleteTFoot(IHTMLTable *iface) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_createCaption(IHTMLTable *iface, IHTMLTableCaption **caption) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, caption); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_deleteCaption(IHTMLTable *iface) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_insertRow(IHTMLTable *iface, LONG index, IDispatch **row) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%d %p)\n", This, index, row); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_deleteRow(IHTMLTable *iface, LONG index) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%d)\n", This, index); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_readyState(IHTMLTable *iface, BSTR *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_put_onreadystatechange(IHTMLTable *iface, VARIANT v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(v)\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable_get_onreadystatechange(IHTMLTable *iface, VARIANT *p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static const IHTMLTableVtbl HTMLTableVtbl = { | 
|  | HTMLTable_QueryInterface, | 
|  | HTMLTable_AddRef, | 
|  | HTMLTable_Release, | 
|  | HTMLTable_GetTypeInfoCount, | 
|  | HTMLTable_GetTypeInfo, | 
|  | HTMLTable_GetIDsOfNames, | 
|  | HTMLTable_Invoke, | 
|  | HTMLTable_put_cols, | 
|  | HTMLTable_get_cols, | 
|  | HTMLTable_put_border, | 
|  | HTMLTable_get_border, | 
|  | HTMLTable_put_frame, | 
|  | HTMLTable_get_frame, | 
|  | HTMLTable_put_rules, | 
|  | HTMLTable_get_rules, | 
|  | HTMLTable_put_cellSpacing, | 
|  | HTMLTable_get_cellSpacing, | 
|  | HTMLTable_put_cellPadding, | 
|  | HTMLTable_get_cellPadding, | 
|  | HTMLTable_put_background, | 
|  | HTMLTable_get_background, | 
|  | HTMLTable_put_bgColor, | 
|  | HTMLTable_get_bgColor, | 
|  | HTMLTable_put_borderColor, | 
|  | HTMLTable_get_borderColor, | 
|  | HTMLTable_put_borderColorLight, | 
|  | HTMLTable_get_borderColorLight, | 
|  | HTMLTable_put_borderColorDark, | 
|  | HTMLTable_get_borderColorDark, | 
|  | HTMLTable_put_align, | 
|  | HTMLTable_get_align, | 
|  | HTMLTable_refresh, | 
|  | HTMLTable_get_rows, | 
|  | HTMLTable_put_width, | 
|  | HTMLTable_get_width, | 
|  | HTMLTable_put_height, | 
|  | HTMLTable_get_height, | 
|  | HTMLTable_put_dataPageSize, | 
|  | HTMLTable_get_dataPageSize, | 
|  | HTMLTable_nextPage, | 
|  | HTMLTable_previousPage, | 
|  | HTMLTable_get_tHead, | 
|  | HTMLTable_get_tFoot, | 
|  | HTMLTable_get_tBodies, | 
|  | HTMLTable_get_caption, | 
|  | HTMLTable_createTHead, | 
|  | HTMLTable_deleteTHead, | 
|  | HTMLTable_createTFoot, | 
|  | HTMLTable_deleteTFoot, | 
|  | HTMLTable_createCaption, | 
|  | HTMLTable_deleteCaption, | 
|  | HTMLTable_insertRow, | 
|  | HTMLTable_deleteRow, | 
|  | HTMLTable_get_readyState, | 
|  | HTMLTable_put_onreadystatechange, | 
|  | HTMLTable_get_onreadystatechange | 
|  | }; | 
|  |  | 
|  | /* IHTMLTable2 */ | 
|  | static HRESULT WINAPI HTMLTable2_QueryInterface(IHTMLTable2 *iface, | 
|  | REFIID riid, void **ppv) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable2(iface); | 
|  |  | 
|  | return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv); | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI HTMLTable2_AddRef(IHTMLTable2 *iface) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable2(iface); | 
|  |  | 
|  | return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface); | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI HTMLTable2_Release(IHTMLTable2 *iface) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable2(iface); | 
|  |  | 
|  | return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable2_GetTypeInfoCount(IHTMLTable2 *iface, UINT *pctinfo) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable2(iface); | 
|  | return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable2_GetTypeInfo(IHTMLTable2 *iface, UINT iTInfo, | 
|  | LCID lcid, ITypeInfo **ppTInfo) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable2(iface); | 
|  | return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid, | 
|  | ppTInfo); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable2_GetIDsOfNames(IHTMLTable2 *iface, REFIID riid, | 
|  | LPOLESTR *rgszNames, UINT cNames, | 
|  | LCID lcid, DISPID *rgDispId) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable2(iface); | 
|  | return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames, | 
|  | cNames, lcid, rgDispId); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable2_Invoke(IHTMLTable2 *iface, DISPID dispIdMember, | 
|  | REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, | 
|  | VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable2(iface); | 
|  | return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid, | 
|  | lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable2_firstPage(IHTMLTable2 *iface) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable2(iface); | 
|  | FIXME("(%p)->()\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable2_lastPage(IHTMLTable2 *iface) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable2(iface); | 
|  | FIXME("(%p)->()\n", This); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable2_cells(IHTMLTable2 *iface, IHTMLElementCollection **p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable2(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable2_moveRow(IHTMLTable2 *iface, LONG indexFrom, LONG indexTo, IDispatch **row) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable2(iface); | 
|  | FIXME("(%p)->(%d %d %p)\n", This, indexFrom, indexTo, row); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  |  | 
|  | static const IHTMLTable2Vtbl HTMLTable2Vtbl = { | 
|  | HTMLTable2_QueryInterface, | 
|  | HTMLTable2_AddRef, | 
|  | HTMLTable2_Release, | 
|  | HTMLTable2_GetTypeInfoCount, | 
|  | HTMLTable2_GetTypeInfo, | 
|  | HTMLTable2_GetIDsOfNames, | 
|  | HTMLTable2_Invoke, | 
|  | HTMLTable2_firstPage, | 
|  | HTMLTable2_lastPage, | 
|  | HTMLTable2_cells, | 
|  | HTMLTable2_moveRow | 
|  | }; | 
|  |  | 
|  | /* IHTMLTable3 */ | 
|  | static HRESULT WINAPI HTMLTable3_QueryInterface(IHTMLTable3 *iface, | 
|  | REFIID riid, void **ppv) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable3(iface); | 
|  |  | 
|  | return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv); | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI HTMLTable3_AddRef(IHTMLTable3 *iface) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable3(iface); | 
|  |  | 
|  | return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface); | 
|  | } | 
|  |  | 
|  | static ULONG WINAPI HTMLTable3_Release(IHTMLTable3 *iface) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable3(iface); | 
|  |  | 
|  | return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable3_GetTypeInfoCount(IHTMLTable3 *iface, UINT *pctinfo) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable3(iface); | 
|  | return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable3_GetTypeInfo(IHTMLTable3 *iface, UINT iTInfo, | 
|  | LCID lcid, ITypeInfo **ppTInfo) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable3(iface); | 
|  | return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid, | 
|  | ppTInfo); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable3_GetIDsOfNames(IHTMLTable3 *iface, REFIID riid, | 
|  | LPOLESTR *rgszNames, UINT cNames, | 
|  | LCID lcid, DISPID *rgDispId) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable3(iface); | 
|  | return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames, | 
|  | cNames, lcid, rgDispId); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable3_Invoke(IHTMLTable3 *iface, DISPID dispIdMember, | 
|  | REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, | 
|  | VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable3(iface); | 
|  | return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid, | 
|  | lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable3_put_summary(IHTMLTable3 *iface, BSTR v) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable3(iface); | 
|  | FIXME("(%p)->(%s)\n", This, debugstr_w(v)); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static HRESULT WINAPI HTMLTable3_get_summary(IHTMLTable3 *iface, BSTR * p) | 
|  | { | 
|  | HTMLTable *This = impl_from_IHTMLTable3(iface); | 
|  | FIXME("(%p)->(%p)\n", This, p); | 
|  | return E_NOTIMPL; | 
|  | } | 
|  |  | 
|  | static const IHTMLTable3Vtbl HTMLTable3Vtbl = { | 
|  | HTMLTable3_QueryInterface, | 
|  | HTMLTable3_AddRef, | 
|  | HTMLTable3_Release, | 
|  | HTMLTable3_GetTypeInfoCount, | 
|  | HTMLTable3_GetTypeInfo, | 
|  | HTMLTable3_GetIDsOfNames, | 
|  | HTMLTable3_Invoke, | 
|  | HTMLTable3_put_summary, | 
|  | HTMLTable3_get_summary | 
|  | }; | 
|  |  | 
|  | static inline HTMLTable *impl_from_HTMLDOMNode(HTMLDOMNode *iface) | 
|  | { | 
|  | return CONTAINING_RECORD(iface, HTMLTable, element.node); | 
|  | } | 
|  |  | 
|  | static HRESULT HTMLTable_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) | 
|  | { | 
|  | HTMLTable *This = impl_from_HTMLDOMNode(iface); | 
|  |  | 
|  | *ppv = NULL; | 
|  |  | 
|  | if(IsEqualGUID(&IID_IUnknown, riid)) { | 
|  | TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); | 
|  | *ppv = &This->IHTMLTable_iface; | 
|  | }else if(IsEqualGUID(&IID_IDispatch, riid)) { | 
|  | TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); | 
|  | *ppv = &This->IHTMLTable_iface; | 
|  | }else if(IsEqualGUID(&IID_IHTMLTable, riid)) { | 
|  | TRACE("(%p)->(IID_IHTMLTable %p)\n", This, ppv); | 
|  | *ppv = &This->IHTMLTable_iface; | 
|  | }else if(IsEqualGUID(&IID_IHTMLTable2, riid)) { | 
|  | TRACE("(%p)->(IID_IHTMLTable2 %p)\n", This, ppv); | 
|  | *ppv = &This->IHTMLTable_iface; | 
|  | }else if(IsEqualGUID(&IID_IHTMLTable3, riid)) { | 
|  | TRACE("(%p)->(IID_IHTMLTable3 %p)\n", This, ppv); | 
|  | *ppv = &This->IHTMLTable_iface; | 
|  | } | 
|  |  | 
|  | if(*ppv) { | 
|  | IUnknown_AddRef((IUnknown*)*ppv); | 
|  | return S_OK; | 
|  | } | 
|  |  | 
|  | return HTMLElement_QI(&This->element.node, riid, ppv); | 
|  | } | 
|  |  | 
|  | static void HTMLTable_destructor(HTMLDOMNode *iface) | 
|  | { | 
|  | HTMLTable *This = impl_from_HTMLDOMNode(iface); | 
|  |  | 
|  | if(This->nstable) | 
|  | nsIDOMHTMLTableElement_Release(This->nstable); | 
|  |  | 
|  | HTMLElement_destructor(&This->element.node); | 
|  | } | 
|  |  | 
|  | static const NodeImplVtbl HTMLTableImplVtbl = { | 
|  | HTMLTable_QI, | 
|  | HTMLTable_destructor, | 
|  | HTMLElement_clone, | 
|  | HTMLElement_get_attr_col | 
|  | }; | 
|  |  | 
|  | static const tid_t HTMLTable_iface_tids[] = { | 
|  | HTMLELEMENT_TIDS, | 
|  | IHTMLTable_tid, | 
|  | 0 | 
|  | }; | 
|  |  | 
|  | static dispex_static_data_t HTMLTable_dispex = { | 
|  | NULL, | 
|  | DispHTMLTable_tid, | 
|  | NULL, | 
|  | HTMLTable_iface_tids | 
|  | }; | 
|  |  | 
|  | HRESULT HTMLTable_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem) | 
|  | { | 
|  | HTMLTable *ret; | 
|  | nsresult nsres; | 
|  |  | 
|  | ret = heap_alloc_zero(sizeof(HTMLTable)); | 
|  | if(!ret) | 
|  | return E_OUTOFMEMORY; | 
|  |  | 
|  | ret->element.node.vtbl = &HTMLTableImplVtbl; | 
|  | ret->IHTMLTable_iface.lpVtbl = &HTMLTableVtbl; | 
|  |  | 
|  | nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLTableElement, (void**)&ret->nstable); | 
|  | if(NS_FAILED(nsres)) { | 
|  | ERR("Could not get nsIDOMHTMLTableElement iface: %08x\n", nsres); | 
|  | heap_free(ret); | 
|  | return E_FAIL; | 
|  | } | 
|  |  | 
|  | HTMLElement_Init(&ret->element, doc, nselem, &HTMLTable_dispex); | 
|  | ConnectionPoint_Init(&ret->cp, &ret->element.cp_container, &DIID_HTMLTableEvents, NULL); | 
|  |  | 
|  | *elem = &ret->element; | 
|  | return S_OK; | 
|  | } |