comctl32: We can now store binary files in the repository.
[wine] / dlls / mshtml / htmlselect.c
1 /*
2  * Copyright 2006 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 "config.h"
20
21 #include <stdarg.h>
22 #include <stdio.h>
23
24 #define COBJMACROS
25
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winuser.h"
29 #include "winnls.h"
30 #include "ole2.h"
31
32 #include "wine/debug.h"
33
34 #include "mshtml_private.h"
35
36 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
37
38 typedef struct {
39     HTMLElement element;
40
41     const IHTMLSelectElementVtbl *lpHTMLSelectElementVtbl;
42
43     nsIDOMHTMLSelectElement *nsselect;
44 } HTMLSelectElement;
45
46 #define HTMLSELECT(x)  ((IHTMLSelectElement*)  &(x)->lpHTMLSelectElementVtbl)
47
48 #define HTMLSELECT_THIS(iface) DEFINE_THIS(HTMLSelectElement, HTMLSelectElement, iface)
49
50 static HRESULT WINAPI HTMLSelectElement_QueryInterface(IHTMLSelectElement *iface,
51                                                          REFIID riid, void **ppv)
52 {
53     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
54     HRESULT hres;
55
56     *ppv = NULL;
57
58     if(IsEqualGUID(&IID_IUnknown, riid)) {
59         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
60         *ppv = HTMLSELECT(This);
61     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
62         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
63         *ppv = HTMLSELECT(This);
64     }else if(IsEqualGUID(&IID_IHTMLSelectElement, riid)) {
65         TRACE("(%p)->(IID_IHTMLSelectElement %p)\n", This, ppv);
66         *ppv = HTMLSELECT(This);
67     }
68
69     if(*ppv) {
70         IUnknown_AddRef((IUnknown*)*ppv);
71         return S_OK;
72     }
73
74     hres = HTMLElement_QI(&This->element, riid, ppv);
75     if(FAILED(hres))
76         WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
77
78     return hres;
79 }
80
81 static ULONG WINAPI HTMLSelectElement_AddRef(IHTMLSelectElement *iface)
82 {
83     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
84
85     TRACE("(%p)\n", This);
86
87     return IHTMLDocument2_AddRef(HTMLDOC(This->element.node.doc));
88 }
89
90 static ULONG WINAPI HTMLSelectElement_Release(IHTMLSelectElement *iface)
91 {
92     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
93
94     TRACE("(%p)\n", This);
95
96     return IHTMLDocument2_Release(HTMLDOC(This->element.node.doc));
97 }
98
99 static HRESULT WINAPI HTMLSelectElement_GetTypeInfoCount(IHTMLSelectElement *iface, UINT *pctinfo)
100 {
101     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
102     FIXME("(%p)->(%p)\n", This, pctinfo);
103     return E_NOTIMPL;
104 }
105
106 static HRESULT WINAPI HTMLSelectElement_GetTypeInfo(IHTMLSelectElement *iface, UINT iTInfo,
107                                               LCID lcid, ITypeInfo **ppTInfo)
108 {
109     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
110     FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
111     return E_NOTIMPL;
112 }
113
114 static HRESULT WINAPI HTMLSelectElement_GetIDsOfNames(IHTMLSelectElement *iface, REFIID riid,
115                                                 LPOLESTR *rgszNames, UINT cNames,
116                                                 LCID lcid, DISPID *rgDispId)
117 {
118     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
119     FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
120                                         lcid, rgDispId);
121     return E_NOTIMPL;
122 }
123
124 static HRESULT WINAPI HTMLSelectElement_Invoke(IHTMLSelectElement *iface, DISPID dispIdMember,
125                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
126                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
127 {
128     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
129     FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
130             lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
131     return E_NOTIMPL;
132 }
133
134 static HRESULT WINAPI HTMLSelectElement_put_size(IHTMLSelectElement *iface, long v)
135 {
136     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
137     FIXME("(%p)->(%ld)\n", This, v);
138     return E_NOTIMPL;
139 }
140
141 static HRESULT WINAPI HTMLSelectElement_get_size(IHTMLSelectElement *iface, long *p)
142 {
143     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
144     FIXME("(%p)->(%p)\n", This, p);
145     return E_NOTIMPL;
146 }
147
148 static HRESULT WINAPI HTMLSelectElement_put_multiple(IHTMLSelectElement *iface, VARIANT_BOOL v)
149 {
150     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
151     FIXME("(%p)->(%x)\n", This, v);
152     return E_NOTIMPL;
153 }
154
155 static HRESULT WINAPI HTMLSelectElement_get_multiple(IHTMLSelectElement *iface, VARIANT_BOOL *p)
156 {
157     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
158     FIXME("(%p)->(%p)\n", This, p);
159     return E_NOTIMPL;
160 }
161
162 static HRESULT WINAPI HTMLSelectElement_put_name(IHTMLSelectElement *iface, BSTR v)
163 {
164     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
165     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
166     return E_NOTIMPL;
167 }
168
169 static HRESULT WINAPI HTMLSelectElement_get_name(IHTMLSelectElement *iface, BSTR *p)
170 {
171     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
172     nsAString name_str;
173     const PRUnichar *name = NULL;
174     nsresult nsres;
175
176     TRACE("(%p)->(%p)\n", This, p);
177
178     nsAString_Init(&name_str, NULL);
179
180     nsres = nsIDOMHTMLSelectElement_GetName(This->nsselect, &name_str);
181     if(NS_SUCCEEDED(nsres)) {
182         static const WCHAR wszGarbage[] = {'g','a','r','b','a','g','e',0};
183
184         nsAString_GetData(&name_str, &name, NULL);
185
186         /*
187          * Native never returns empty string here. If an element has no name,
188          * name of previous element or ramdom data is returned.
189          */
190         *p = SysAllocString(*name ? name : wszGarbage);
191     }else {
192         ERR("GetName failed: %08x\n", nsres);
193     }
194
195     nsAString_Finish(&name_str);
196
197     TRACE("name=%s\n", debugstr_w(*p));
198     return S_OK;
199 }
200
201 static HRESULT WINAPI HTMLSelectElement_get_options(IHTMLSelectElement *iface, IDispatch **p)
202 {
203     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
204     FIXME("(%p)->(%p)\n", This, p);
205     return E_NOTIMPL;
206 }
207
208 static HRESULT WINAPI HTMLSelectElement_put_onchange(IHTMLSelectElement *iface, VARIANT v)
209 {
210     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
211     FIXME("(%p)->()\n", This);
212     return E_NOTIMPL;
213 }
214
215 static HRESULT WINAPI HTMLSelectElement_get_onchange(IHTMLSelectElement *iface, VARIANT *p)
216 {
217     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
218     FIXME("(%p)->(%p)\n", This, p);
219     return E_NOTIMPL;
220 }
221
222 static HRESULT WINAPI HTMLSelectElement_put_selectedIndex(IHTMLSelectElement *iface, long v)
223 {
224     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
225     FIXME("(%p)->(%ld)\n", This, v);
226     return E_NOTIMPL;
227 }
228
229 static HRESULT WINAPI HTMLSelectElement_get_selectedIndex(IHTMLSelectElement *iface, long *p)
230 {
231     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
232     FIXME("(%p)->(%p)\n", This, p);
233     return E_NOTIMPL;
234 }
235
236 static HRESULT WINAPI HTMLSelectElement_get_type(IHTMLSelectElement *iface, BSTR *p)
237 {
238     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
239     FIXME("(%p)->(%p)\n", This, p);
240     return E_NOTIMPL;
241 }
242
243 static HRESULT WINAPI HTMLSelectElement_put_value(IHTMLSelectElement *iface, BSTR v)
244 {
245     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
246     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
247     return E_NOTIMPL;
248 }
249
250 static HRESULT WINAPI HTMLSelectElement_get_value(IHTMLSelectElement *iface, BSTR *p)
251 {
252     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
253     nsAString value_str;
254     const PRUnichar *value = NULL;
255     nsresult nsres;
256
257     TRACE("(%p)->(%p)\n", This, p);
258
259     nsAString_Init(&value_str, NULL);
260
261     nsres = nsIDOMHTMLSelectElement_GetValue(This->nsselect, &value_str);
262     if(NS_SUCCEEDED(nsres)) {
263         nsAString_GetData(&value_str, &value, NULL);
264         *p = SysAllocString(value);
265     }else {
266         ERR("GetValue failed: %08x\n", nsres);
267     }
268
269     nsAString_Finish(&value_str);
270
271     TRACE("value=%s\n", debugstr_w(*p));
272     return S_OK;
273 }
274
275 static HRESULT WINAPI HTMLSelectElement_put_disabled(IHTMLSelectElement *iface, VARIANT_BOOL v)
276 {
277     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
278     FIXME("(%p)->(%x)\n", This, v);
279     return E_NOTIMPL;
280 }
281
282 static HRESULT WINAPI HTMLSelectElement_get_disabled(IHTMLSelectElement *iface, VARIANT_BOOL *p)
283 {
284     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
285     FIXME("(%p)->(%p)\n", This, p);
286     return E_NOTIMPL;
287 }
288
289 static HRESULT WINAPI HTMLSelectElement_get_form(IHTMLSelectElement *iface, IHTMLFormElement **p)
290 {
291     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
292     FIXME("(%p)->(%p)\n", This, p);
293     return E_NOTIMPL;
294 }
295
296 static HRESULT WINAPI HTMLSelectElement_add(IHTMLSelectElement *iface, IHTMLElement *element,
297                                             VARIANT before)
298 {
299     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
300     FIXME("(%p)->(%p v)\n", This, element);
301     return E_NOTIMPL;
302 }
303
304 static HRESULT WINAPI HTMLSelectElement_remove(IHTMLSelectElement *iface, long index)
305 {
306     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
307     FIXME("(%p)->(%ld)\n", This, index);
308     return E_NOTIMPL;
309 }
310
311 static HRESULT WINAPI HTMLSelectElement_put_length(IHTMLSelectElement *iface, long v)
312 {
313     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
314     FIXME("(%p)->(%ld)\n", This, v);
315     return E_NOTIMPL;
316 }
317
318 static HRESULT WINAPI HTMLSelectElement_get_length(IHTMLSelectElement *iface, long *p)
319 {
320     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
321     FIXME("(%p)->(%p)\n", This, p);
322     return E_NOTIMPL;
323 }
324
325 static HRESULT WINAPI HTMLSelectElement_get__newEnum(IHTMLSelectElement *iface, IUnknown **p)
326 {
327     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
328     FIXME("(%p)->(%p)\n", This, p);
329     return E_NOTIMPL;
330 }
331
332 static HRESULT WINAPI HTMLSelectElement_item(IHTMLSelectElement *iface, VARIANT name,
333                                              VARIANT index, IDispatch **pdisp)
334 {
335     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
336     FIXME("(%p)->(v v %p)\n", This, pdisp);
337     return E_NOTIMPL;
338 }
339
340 static HRESULT WINAPI HTMLSelectElement_tags(IHTMLSelectElement *iface, VARIANT tagName,
341                                              IDispatch **pdisp)
342 {
343     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
344     FIXME("(%p)->(v %p)\n", This, pdisp);
345     return E_NOTIMPL;
346 }
347
348 static void HTMLSelectElement_destructor(IUnknown *iface)
349 {
350     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
351
352     nsIDOMHTMLSelectElement_Release(This->nsselect);
353     mshtml_free(This);
354 }
355
356 static const IHTMLSelectElementVtbl HTMLSelectElementVtbl = {
357     HTMLSelectElement_QueryInterface,
358     HTMLSelectElement_AddRef,
359     HTMLSelectElement_Release,
360     HTMLSelectElement_GetTypeInfoCount,
361     HTMLSelectElement_GetTypeInfo,
362     HTMLSelectElement_GetIDsOfNames,
363     HTMLSelectElement_Invoke,
364     HTMLSelectElement_put_size,
365     HTMLSelectElement_get_size,
366     HTMLSelectElement_put_multiple,
367     HTMLSelectElement_get_multiple,
368     HTMLSelectElement_put_name,
369     HTMLSelectElement_get_name,
370     HTMLSelectElement_get_options,
371     HTMLSelectElement_put_onchange,
372     HTMLSelectElement_get_onchange,
373     HTMLSelectElement_put_selectedIndex,
374     HTMLSelectElement_get_selectedIndex,
375     HTMLSelectElement_get_type,
376     HTMLSelectElement_put_value,
377     HTMLSelectElement_get_value,
378     HTMLSelectElement_put_disabled,
379     HTMLSelectElement_get_disabled,
380     HTMLSelectElement_get_form,
381     HTMLSelectElement_add,
382     HTMLSelectElement_remove,
383     HTMLSelectElement_put_length,
384     HTMLSelectElement_get_length,
385     HTMLSelectElement_get__newEnum,
386     HTMLSelectElement_item,
387     HTMLSelectElement_tags
388 };
389
390 HTMLElement *HTMLSelectElement_Create(nsIDOMHTMLElement *nselem)
391 {
392     HTMLSelectElement *ret = mshtml_alloc(sizeof(HTMLSelectElement));
393     nsresult nsres;
394
395     ret->lpHTMLSelectElementVtbl = &HTMLSelectElementVtbl;
396     
397     nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLSelectElement,
398                                              (void**)&ret->nsselect);
399     if(NS_FAILED(nsres))
400         ERR("Could not get nsIDOMHTMLSelectElement interfce: %08x\n", nsres);
401
402     ret->element.impl = (IUnknown*)HTMLSELECT(ret);
403     ret->element.destructor = HTMLSelectElement_destructor;
404
405     return &ret->element;
406 }