Reactos
at master 517 lines 17 kB view raw
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}