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