winenas.drv: Add workaround for INT64 type too.
[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     return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
86 }
87
88 static ULONG WINAPI HTMLSelectElement_Release(IHTMLSelectElement *iface)
89 {
90     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
91
92     return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
93 }
94
95 static HRESULT WINAPI HTMLSelectElement_GetTypeInfoCount(IHTMLSelectElement *iface, UINT *pctinfo)
96 {
97     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
98     FIXME("(%p)->(%p)\n", This, pctinfo);
99     return E_NOTIMPL;
100 }
101
102 static HRESULT WINAPI HTMLSelectElement_GetTypeInfo(IHTMLSelectElement *iface, UINT iTInfo,
103                                               LCID lcid, ITypeInfo **ppTInfo)
104 {
105     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
106     FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
107     return E_NOTIMPL;
108 }
109
110 static HRESULT WINAPI HTMLSelectElement_GetIDsOfNames(IHTMLSelectElement *iface, REFIID riid,
111                                                 LPOLESTR *rgszNames, UINT cNames,
112                                                 LCID lcid, DISPID *rgDispId)
113 {
114     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
115     FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
116                                         lcid, rgDispId);
117     return E_NOTIMPL;
118 }
119
120 static HRESULT WINAPI HTMLSelectElement_Invoke(IHTMLSelectElement *iface, DISPID dispIdMember,
121                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
122                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
123 {
124     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
125     FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
126             lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
127     return E_NOTIMPL;
128 }
129
130 static HRESULT WINAPI HTMLSelectElement_put_size(IHTMLSelectElement *iface, long v)
131 {
132     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
133     FIXME("(%p)->(%ld)\n", This, v);
134     return E_NOTIMPL;
135 }
136
137 static HRESULT WINAPI HTMLSelectElement_get_size(IHTMLSelectElement *iface, long *p)
138 {
139     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
140     FIXME("(%p)->(%p)\n", This, p);
141     return E_NOTIMPL;
142 }
143
144 static HRESULT WINAPI HTMLSelectElement_put_multiple(IHTMLSelectElement *iface, VARIANT_BOOL v)
145 {
146     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
147     FIXME("(%p)->(%x)\n", This, v);
148     return E_NOTIMPL;
149 }
150
151 static HRESULT WINAPI HTMLSelectElement_get_multiple(IHTMLSelectElement *iface, VARIANT_BOOL *p)
152 {
153     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
154     FIXME("(%p)->(%p)\n", This, p);
155     return E_NOTIMPL;
156 }
157
158 static HRESULT WINAPI HTMLSelectElement_put_name(IHTMLSelectElement *iface, BSTR v)
159 {
160     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
161     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
162     return E_NOTIMPL;
163 }
164
165 static HRESULT WINAPI HTMLSelectElement_get_name(IHTMLSelectElement *iface, BSTR *p)
166 {
167     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
168     nsAString name_str;
169     const PRUnichar *name = NULL;
170     nsresult nsres;
171
172     TRACE("(%p)->(%p)\n", This, p);
173
174     nsAString_Init(&name_str, NULL);
175
176     nsres = nsIDOMHTMLSelectElement_GetName(This->nsselect, &name_str);
177     if(NS_SUCCEEDED(nsres)) {
178         static const WCHAR wszGarbage[] = {'g','a','r','b','a','g','e',0};
179
180         nsAString_GetData(&name_str, &name, NULL);
181
182         /*
183          * Native never returns empty string here. If an element has no name,
184          * name of previous element or ramdom data is returned.
185          */
186         *p = SysAllocString(*name ? name : wszGarbage);
187     }else {
188         ERR("GetName failed: %08x\n", nsres);
189     }
190
191     nsAString_Finish(&name_str);
192
193     TRACE("name=%s\n", debugstr_w(*p));
194     return S_OK;
195 }
196
197 static HRESULT WINAPI HTMLSelectElement_get_options(IHTMLSelectElement *iface, IDispatch **p)
198 {
199     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
200     FIXME("(%p)->(%p)\n", This, p);
201     return E_NOTIMPL;
202 }
203
204 static HRESULT WINAPI HTMLSelectElement_put_onchange(IHTMLSelectElement *iface, VARIANT v)
205 {
206     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
207     FIXME("(%p)->()\n", This);
208     return E_NOTIMPL;
209 }
210
211 static HRESULT WINAPI HTMLSelectElement_get_onchange(IHTMLSelectElement *iface, VARIANT *p)
212 {
213     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
214     FIXME("(%p)->(%p)\n", This, p);
215     return E_NOTIMPL;
216 }
217
218 static HRESULT WINAPI HTMLSelectElement_put_selectedIndex(IHTMLSelectElement *iface, long v)
219 {
220     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
221     FIXME("(%p)->(%ld)\n", This, v);
222     return E_NOTIMPL;
223 }
224
225 static HRESULT WINAPI HTMLSelectElement_get_selectedIndex(IHTMLSelectElement *iface, long *p)
226 {
227     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
228     FIXME("(%p)->(%p)\n", This, p);
229     return E_NOTIMPL;
230 }
231
232 static HRESULT WINAPI HTMLSelectElement_get_type(IHTMLSelectElement *iface, BSTR *p)
233 {
234     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
235     FIXME("(%p)->(%p)\n", This, p);
236     return E_NOTIMPL;
237 }
238
239 static HRESULT WINAPI HTMLSelectElement_put_value(IHTMLSelectElement *iface, BSTR v)
240 {
241     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
242     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
243     return E_NOTIMPL;
244 }
245
246 static HRESULT WINAPI HTMLSelectElement_get_value(IHTMLSelectElement *iface, BSTR *p)
247 {
248     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
249     nsAString value_str;
250     const PRUnichar *value = NULL;
251     nsresult nsres;
252
253     TRACE("(%p)->(%p)\n", This, p);
254
255     nsAString_Init(&value_str, NULL);
256
257     nsres = nsIDOMHTMLSelectElement_GetValue(This->nsselect, &value_str);
258     if(NS_SUCCEEDED(nsres)) {
259         nsAString_GetData(&value_str, &value, NULL);
260         *p = SysAllocString(value);
261     }else {
262         ERR("GetValue failed: %08x\n", nsres);
263     }
264
265     nsAString_Finish(&value_str);
266
267     TRACE("value=%s\n", debugstr_w(*p));
268     return S_OK;
269 }
270
271 static HRESULT WINAPI HTMLSelectElement_put_disabled(IHTMLSelectElement *iface, VARIANT_BOOL v)
272 {
273     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
274     FIXME("(%p)->(%x)\n", This, v);
275     return E_NOTIMPL;
276 }
277
278 static HRESULT WINAPI HTMLSelectElement_get_disabled(IHTMLSelectElement *iface, VARIANT_BOOL *p)
279 {
280     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
281     FIXME("(%p)->(%p)\n", This, p);
282     return E_NOTIMPL;
283 }
284
285 static HRESULT WINAPI HTMLSelectElement_get_form(IHTMLSelectElement *iface, IHTMLFormElement **p)
286 {
287     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
288     FIXME("(%p)->(%p)\n", This, p);
289     return E_NOTIMPL;
290 }
291
292 static HRESULT WINAPI HTMLSelectElement_add(IHTMLSelectElement *iface, IHTMLElement *element,
293                                             VARIANT before)
294 {
295     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
296     FIXME("(%p)->(%p v)\n", This, element);
297     return E_NOTIMPL;
298 }
299
300 static HRESULT WINAPI HTMLSelectElement_remove(IHTMLSelectElement *iface, long index)
301 {
302     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
303     FIXME("(%p)->(%ld)\n", This, index);
304     return E_NOTIMPL;
305 }
306
307 static HRESULT WINAPI HTMLSelectElement_put_length(IHTMLSelectElement *iface, long v)
308 {
309     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
310     FIXME("(%p)->(%ld)\n", This, v);
311     return E_NOTIMPL;
312 }
313
314 static HRESULT WINAPI HTMLSelectElement_get_length(IHTMLSelectElement *iface, long *p)
315 {
316     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
317     FIXME("(%p)->(%p)\n", This, p);
318     return E_NOTIMPL;
319 }
320
321 static HRESULT WINAPI HTMLSelectElement_get__newEnum(IHTMLSelectElement *iface, IUnknown **p)
322 {
323     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
324     FIXME("(%p)->(%p)\n", This, p);
325     return E_NOTIMPL;
326 }
327
328 static HRESULT WINAPI HTMLSelectElement_item(IHTMLSelectElement *iface, VARIANT name,
329                                              VARIANT index, IDispatch **pdisp)
330 {
331     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
332     FIXME("(%p)->(v v %p)\n", This, pdisp);
333     return E_NOTIMPL;
334 }
335
336 static HRESULT WINAPI HTMLSelectElement_tags(IHTMLSelectElement *iface, VARIANT tagName,
337                                              IDispatch **pdisp)
338 {
339     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
340     FIXME("(%p)->(v %p)\n", This, pdisp);
341     return E_NOTIMPL;
342 }
343
344 static void HTMLSelectElement_destructor(IUnknown *iface)
345 {
346     HTMLSelectElement *This = HTMLSELECT_THIS(iface);
347
348     nsIDOMHTMLSelectElement_Release(This->nsselect);
349     mshtml_free(This);
350 }
351
352 static const IHTMLSelectElementVtbl HTMLSelectElementVtbl = {
353     HTMLSelectElement_QueryInterface,
354     HTMLSelectElement_AddRef,
355     HTMLSelectElement_Release,
356     HTMLSelectElement_GetTypeInfoCount,
357     HTMLSelectElement_GetTypeInfo,
358     HTMLSelectElement_GetIDsOfNames,
359     HTMLSelectElement_Invoke,
360     HTMLSelectElement_put_size,
361     HTMLSelectElement_get_size,
362     HTMLSelectElement_put_multiple,
363     HTMLSelectElement_get_multiple,
364     HTMLSelectElement_put_name,
365     HTMLSelectElement_get_name,
366     HTMLSelectElement_get_options,
367     HTMLSelectElement_put_onchange,
368     HTMLSelectElement_get_onchange,
369     HTMLSelectElement_put_selectedIndex,
370     HTMLSelectElement_get_selectedIndex,
371     HTMLSelectElement_get_type,
372     HTMLSelectElement_put_value,
373     HTMLSelectElement_get_value,
374     HTMLSelectElement_put_disabled,
375     HTMLSelectElement_get_disabled,
376     HTMLSelectElement_get_form,
377     HTMLSelectElement_add,
378     HTMLSelectElement_remove,
379     HTMLSelectElement_put_length,
380     HTMLSelectElement_get_length,
381     HTMLSelectElement_get__newEnum,
382     HTMLSelectElement_item,
383     HTMLSelectElement_tags
384 };
385
386 HTMLElement *HTMLSelectElement_Create(nsIDOMHTMLElement *nselem)
387 {
388     HTMLSelectElement *ret = mshtml_alloc(sizeof(HTMLSelectElement));
389     nsresult nsres;
390
391     ret->lpHTMLSelectElementVtbl = &HTMLSelectElementVtbl;
392     
393     nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLSelectElement,
394                                              (void**)&ret->nsselect);
395     if(NS_FAILED(nsres))
396         ERR("Could not get nsIDOMHTMLSelectElement interfce: %08x\n", nsres);
397
398     ret->element.impl = (IUnknown*)HTMLSELECT(ret);
399     ret->element.destructor = HTMLSelectElement_destructor;
400
401     return &ret->element;
402 }