atl80: Added AtlComModuleRegisterServer implementation (based on AtlModuleRegisterSer...
[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 #include <assert.h>
21
22 #define COBJMACROS
23
24 #include "windef.h"
25 #include "winbase.h"
26 #include "winuser.h"
27 #include "ole2.h"
28
29 #include "wine/debug.h"
30
31 #include "mshtml_private.h"
32
33 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
34
35 typedef struct {
36     HTMLElement element;
37
38     IHTMLTableRow IHTMLTableRow_iface;
39
40     nsIDOMHTMLTableRowElement *nsrow;
41 } HTMLTableRow;
42
43 static inline HTMLTableRow *impl_from_IHTMLTableRow(IHTMLTableRow *iface)
44 {
45     return CONTAINING_RECORD(iface, HTMLTableRow, IHTMLTableRow_iface);
46 }
47
48 static HRESULT WINAPI HTMLTableRow_QueryInterface(IHTMLTableRow *iface,
49         REFIID riid, void **ppv)
50 {
51     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
52
53     return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
54 }
55
56 static ULONG WINAPI HTMLTableRow_AddRef(IHTMLTableRow *iface)
57 {
58     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
59
60     return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
61 }
62
63 static ULONG WINAPI HTMLTableRow_Release(IHTMLTableRow *iface)
64 {
65     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
66
67     return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
68 }
69
70 static HRESULT WINAPI HTMLTableRow_GetTypeInfoCount(IHTMLTableRow *iface, UINT *pctinfo)
71 {
72     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
73     return IDispatchEx_GetTypeInfoCount(&This->element.node.dispex.IDispatchEx_iface, pctinfo);
74 }
75
76 static HRESULT WINAPI HTMLTableRow_GetTypeInfo(IHTMLTableRow *iface, UINT iTInfo,
77                                               LCID lcid, ITypeInfo **ppTInfo)
78 {
79     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
80     return IDispatchEx_GetTypeInfo(&This->element.node.dispex.IDispatchEx_iface, iTInfo, lcid,
81             ppTInfo);
82 }
83
84 static HRESULT WINAPI HTMLTableRow_GetIDsOfNames(IHTMLTableRow *iface, REFIID riid,
85                                                 LPOLESTR *rgszNames, UINT cNames,
86                                                 LCID lcid, DISPID *rgDispId)
87 {
88     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
89     return IDispatchEx_GetIDsOfNames(&This->element.node.dispex.IDispatchEx_iface, riid, rgszNames,
90             cNames, lcid, rgDispId);
91 }
92
93 static HRESULT WINAPI HTMLTableRow_Invoke(IHTMLTableRow *iface, DISPID dispIdMember,
94                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
95                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
96 {
97     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
98     return IDispatchEx_Invoke(&This->element.node.dispex.IDispatchEx_iface, dispIdMember, riid,
99             lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
100 }
101
102 static HRESULT WINAPI HTMLTableRow_put_align(IHTMLTableRow *iface, BSTR v)
103 {
104     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
105     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
106     return E_NOTIMPL;
107 }
108
109 static HRESULT WINAPI HTMLTableRow_get_align(IHTMLTableRow *iface, BSTR *p)
110 {
111     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
112     FIXME("(%p)->(%p)\n", This, p);
113     return E_NOTIMPL;
114 }
115
116 static HRESULT WINAPI HTMLTableRow_put_vAlign(IHTMLTableRow *iface, BSTR v)
117 {
118     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
119     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
120     return E_NOTIMPL;
121 }
122
123 static HRESULT WINAPI HTMLTableRow_get_vAlign(IHTMLTableRow *iface, BSTR *p)
124 {
125     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
126     FIXME("(%p)->(%p)\n", This, p);
127     return E_NOTIMPL;
128 }
129
130 static HRESULT WINAPI HTMLTableRow_put_bgColor(IHTMLTableRow *iface, VARIANT v)
131 {
132     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
133     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
134     return E_NOTIMPL;
135 }
136
137 static HRESULT WINAPI HTMLTableRow_get_bgColor(IHTMLTableRow *iface, VARIANT *p)
138 {
139     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
140     FIXME("(%p)->(%p)\n", This, p);
141     return E_NOTIMPL;
142 }
143
144 static HRESULT WINAPI HTMLTableRow_put_borderColor(IHTMLTableRow *iface, VARIANT v)
145 {
146     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
147     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
148     return E_NOTIMPL;
149 }
150
151 static HRESULT WINAPI HTMLTableRow_get_borderColor(IHTMLTableRow *iface, VARIANT *p)
152 {
153     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
154     FIXME("(%p)->(%p)\n", This, p);
155     return E_NOTIMPL;
156 }
157
158 static HRESULT WINAPI HTMLTableRow_put_borderColorLight(IHTMLTableRow *iface, VARIANT v)
159 {
160     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
161     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
162     return E_NOTIMPL;
163 }
164
165 static HRESULT WINAPI HTMLTableRow_get_borderColorLight(IHTMLTableRow *iface, VARIANT *p)
166 {
167     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
168     FIXME("(%p)->(%p)\n", This, p);
169     return E_NOTIMPL;
170 }
171
172 static HRESULT WINAPI HTMLTableRow_put_borderColorDark(IHTMLTableRow *iface, VARIANT v)
173 {
174     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
175     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
176     return E_NOTIMPL;
177 }
178
179 static HRESULT WINAPI HTMLTableRow_get_borderColorDark(IHTMLTableRow *iface, VARIANT *p)
180 {
181     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
182     FIXME("(%p)->(%p)\n", This, p);
183     return E_NOTIMPL;
184 }
185
186 static HRESULT WINAPI HTMLTableRow_get_rowIndex(IHTMLTableRow *iface, LONG *p)
187 {
188     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
189     FIXME("(%p)->(%p)\n", This, p);
190     return E_NOTIMPL;
191 }
192
193 static HRESULT WINAPI HTMLTableRow_get_selectionRowIndex(IHTMLTableRow *iface, LONG *p)
194 {
195     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
196     FIXME("(%p)->(%p)\n", This, p);
197     return E_NOTIMPL;
198 }
199
200 static HRESULT WINAPI HTMLTableRow_get_cells(IHTMLTableRow *iface, IHTMLElementCollection **p)
201 {
202     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
203     nsIDOMHTMLCollection *nscol;
204     nsresult nsres;
205
206     TRACE("(%p)->(%p)\n", This, p);
207
208     nsres = nsIDOMHTMLTableRowElement_GetCells(This->nsrow, &nscol);
209     if(NS_FAILED(nsres)) {
210         ERR("GetCells failed: %08x\n", nsres);
211         return E_FAIL;
212     }
213
214     *p = create_collection_from_htmlcol(This->element.node.doc, nscol);
215
216     nsIDOMHTMLCollection_Release(nscol);
217     return S_OK;
218 }
219
220 static HRESULT WINAPI HTMLTableRow_insertCell(IHTMLTableRow *iface, LONG index, IDispatch **row)
221 {
222     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
223     FIXME("(%p)->(%d %p)\n", This, index, row);
224     return E_NOTIMPL;
225 }
226
227 static HRESULT WINAPI HTMLTableRow_deleteCell(IHTMLTableRow *iface, LONG index)
228 {
229     HTMLTableRow *This = impl_from_IHTMLTableRow(iface);
230     FIXME("(%p)->(%d)\n", This, index);
231     return E_NOTIMPL;
232 }
233
234 static const IHTMLTableRowVtbl HTMLTableRowVtbl = {
235     HTMLTableRow_QueryInterface,
236     HTMLTableRow_AddRef,
237     HTMLTableRow_Release,
238     HTMLTableRow_GetTypeInfoCount,
239     HTMLTableRow_GetTypeInfo,
240     HTMLTableRow_GetIDsOfNames,
241     HTMLTableRow_Invoke,
242     HTMLTableRow_put_align,
243     HTMLTableRow_get_align,
244     HTMLTableRow_put_vAlign,
245     HTMLTableRow_get_vAlign,
246     HTMLTableRow_put_bgColor,
247     HTMLTableRow_get_bgColor,
248     HTMLTableRow_put_borderColor,
249     HTMLTableRow_get_borderColor,
250     HTMLTableRow_put_borderColorLight,
251     HTMLTableRow_get_borderColorLight,
252     HTMLTableRow_put_borderColorDark,
253     HTMLTableRow_get_borderColorDark,
254     HTMLTableRow_get_rowIndex,
255     HTMLTableRow_get_selectionRowIndex,
256     HTMLTableRow_get_cells,
257     HTMLTableRow_insertCell,
258     HTMLTableRow_deleteCell
259 };
260
261 static inline HTMLTableRow *impl_from_HTMLDOMNode(HTMLDOMNode *iface)
262 {
263     return CONTAINING_RECORD(iface, HTMLTableRow, element.node);
264 }
265
266 static HRESULT HTMLTableRow_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
267 {
268     HTMLTableRow *This = impl_from_HTMLDOMNode(iface);
269
270     *ppv = NULL;
271
272     if(IsEqualGUID(&IID_IUnknown, riid)) {
273         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
274         *ppv = &This->IHTMLTableRow_iface;
275     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
276         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
277         *ppv = &This->IHTMLTableRow_iface;
278     }else if(IsEqualGUID(&IID_IHTMLTableRow, riid)) {
279         TRACE("(%p)->(IID_IHTMLTableRow %p)\n", This, ppv);
280         *ppv = &This->IHTMLTableRow_iface;
281     }
282
283     if(*ppv) {
284         IUnknown_AddRef((IUnknown*)*ppv);
285         return S_OK;
286     }
287
288     return HTMLElement_QI(&This->element.node, riid, ppv);
289 }
290
291 static const NodeImplVtbl HTMLTableRowImplVtbl = {
292     HTMLTableRow_QI,
293     HTMLElement_destructor,
294     HTMLElement_clone,
295     HTMLElement_handle_event,
296     HTMLElement_get_attr_col
297 };
298
299 static const tid_t HTMLTableRow_iface_tids[] = {
300     HTMLELEMENT_TIDS,
301     IHTMLTableRow_tid,
302     0
303 };
304
305 static dispex_static_data_t HTMLTableRow_dispex = {
306     NULL,
307     DispHTMLTableRow_tid,
308     NULL,
309     HTMLTableRow_iface_tids
310 };
311
312 HRESULT HTMLTableRow_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
313 {
314     HTMLTableRow *ret;
315     nsresult nsres;
316
317     ret = heap_alloc_zero(sizeof(HTMLTableRow));
318     if(!ret)
319         return E_OUTOFMEMORY;
320
321     ret->IHTMLTableRow_iface.lpVtbl = &HTMLTableRowVtbl;
322     ret->element.node.vtbl = &HTMLTableRowImplVtbl;
323
324     HTMLElement_Init(&ret->element, doc, nselem, &HTMLTableRow_dispex);
325
326     nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLTableRowElement, (void**)&ret->nsrow);
327
328     /* Share nsrow reference with nsnode */
329     assert(nsres == NS_OK && (nsIDOMNode*)ret->nsrow == ret->element.node.nsnode);
330     nsIDOMNode_Release(ret->element.node.nsnode);
331
332     *elem = &ret->element;
333     return S_OK;
334 }