shlwapi: URL_FILE_USE_PATHURL flag only unescapes file urls in UrlCanonicalize.
[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     const IHTMLTableRowVtbl *lpHTMLTableRowVtbl;
38
39     nsIDOMHTMLTableRowElement *nsrow;
40 } HTMLTableRow;
41
42 #define HTMLTABLEROW(x)  (&(x)->lpHTMLTableRowVtbl)
43
44 #define HTMLTABLEROW_THIS(iface) DEFINE_THIS(HTMLTableRow, HTMLTableRow, iface)
45
46 static HRESULT WINAPI HTMLTableRow_QueryInterface(IHTMLTableRow *iface,
47         REFIID riid, void **ppv)
48 {
49     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
50
51     return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv);
52 }
53
54 static ULONG WINAPI HTMLTableRow_AddRef(IHTMLTableRow *iface)
55 {
56     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
57
58     return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
59 }
60
61 static ULONG WINAPI HTMLTableRow_Release(IHTMLTableRow *iface)
62 {
63     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
64
65     return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
66 }
67
68 static HRESULT WINAPI HTMLTableRow_GetTypeInfoCount(IHTMLTableRow *iface, UINT *pctinfo)
69 {
70     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
71     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->element.node.dispex), pctinfo);
72 }
73
74 static HRESULT WINAPI HTMLTableRow_GetTypeInfo(IHTMLTableRow *iface, UINT iTInfo,
75                                               LCID lcid, ITypeInfo **ppTInfo)
76 {
77     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
78     return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->element.node.dispex), iTInfo, lcid, ppTInfo);
79 }
80
81 static HRESULT WINAPI HTMLTableRow_GetIDsOfNames(IHTMLTableRow *iface, REFIID riid,
82                                                 LPOLESTR *rgszNames, UINT cNames,
83                                                 LCID lcid, DISPID *rgDispId)
84 {
85     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
86     return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->element.node.dispex), riid, rgszNames, cNames, lcid, rgDispId);
87 }
88
89 static HRESULT WINAPI HTMLTableRow_Invoke(IHTMLTableRow *iface, DISPID dispIdMember,
90                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
91                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
92 {
93     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
94     return IDispatchEx_Invoke(DISPATCHEX(&This->element.node.dispex), dispIdMember, riid, lcid, wFlags, pDispParams,
95             pVarResult, pExcepInfo, puArgErr);
96 }
97
98 static HRESULT WINAPI HTMLTableRow_put_align(IHTMLTableRow *iface, BSTR v)
99 {
100     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
101     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
102     return E_NOTIMPL;
103 }
104
105 static HRESULT WINAPI HTMLTableRow_get_align(IHTMLTableRow *iface, BSTR *p)
106 {
107     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
108     FIXME("(%p)->(%p)\n", This, p);
109     return E_NOTIMPL;
110 }
111
112 static HRESULT WINAPI HTMLTableRow_put_vAlign(IHTMLTableRow *iface, BSTR v)
113 {
114     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
115     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
116     return E_NOTIMPL;
117 }
118
119 static HRESULT WINAPI HTMLTableRow_get_vAlign(IHTMLTableRow *iface, BSTR *p)
120 {
121     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
122     FIXME("(%p)->(%p)\n", This, p);
123     return E_NOTIMPL;
124 }
125
126 static HRESULT WINAPI HTMLTableRow_put_bgColor(IHTMLTableRow *iface, VARIANT v)
127 {
128     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
129     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
130     return E_NOTIMPL;
131 }
132
133 static HRESULT WINAPI HTMLTableRow_get_bgColor(IHTMLTableRow *iface, VARIANT *p)
134 {
135     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
136     FIXME("(%p)->(%p)\n", This, p);
137     return E_NOTIMPL;
138 }
139
140 static HRESULT WINAPI HTMLTableRow_put_borderColor(IHTMLTableRow *iface, VARIANT v)
141 {
142     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
143     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
144     return E_NOTIMPL;
145 }
146
147 static HRESULT WINAPI HTMLTableRow_get_borderColor(IHTMLTableRow *iface, VARIANT *p)
148 {
149     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
150     FIXME("(%p)->(%p)\n", This, p);
151     return E_NOTIMPL;
152 }
153
154 static HRESULT WINAPI HTMLTableRow_put_borderColorLight(IHTMLTableRow *iface, VARIANT v)
155 {
156     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
157     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
158     return E_NOTIMPL;
159 }
160
161 static HRESULT WINAPI HTMLTableRow_get_borderColorLight(IHTMLTableRow *iface, VARIANT *p)
162 {
163     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
164     FIXME("(%p)->(%p)\n", This, p);
165     return E_NOTIMPL;
166 }
167
168 static HRESULT WINAPI HTMLTableRow_put_borderColorDark(IHTMLTableRow *iface, VARIANT v)
169 {
170     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
171     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
172     return E_NOTIMPL;
173 }
174
175 static HRESULT WINAPI HTMLTableRow_get_borderColorDark(IHTMLTableRow *iface, VARIANT *p)
176 {
177     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
178     FIXME("(%p)->(%p)\n", This, p);
179     return E_NOTIMPL;
180 }
181
182 static HRESULT WINAPI HTMLTableRow_get_rowIndex(IHTMLTableRow *iface, LONG *p)
183 {
184     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
185     FIXME("(%p)->(%p)\n", This, p);
186     return E_NOTIMPL;
187 }
188
189 static HRESULT WINAPI HTMLTableRow_get_selectionRowIndex(IHTMLTableRow *iface, LONG *p)
190 {
191     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
192     FIXME("(%p)->(%p)\n", This, p);
193     return E_NOTIMPL;
194 }
195
196 static HRESULT WINAPI HTMLTableRow_get_cells(IHTMLTableRow *iface, IHTMLElementCollection **p)
197 {
198     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
199     nsIDOMHTMLCollection *nscol;
200     nsresult nsres;
201
202     TRACE("(%p)->(%p)\n", This, p);
203
204     nsres = nsIDOMHTMLTableRowElement_GetCells(This->nsrow, &nscol);
205     if(NS_FAILED(nsres)) {
206         ERR("GetCells failed: %08x\n", nsres);
207         return E_FAIL;
208     }
209
210     *p = create_collection_from_htmlcol(This->element.node.doc, (IUnknown*)HTMLTABLEROW(This), nscol);
211
212     nsIDOMHTMLCollection_Release(nscol);
213     return S_OK;
214 }
215
216 static HRESULT WINAPI HTMLTableRow_insertCell(IHTMLTableRow *iface, LONG index, IDispatch **row)
217 {
218     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
219     FIXME("(%p)->(%d %p)\n", This, index, row);
220     return E_NOTIMPL;
221 }
222
223 static HRESULT WINAPI HTMLTableRow_deleteCell(IHTMLTableRow *iface, LONG index)
224 {
225     HTMLTableRow *This = HTMLTABLEROW_THIS(iface);
226     FIXME("(%p)->(%d)\n", This, index);
227     return E_NOTIMPL;
228 }
229
230 #undef HTMLTABLEROW_THIS
231
232 static const IHTMLTableRowVtbl HTMLTableRowVtbl = {
233     HTMLTableRow_QueryInterface,
234     HTMLTableRow_AddRef,
235     HTMLTableRow_Release,
236     HTMLTableRow_GetTypeInfoCount,
237     HTMLTableRow_GetTypeInfo,
238     HTMLTableRow_GetIDsOfNames,
239     HTMLTableRow_Invoke,
240     HTMLTableRow_put_align,
241     HTMLTableRow_get_align,
242     HTMLTableRow_put_vAlign,
243     HTMLTableRow_get_vAlign,
244     HTMLTableRow_put_bgColor,
245     HTMLTableRow_get_bgColor,
246     HTMLTableRow_put_borderColor,
247     HTMLTableRow_get_borderColor,
248     HTMLTableRow_put_borderColorLight,
249     HTMLTableRow_get_borderColorLight,
250     HTMLTableRow_put_borderColorDark,
251     HTMLTableRow_get_borderColorDark,
252     HTMLTableRow_get_rowIndex,
253     HTMLTableRow_get_selectionRowIndex,
254     HTMLTableRow_get_cells,
255     HTMLTableRow_insertCell,
256     HTMLTableRow_deleteCell
257 };
258
259 #define HTMLTABLEROW_NODE_THIS(iface) DEFINE_THIS2(HTMLTableRow, element.node, iface)
260
261 static HRESULT HTMLTableRow_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
262 {
263     HTMLTableRow *This = HTMLTABLEROW_NODE_THIS(iface);
264
265     *ppv = NULL;
266
267     if(IsEqualGUID(&IID_IUnknown, riid)) {
268         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
269         *ppv = HTMLTABLEROW(This);
270     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
271         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
272         *ppv = HTMLTABLEROW(This);
273     }else if(IsEqualGUID(&IID_IHTMLTableRow, riid)) {
274         TRACE("(%p)->(IID_IHTMLTableRow %p)\n", This, ppv);
275         *ppv = HTMLTABLEROW(This);
276     }
277
278     if(*ppv) {
279         IUnknown_AddRef((IUnknown*)*ppv);
280         return S_OK;
281     }
282
283     return HTMLElement_QI(&This->element.node, riid, ppv);
284 }
285
286 static void HTMLTableRow_destructor(HTMLDOMNode *iface)
287 {
288     HTMLTableRow *This = HTMLTABLEROW_NODE_THIS(iface);
289
290     if(This->nsrow)
291         nsIDOMHTMLTableRowElement_Release(This->nsrow);
292
293     HTMLElement_destructor(&This->element.node);
294 }
295
296 #undef HTMLTABLEROW_NODE_THIS
297
298 static const NodeImplVtbl HTMLTableRowImplVtbl = {
299     HTMLTableRow_QI,
300     HTMLTableRow_destructor
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 HTMLElement *HTMLTableRow_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem)
317 {
318     HTMLTableRow *ret = heap_alloc_zero(sizeof(HTMLTableRow));
319     nsresult nsres;
320
321     ret->lpHTMLTableRowVtbl = &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     if(NS_FAILED(nsres))
328         ERR("Could not get nsIDOMHTMLTableRowElement iface: %08x\n", nsres);
329
330     return &ret->element;
331 }