jscript: Added Date.setYear implementation.
[wine] / dlls / mshtml / htmltablerow.c
1 /*
2  * Copyright 2008 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include <stdarg.h>
20
21 #define COBJMACROS
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "ole2.h"
27
28 #include "wine/debug.h"
29
30 #include "mshtml_private.h"
31
32 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
33
34 typedef struct {
35     HTMLElement element;
36
37     IHTMLTableRow IHTMLTableRow_iface;
38
39     nsIDOMHTMLTableRowElement *nsrow;
40 } HTMLTableRow;
41
42 static inline HTMLTableRow *impl_from_IHTMLTableRow(IHTMLTableRow *iface)
43 {
44     return CONTAINING_RECORD(iface, HTMLTableRow, IHTMLTableRow_iface);
45 }
46
47 static HRESULT WINAPI HTMLTableRow_QueryInterface(IHTMLTableRow *iface,
48         REFIID riid, void **ppv)
49 {
50     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
51
52     return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv);
53 }
54
55 static ULONG WINAPI HTMLTableRow_AddRef(IHTMLTableRow *iface)
56 {
57     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
58
59     return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
60 }
61
62 static ULONG WINAPI HTMLTableRow_Release(IHTMLTableRow *iface)
63 {
64     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
65
66     return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
67 }
68
69 static HRESULT WINAPI HTMLTableRow_GetTypeInfoCount(IHTMLTableRow *iface, UINT *pctinfo)
70 {
71     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
72     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->element.node.dispex), pctinfo);
73 }
74
75 static HRESULT WINAPI HTMLTableRow_GetTypeInfo(IHTMLTableRow *iface, UINT iTInfo,
76                                               LCID lcid, ITypeInfo **ppTInfo)
77 {
78     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
79     return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->element.node.dispex), iTInfo, lcid, ppTInfo);
80 }
81
82 static HRESULT WINAPI HTMLTableRow_GetIDsOfNames(IHTMLTableRow *iface, REFIID riid,
83                                                 LPOLESTR *rgszNames, UINT cNames,
84                                                 LCID lcid, DISPID *rgDispId)
85 {
86     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
87     return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->element.node.dispex), riid, rgszNames, cNames, lcid, rgDispId);
88 }
89
90 static HRESULT WINAPI HTMLTableRow_Invoke(IHTMLTableRow *iface, DISPID dispIdMember,
91                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
92                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
93 {
94     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
95     return IDispatchEx_Invoke(DISPATCHEX(&This->element.node.dispex), dispIdMember, riid, lcid, wFlags, pDispParams,
96             pVarResult, pExcepInfo, puArgErr);
97 }
98
99 static HRESULT WINAPI HTMLTableRow_put_align(IHTMLTableRow *iface, BSTR v)
100 {
101     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
102     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
103     return E_NOTIMPL;
104 }
105
106 static HRESULT WINAPI HTMLTableRow_get_align(IHTMLTableRow *iface, BSTR *p)
107 {
108     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
109     FIXME("(%p)->(%p)\n", This, p);
110     return E_NOTIMPL;
111 }
112
113 static HRESULT WINAPI HTMLTableRow_put_vAlign(IHTMLTableRow *iface, BSTR v)
114 {
115     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
116     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
117     return E_NOTIMPL;
118 }
119
120 static HRESULT WINAPI HTMLTableRow_get_vAlign(IHTMLTableRow *iface, BSTR *p)
121 {
122     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
123     FIXME("(%p)->(%p)\n", This, p);
124     return E_NOTIMPL;
125 }
126
127 static HRESULT WINAPI HTMLTableRow_put_bgColor(IHTMLTableRow *iface, VARIANT v)
128 {
129     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
130     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
131     return E_NOTIMPL;
132 }
133
134 static HRESULT WINAPI HTMLTableRow_get_bgColor(IHTMLTableRow *iface, VARIANT *p)
135 {
136     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
137     FIXME("(%p)->(%p)\n", This, p);
138     return E_NOTIMPL;
139 }
140
141 static HRESULT WINAPI HTMLTableRow_put_borderColor(IHTMLTableRow *iface, VARIANT v)
142 {
143     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
144     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
145     return E_NOTIMPL;
146 }
147
148 static HRESULT WINAPI HTMLTableRow_get_borderColor(IHTMLTableRow *iface, VARIANT *p)
149 {
150     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
151     FIXME("(%p)->(%p)\n", This, p);
152     return E_NOTIMPL;
153 }
154
155 static HRESULT WINAPI HTMLTableRow_put_borderColorLight(IHTMLTableRow *iface, VARIANT v)
156 {
157     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
158     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
159     return E_NOTIMPL;
160 }
161
162 static HRESULT WINAPI HTMLTableRow_get_borderColorLight(IHTMLTableRow *iface, VARIANT *p)
163 {
164     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
165     FIXME("(%p)->(%p)\n", This, p);
166     return E_NOTIMPL;
167 }
168
169 static HRESULT WINAPI HTMLTableRow_put_borderColorDark(IHTMLTableRow *iface, VARIANT v)
170 {
171     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
172     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
173     return E_NOTIMPL;
174 }
175
176 static HRESULT WINAPI HTMLTableRow_get_borderColorDark(IHTMLTableRow *iface, VARIANT *p)
177 {
178     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
179     FIXME("(%p)->(%p)\n", This, p);
180     return E_NOTIMPL;
181 }
182
183 static HRESULT WINAPI HTMLTableRow_get_rowIndex(IHTMLTableRow *iface, LONG *p)
184 {
185     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
186     FIXME("(%p)->(%p)\n", This, p);
187     return E_NOTIMPL;
188 }
189
190 static HRESULT WINAPI HTMLTableRow_get_selectionRowIndex(IHTMLTableRow *iface, LONG *p)
191 {
192     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
193     FIXME("(%p)->(%p)\n", This, p);
194     return E_NOTIMPL;
195 }
196
197 static HRESULT WINAPI HTMLTableRow_get_cells(IHTMLTableRow *iface, IHTMLElementCollection **p)
198 {
199     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
200     nsIDOMHTMLCollection *nscol;
201     nsresult nsres;
202
203     TRACE("(%p)->(%p)\n", This, p);
204
205     nsres = nsIDOMHTMLTableRowElement_GetCells(This->nsrow, &nscol);
206     if(NS_FAILED(nsres)) {
207         ERR("GetCells failed: %08x\n", nsres);
208         return E_FAIL;
209     }
210
211     *p = create_collection_from_htmlcol(This->element.node.doc, (IUnknown*)&This->IHTMLTableRow_iface, nscol);
212
213     nsIDOMHTMLCollection_Release(nscol);
214     return S_OK;
215 }
216
217 static HRESULT WINAPI HTMLTableRow_insertCell(IHTMLTableRow *iface, LONG index, IDispatch **row)
218 {
219     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
220     FIXME("(%p)->(%d %p)\n", This, index, row);
221     return E_NOTIMPL;
222 }
223
224 static HRESULT WINAPI HTMLTableRow_deleteCell(IHTMLTableRow *iface, LONG index)
225 {
226     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
227     FIXME("(%p)->(%d)\n", This, index);
228     return E_NOTIMPL;
229 }
230
231 static const IHTMLTableRowVtbl HTMLTableRowVtbl = {
232     HTMLTableRow_QueryInterface,
233     HTMLTableRow_AddRef,
234     HTMLTableRow_Release,
235     HTMLTableRow_GetTypeInfoCount,
236     HTMLTableRow_GetTypeInfo,
237     HTMLTableRow_GetIDsOfNames,
238     HTMLTableRow_Invoke,
239     HTMLTableRow_put_align,
240     HTMLTableRow_get_align,
241     HTMLTableRow_put_vAlign,
242     HTMLTableRow_get_vAlign,
243     HTMLTableRow_put_bgColor,
244     HTMLTableRow_get_bgColor,
245     HTMLTableRow_put_borderColor,
246     HTMLTableRow_get_borderColor,
247     HTMLTableRow_put_borderColorLight,
248     HTMLTableRow_get_borderColorLight,
249     HTMLTableRow_put_borderColorDark,
250     HTMLTableRow_get_borderColorDark,
251     HTMLTableRow_get_rowIndex,
252     HTMLTableRow_get_selectionRowIndex,
253     HTMLTableRow_get_cells,
254     HTMLTableRow_insertCell,
255     HTMLTableRow_deleteCell
256 };
257
258 #define HTMLTABLEROW_NODE_THIS(iface) DEFINE_THIS2(HTMLTableRow, element.node, iface)
259
260 static HRESULT HTMLTableRow_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
261 {
262     HTMLTableRow *This = HTMLTABLEROW_NODE_THIS(iface);
263
264     *ppv = NULL;
265
266     if(IsEqualGUID(&IID_IUnknown, riid)) {
267         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
268         *ppv = &This->IHTMLTableRow_iface;
269     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
270         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
271         *ppv = &This->IHTMLTableRow_iface;
272     }else if(IsEqualGUID(&IID_IHTMLTableRow, riid)) {
273         TRACE("(%p)->(IID_IHTMLTableRow %p)\n", This, ppv);
274         *ppv = &This->IHTMLTableRow_iface;
275     }
276
277     if(*ppv) {
278         IUnknown_AddRef((IUnknown*)*ppv);
279         return S_OK;
280     }
281
282     return HTMLElement_QI(&This->element.node, riid, ppv);
283 }
284
285 static void HTMLTableRow_destructor(HTMLDOMNode *iface)
286 {
287     HTMLTableRow *This = HTMLTABLEROW_NODE_THIS(iface);
288
289     if(This->nsrow)
290         nsIDOMHTMLTableRowElement_Release(This->nsrow);
291
292     HTMLElement_destructor(&This->element.node);
293 }
294
295 #undef HTMLTABLEROW_NODE_THIS
296
297 static const NodeImplVtbl HTMLTableRowImplVtbl = {
298     HTMLTableRow_QI,
299     HTMLTableRow_destructor,
300     HTMLElement_clone
301 };
302
303 static const tid_t HTMLTableRow_iface_tids[] = {
304     HTMLELEMENT_TIDS,
305     IHTMLTableRow_tid,
306     0
307 };
308
309 static dispex_static_data_t HTMLTableRow_dispex = {
310     NULL,
311     DispHTMLTableRow_tid,
312     NULL,
313     HTMLTableRow_iface_tids
314 };
315
316 HRESULT HTMLTableRow_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
317 {
318     HTMLTableRow *ret;
319     nsresult nsres;
320
321     ret = heap_alloc_zero(sizeof(HTMLTableRow));
322     if(!ret)
323         return E_OUTOFMEMORY;
324
325     ret->IHTMLTableRow_iface.lpVtbl = &HTMLTableRowVtbl;
326     ret->element.node.vtbl = &HTMLTableRowImplVtbl;
327
328     nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLTableRowElement, (void**)&ret->nsrow);
329     if(NS_FAILED(nsres)) {
330         ERR("Could not get nsIDOMHTMLTableRowElement iface: %08x\n", nsres);
331         heap_free(ret);
332         return E_OUTOFMEMORY;
333     }
334
335     HTMLElement_Init(&ret->element, doc, nselem, &HTMLTableRow_dispex);
336
337     *elem = &ret->element;
338     return S_OK;
339 }