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