Reactos
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 "mshtml_private.h"
20
21typedef struct {
22 HTMLElement element;
23
24 IHTMLTextAreaElement IHTMLTextAreaElement_iface;
25
26 nsIDOMHTMLTextAreaElement *nstextarea;
27} HTMLTextAreaElement;
28
29static inline HTMLTextAreaElement *impl_from_IHTMLTextAreaElement(IHTMLTextAreaElement *iface)
30{
31 return CONTAINING_RECORD(iface, HTMLTextAreaElement, IHTMLTextAreaElement_iface);
32}
33
34static HRESULT WINAPI HTMLTextAreaElement_QueryInterface(IHTMLTextAreaElement *iface,
35 REFIID riid, void **ppv)
36{
37 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
38
39 return IHTMLDOMNode_QueryInterface(&This->element.node.IHTMLDOMNode_iface, riid, ppv);
40}
41
42static ULONG WINAPI HTMLTextAreaElement_AddRef(IHTMLTextAreaElement *iface)
43{
44 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
45
46 return IHTMLDOMNode_AddRef(&This->element.node.IHTMLDOMNode_iface);
47}
48
49static ULONG WINAPI HTMLTextAreaElement_Release(IHTMLTextAreaElement *iface)
50{
51 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
52
53 return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface);
54}
55
56static HRESULT WINAPI HTMLTextAreaElement_GetTypeInfoCount(IHTMLTextAreaElement *iface, UINT *pctinfo)
57{
58 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
59 return IDispatchEx_GetTypeInfoCount(&This->element.node.event_target.dispex.IDispatchEx_iface, pctinfo);
60}
61
62static HRESULT WINAPI HTMLTextAreaElement_GetTypeInfo(IHTMLTextAreaElement *iface, UINT iTInfo,
63 LCID lcid, ITypeInfo **ppTInfo)
64{
65 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
66 return IDispatchEx_GetTypeInfo(&This->element.node.event_target.dispex.IDispatchEx_iface, iTInfo, lcid,
67 ppTInfo);
68}
69
70static HRESULT WINAPI HTMLTextAreaElement_GetIDsOfNames(IHTMLTextAreaElement *iface, REFIID riid,
71 LPOLESTR *rgszNames, UINT cNames,
72 LCID lcid, DISPID *rgDispId)
73{
74 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
75 return IDispatchEx_GetIDsOfNames(&This->element.node.event_target.dispex.IDispatchEx_iface, riid, rgszNames,
76 cNames, lcid, rgDispId);
77}
78
79static HRESULT WINAPI HTMLTextAreaElement_Invoke(IHTMLTextAreaElement *iface, DISPID dispIdMember,
80 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
81 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
82{
83 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
84 return IDispatchEx_Invoke(&This->element.node.event_target.dispex.IDispatchEx_iface, dispIdMember, riid,
85 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
86}
87
88static HRESULT WINAPI HTMLTextAreaElement_get_type(IHTMLTextAreaElement *iface, BSTR *p)
89{
90 static const WCHAR textareaW[] = {'t','e','x','t','a','r','e','a',0};
91
92 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
93
94 TRACE("(%p)->(%p)\n", This, p);
95
96 *p = SysAllocString(textareaW);
97 if(!*p)
98 return E_OUTOFMEMORY;
99 return S_OK;
100}
101
102static HRESULT WINAPI HTMLTextAreaElement_put_value(IHTMLTextAreaElement *iface, BSTR v)
103{
104 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
105 nsAString value_str;
106 nsresult nsres;
107
108 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
109
110 nsAString_InitDepend(&value_str, v);
111 nsres = nsIDOMHTMLTextAreaElement_SetValue(This->nstextarea, &value_str);
112 nsAString_Finish(&value_str);
113 if(NS_FAILED(nsres)) {
114 ERR("SetValue failed: %08x\n", nsres);
115 return E_FAIL;
116 }
117
118 return S_OK;
119}
120
121static HRESULT WINAPI HTMLTextAreaElement_get_value(IHTMLTextAreaElement *iface, BSTR *p)
122{
123 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
124 nsAString value_str;
125 nsresult nsres;
126
127 TRACE("(%p)->(%p)\n", This, p);
128
129 nsAString_Init(&value_str, NULL);
130 nsres = nsIDOMHTMLTextAreaElement_GetValue(This->nstextarea, &value_str);
131 return return_nsstr(nsres, &value_str, p);
132}
133
134static HRESULT WINAPI HTMLTextAreaElement_put_name(IHTMLTextAreaElement *iface, BSTR v)
135{
136 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
137 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
138 return E_NOTIMPL;
139}
140
141static HRESULT WINAPI HTMLTextAreaElement_get_name(IHTMLTextAreaElement *iface, BSTR *p)
142{
143 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
144 nsAString name_str;
145 nsresult nsres;
146
147 TRACE("(%p)->(%p)\n", This, p);
148
149 nsAString_Init(&name_str, NULL);
150 nsres = nsIDOMHTMLTextAreaElement_GetName(This->nstextarea, &name_str);
151 return return_nsstr(nsres, &name_str, p);
152}
153
154static HRESULT WINAPI HTMLTextAreaElement_put_status(IHTMLTextAreaElement *iface, VARIANT v)
155{
156 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
157 FIXME("(%p)->()\n", This);
158 return E_NOTIMPL;
159}
160
161static HRESULT WINAPI HTMLTextAreaElement_get_status(IHTMLTextAreaElement *iface, VARIANT *p)
162{
163 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
164 FIXME("(%p)->(%p)\n", This, p);
165 return E_NOTIMPL;
166}
167
168static HRESULT WINAPI HTMLTextAreaElement_put_disabled(IHTMLTextAreaElement *iface, VARIANT_BOOL v)
169{
170 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
171 FIXME("(%p)->(%x)\n", This, v);
172 return E_NOTIMPL;
173}
174
175static HRESULT WINAPI HTMLTextAreaElement_get_disabled(IHTMLTextAreaElement *iface, VARIANT_BOOL *p)
176{
177 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
178 FIXME("(%p)->(%p)\n", This, p);
179 return E_NOTIMPL;
180}
181
182static HRESULT WINAPI HTMLTextAreaElement_get_form(IHTMLTextAreaElement *iface, IHTMLFormElement **p)
183{
184 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
185 nsIDOMHTMLFormElement *nsform;
186 nsIDOMNode *nsnode;
187 HTMLDOMNode *node;
188 nsresult nsres;
189 HRESULT hres;
190
191 TRACE("(%p)->(%p)\n", This, p);
192
193 nsres = nsIDOMHTMLTextAreaElement_GetForm(This->nstextarea, &nsform);
194 assert(nsres == NS_OK);
195
196 if(!nsform) {
197 *p = NULL;
198 return S_OK;
199 }
200
201 nsres = nsIDOMHTMLFormElement_QueryInterface(nsform, &IID_nsIDOMNode, (void**)&nsnode);
202 nsIDOMHTMLFormElement_Release(nsform);
203 assert(nsres == NS_OK);
204
205 hres = get_node(This->element.node.doc, nsnode, TRUE, &node);
206 nsIDOMNode_Release(nsnode);
207 if(FAILED(hres))
208 return hres;
209
210 hres = IHTMLDOMNode_QueryInterface(&node->IHTMLDOMNode_iface, &IID_IHTMLFormElement, (void**)p);
211 IHTMLDOMNode_Release(&node->IHTMLDOMNode_iface);
212 return hres;
213}
214
215static HRESULT WINAPI HTMLTextAreaElement_put_defaultValue(IHTMLTextAreaElement *iface, BSTR v)
216{
217 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
218 nsAString nsstr;
219 nsresult nsres;
220
221 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
222
223 nsAString_InitDepend(&nsstr, v);
224 nsres = nsIDOMHTMLTextAreaElement_SetDefaultValue(This->nstextarea, &nsstr);
225 nsAString_Finish(&nsstr);
226 return NS_SUCCEEDED(nsres) ? S_OK : E_FAIL;
227}
228
229static HRESULT WINAPI HTMLTextAreaElement_get_defaultValue(IHTMLTextAreaElement *iface, BSTR *p)
230{
231 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
232 nsAString nsstr;
233 nsresult nsres;
234
235 TRACE("(%p)->(%p)\n", This, p);
236
237 nsAString_Init(&nsstr, NULL);
238 nsres = nsIDOMHTMLTextAreaElement_GetDefaultValue(This->nstextarea, &nsstr);
239 return return_nsstr(nsres, &nsstr, p);
240}
241
242static HRESULT WINAPI HTMLTextAreaElement_select(IHTMLTextAreaElement *iface)
243{
244 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
245 FIXME("(%p)\n", This);
246 return E_NOTIMPL;
247}
248
249static HRESULT WINAPI HTMLTextAreaElement_put_onchange(IHTMLTextAreaElement *iface, VARIANT v)
250{
251 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
252 FIXME("(%p)->()\n", This);
253 return E_NOTIMPL;
254}
255
256static HRESULT WINAPI HTMLTextAreaElement_get_onchange(IHTMLTextAreaElement *iface, VARIANT *p)
257{
258 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
259 FIXME("(%p)->(%p)\n", This, p);
260 return E_NOTIMPL;
261}
262
263static HRESULT WINAPI HTMLTextAreaElement_put_onselect(IHTMLTextAreaElement *iface, VARIANT v)
264{
265 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
266 FIXME("(%p)->()\n", This);
267 return E_NOTIMPL;
268}
269
270static HRESULT WINAPI HTMLTextAreaElement_get_onselect(IHTMLTextAreaElement *iface, VARIANT *p)
271{
272 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
273 FIXME("(%p)->(%p)\n", This, p);
274 return E_NOTIMPL;
275}
276
277static HRESULT WINAPI HTMLTextAreaElement_put_readOnly(IHTMLTextAreaElement *iface, VARIANT_BOOL v)
278{
279 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
280 nsresult nsres;
281
282 TRACE("(%p)->(%x)\n", This, v);
283
284 nsres = nsIDOMHTMLTextAreaElement_SetReadOnly(This->nstextarea, v != VARIANT_FALSE);
285 if(NS_FAILED(nsres)) {
286 ERR("SetReadOnly failed: %08x\n", nsres);
287 return E_FAIL;
288 }
289
290 return S_OK;
291}
292
293static HRESULT WINAPI HTMLTextAreaElement_get_readOnly(IHTMLTextAreaElement *iface, VARIANT_BOOL *p)
294{
295 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
296 cpp_bool b;
297 nsresult nsres;
298
299 TRACE("(%p)->(%p)\n", This, p);
300
301 nsres = nsIDOMHTMLTextAreaElement_GetReadOnly(This->nstextarea, &b);
302 if(NS_FAILED(nsres)) {
303 ERR("GetReadOnly failed: %08x\n", nsres);
304 return E_FAIL;
305 }
306
307 *p = b ? VARIANT_TRUE : VARIANT_FALSE;
308 return S_OK;
309}
310
311static HRESULT WINAPI HTMLTextAreaElement_put_rows(IHTMLTextAreaElement *iface, LONG v)
312{
313 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
314 FIXME("(%p)->(%d)\n", This, v);
315 return E_NOTIMPL;
316}
317
318static HRESULT WINAPI HTMLTextAreaElement_get_rows(IHTMLTextAreaElement *iface, LONG *p)
319{
320 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
321 FIXME("(%p)->(%p)\n", This, p);
322 return E_NOTIMPL;
323}
324
325static HRESULT WINAPI HTMLTextAreaElement_put_cols(IHTMLTextAreaElement *iface, LONG v)
326{
327 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
328 FIXME("(%p)->(%d)\n", This, v);
329 return E_NOTIMPL;
330}
331
332static HRESULT WINAPI HTMLTextAreaElement_get_cols(IHTMLTextAreaElement *iface, LONG *p)
333{
334 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
335 FIXME("(%p)->(%p)\n", This, p);
336 return E_NOTIMPL;
337}
338
339static HRESULT WINAPI HTMLTextAreaElement_put_wrap(IHTMLTextAreaElement *iface, BSTR v)
340{
341 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
342 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
343 return E_NOTIMPL;
344}
345
346static HRESULT WINAPI HTMLTextAreaElement_get_wrap(IHTMLTextAreaElement *iface, BSTR *p)
347{
348 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
349 FIXME("(%p)->(%p)\n", This, p);
350 return E_NOTIMPL;
351}
352
353static HRESULT WINAPI HTMLTextAreaElement_createTextRange(IHTMLTextAreaElement *iface,
354 IHTMLTxtRange **range)
355{
356 HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface);
357 FIXME("(%p)->(%p)\n", This, range);
358 return E_NOTIMPL;
359}
360
361static const IHTMLTextAreaElementVtbl HTMLTextAreaElementVtbl = {
362 HTMLTextAreaElement_QueryInterface,
363 HTMLTextAreaElement_AddRef,
364 HTMLTextAreaElement_Release,
365 HTMLTextAreaElement_GetTypeInfoCount,
366 HTMLTextAreaElement_GetTypeInfo,
367 HTMLTextAreaElement_GetIDsOfNames,
368 HTMLTextAreaElement_Invoke,
369 HTMLTextAreaElement_get_type,
370 HTMLTextAreaElement_put_value,
371 HTMLTextAreaElement_get_value,
372 HTMLTextAreaElement_put_name,
373 HTMLTextAreaElement_get_name,
374 HTMLTextAreaElement_put_status,
375 HTMLTextAreaElement_get_status,
376 HTMLTextAreaElement_put_disabled,
377 HTMLTextAreaElement_get_disabled,
378 HTMLTextAreaElement_get_form,
379 HTMLTextAreaElement_put_defaultValue,
380 HTMLTextAreaElement_get_defaultValue,
381 HTMLTextAreaElement_select,
382 HTMLTextAreaElement_put_onchange,
383 HTMLTextAreaElement_get_onchange,
384 HTMLTextAreaElement_put_onselect,
385 HTMLTextAreaElement_get_onselect,
386 HTMLTextAreaElement_put_readOnly,
387 HTMLTextAreaElement_get_readOnly,
388 HTMLTextAreaElement_put_rows,
389 HTMLTextAreaElement_get_rows,
390 HTMLTextAreaElement_put_cols,
391 HTMLTextAreaElement_get_cols,
392 HTMLTextAreaElement_put_wrap,
393 HTMLTextAreaElement_get_wrap,
394 HTMLTextAreaElement_createTextRange
395};
396
397static inline HTMLTextAreaElement *impl_from_HTMLDOMNode(HTMLDOMNode *iface)
398{
399 return CONTAINING_RECORD(iface, HTMLTextAreaElement, element.node);
400}
401
402static HRESULT HTMLTextAreaElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
403{
404 HTMLTextAreaElement *This = impl_from_HTMLDOMNode(iface);
405
406 *ppv = NULL;
407
408 if(IsEqualGUID(&IID_IUnknown, riid)) {
409 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
410 *ppv = &This->IHTMLTextAreaElement_iface;
411 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
412 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
413 *ppv = &This->IHTMLTextAreaElement_iface;
414 }else if(IsEqualGUID(&IID_IHTMLTextAreaElement, riid)) {
415 TRACE("(%p)->(IID_IHTMLTextAreaElement %p)\n", This, ppv);
416 *ppv = &This->IHTMLTextAreaElement_iface;
417 }
418
419 if(*ppv) {
420 IUnknown_AddRef((IUnknown*)*ppv);
421 return S_OK;
422 }
423
424 return HTMLElement_QI(&This->element.node, riid, ppv);
425}
426
427static HRESULT HTMLTextAreaElementImpl_put_disabled(HTMLDOMNode *iface, VARIANT_BOOL v)
428{
429 HTMLTextAreaElement *This = impl_from_HTMLDOMNode(iface);
430 return IHTMLTextAreaElement_put_disabled(&This->IHTMLTextAreaElement_iface, v);
431}
432
433static HRESULT HTMLTextAreaElementImpl_get_disabled(HTMLDOMNode *iface, VARIANT_BOOL *p)
434{
435 HTMLTextAreaElement *This = impl_from_HTMLDOMNode(iface);
436 return IHTMLTextAreaElement_get_disabled(&This->IHTMLTextAreaElement_iface, p);
437}
438
439static BOOL HTMLTextAreaElement_is_text_edit(HTMLDOMNode *iface)
440{
441 return TRUE;
442}
443
444static void HTMLTextAreaElement_traverse(HTMLDOMNode *iface, nsCycleCollectionTraversalCallback *cb)
445{
446 HTMLTextAreaElement *This = impl_from_HTMLDOMNode(iface);
447
448 if(This->nstextarea)
449 note_cc_edge((nsISupports*)This->nstextarea, "This->nstextarea", cb);
450}
451
452static void HTMLTextAreaElement_unlink(HTMLDOMNode *iface)
453{
454 HTMLTextAreaElement *This = impl_from_HTMLDOMNode(iface);
455
456 if(This->nstextarea) {
457 nsIDOMHTMLTextAreaElement *nstextarea = This->nstextarea;
458
459 This->nstextarea = NULL;
460 nsIDOMHTMLTextAreaElement_Release(nstextarea);
461 }
462}
463
464static const NodeImplVtbl HTMLTextAreaElementImplVtbl = {
465 HTMLTextAreaElement_QI,
466 HTMLElement_destructor,
467 HTMLElement_cpc,
468 HTMLElement_clone,
469 HTMLElement_handle_event,
470 HTMLElement_get_attr_col,
471 NULL,
472 NULL,
473 HTMLTextAreaElementImpl_put_disabled,
474 HTMLTextAreaElementImpl_get_disabled,
475 NULL,
476 NULL,
477 NULL,
478 NULL,
479 NULL,
480 HTMLTextAreaElement_traverse,
481 HTMLTextAreaElement_unlink,
482 HTMLTextAreaElement_is_text_edit
483};
484
485static const tid_t HTMLTextAreaElement_iface_tids[] = {
486 HTMLELEMENT_TIDS,
487 IHTMLTextAreaElement_tid,
488 0
489};
490
491static dispex_static_data_t HTMLTextAreaElement_dispex = {
492 NULL,
493 DispHTMLTextAreaElement_tid,
494 NULL,
495 HTMLTextAreaElement_iface_tids
496};
497
498HRESULT HTMLTextAreaElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLElement **elem)
499{
500 HTMLTextAreaElement *ret;
501 nsresult nsres;
502
503 ret = heap_alloc_zero(sizeof(HTMLTextAreaElement));
504 if(!ret)
505 return E_OUTOFMEMORY;
506
507 ret->IHTMLTextAreaElement_iface.lpVtbl = &HTMLTextAreaElementVtbl;
508 ret->element.node.vtbl = &HTMLTextAreaElementImplVtbl;
509
510 HTMLElement_Init(&ret->element, doc, nselem, &HTMLTextAreaElement_dispex);
511
512 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLTextAreaElement, (void**)&ret->nstextarea);
513 assert(nsres == NS_OK);
514
515 *elem = &ret->element;
516 return S_OK;
517}