Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenhtmlselect.c
Go to the documentation of this file.
00001 /* 00002 * Copyright 2006 Jacek Caban for CodeWeavers 00003 * 00004 * This library is free software; you can redistribute it and/or 00005 * modify it under the terms of the GNU Lesser General Public 00006 * License as published by the Free Software Foundation; either 00007 * version 2.1 of the License, or (at your option) any later version. 00008 * 00009 * This library is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 * Lesser General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU Lesser General Public 00015 * License along with this library; if not, write to the Free Software 00016 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00017 */ 00018 00019 #include <stdarg.h> 00020 00021 #define COBJMACROS 00022 00023 #include "windef.h" 00024 #include "winbase.h" 00025 #include "winuser.h" 00026 #include "ole2.h" 00027 00028 #include "wine/debug.h" 00029 00030 #include "mshtml_private.h" 00031 #include "htmlevent.h" 00032 00033 WINE_DEFAULT_DEBUG_CHANNEL(mshtml); 00034 00035 typedef struct { 00036 HTMLElement element; 00037 00038 const IHTMLSelectElementVtbl *lpHTMLSelectElementVtbl; 00039 00040 nsIDOMHTMLSelectElement *nsselect; 00041 } HTMLSelectElement; 00042 00043 #define HTMLSELECT(x) ((IHTMLSelectElement*) &(x)->lpHTMLSelectElementVtbl) 00044 00045 static HRESULT htmlselect_item(HTMLSelectElement *This, int i, IDispatch **ret) 00046 { 00047 nsIDOMHTMLOptionsCollection *nscol; 00048 nsIDOMNode *nsnode; 00049 nsresult nsres; 00050 00051 nsres = nsIDOMHTMLSelectElement_GetOptions(This->nsselect, &nscol); 00052 if(NS_FAILED(nsres)) { 00053 ERR("GetOptions failed: %08x\n", nsres); 00054 return E_FAIL; 00055 } 00056 00057 nsres = nsIDOMHTMLOptionsCollection_Item(nscol, i, &nsnode); 00058 nsIDOMHTMLOptionsCollection_Release(nscol); 00059 if(NS_FAILED(nsres)) { 00060 ERR("Item failed: %08x\n", nsres); 00061 return E_FAIL; 00062 } 00063 00064 if(nsnode) { 00065 HTMLDOMNode *node; 00066 00067 node = get_node(This->element.node.doc, nsnode, TRUE); 00068 nsIDOMNode_Release(nsnode); 00069 if(!node) { 00070 ERR("Could not find node\n"); 00071 return E_FAIL; 00072 } 00073 00074 IHTMLDOMNode_AddRef(HTMLDOMNODE(node)); 00075 *ret = (IDispatch*)HTMLDOMNODE(node); 00076 }else { 00077 *ret = NULL; 00078 } 00079 return S_OK; 00080 } 00081 00082 #define HTMLSELECT_THIS(iface) DEFINE_THIS(HTMLSelectElement, HTMLSelectElement, iface) 00083 00084 static HRESULT WINAPI HTMLSelectElement_QueryInterface(IHTMLSelectElement *iface, 00085 REFIID riid, void **ppv) 00086 { 00087 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00088 00089 return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv); 00090 } 00091 00092 static ULONG WINAPI HTMLSelectElement_AddRef(IHTMLSelectElement *iface) 00093 { 00094 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00095 00096 return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node)); 00097 } 00098 00099 static ULONG WINAPI HTMLSelectElement_Release(IHTMLSelectElement *iface) 00100 { 00101 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00102 00103 return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node)); 00104 } 00105 00106 static HRESULT WINAPI HTMLSelectElement_GetTypeInfoCount(IHTMLSelectElement *iface, UINT *pctinfo) 00107 { 00108 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00109 00110 return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->element.node.dispex), pctinfo); 00111 } 00112 00113 static HRESULT WINAPI HTMLSelectElement_GetTypeInfo(IHTMLSelectElement *iface, UINT iTInfo, 00114 LCID lcid, ITypeInfo **ppTInfo) 00115 { 00116 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00117 00118 return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->element.node.dispex), iTInfo, lcid, ppTInfo); 00119 } 00120 00121 static HRESULT WINAPI HTMLSelectElement_GetIDsOfNames(IHTMLSelectElement *iface, REFIID riid, 00122 LPOLESTR *rgszNames, UINT cNames, 00123 LCID lcid, DISPID *rgDispId) 00124 { 00125 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00126 00127 return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->element.node.dispex), riid, rgszNames, cNames, lcid, rgDispId); 00128 } 00129 00130 static HRESULT WINAPI HTMLSelectElement_Invoke(IHTMLSelectElement *iface, DISPID dispIdMember, 00131 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, 00132 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) 00133 { 00134 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00135 00136 return IDispatchEx_Invoke(DISPATCHEX(&This->element.node.dispex), dispIdMember, riid, lcid, 00137 wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); 00138 } 00139 00140 static HRESULT WINAPI HTMLSelectElement_put_size(IHTMLSelectElement *iface, LONG v) 00141 { 00142 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00143 FIXME("(%p)->(%d)\n", This, v); 00144 return E_NOTIMPL; 00145 } 00146 00147 static HRESULT WINAPI HTMLSelectElement_get_size(IHTMLSelectElement *iface, LONG *p) 00148 { 00149 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00150 FIXME("(%p)->(%p)\n", This, p); 00151 return E_NOTIMPL; 00152 } 00153 00154 static HRESULT WINAPI HTMLSelectElement_put_multiple(IHTMLSelectElement *iface, VARIANT_BOOL v) 00155 { 00156 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00157 FIXME("(%p)->(%x)\n", This, v); 00158 return E_NOTIMPL; 00159 } 00160 00161 static HRESULT WINAPI HTMLSelectElement_get_multiple(IHTMLSelectElement *iface, VARIANT_BOOL *p) 00162 { 00163 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00164 FIXME("(%p)->(%p)\n", This, p); 00165 return E_NOTIMPL; 00166 } 00167 00168 static HRESULT WINAPI HTMLSelectElement_put_name(IHTMLSelectElement *iface, BSTR v) 00169 { 00170 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00171 FIXME("(%p)->(%s)\n", This, debugstr_w(v)); 00172 return E_NOTIMPL; 00173 } 00174 00175 static HRESULT WINAPI HTMLSelectElement_get_name(IHTMLSelectElement *iface, BSTR *p) 00176 { 00177 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00178 nsAString name_str; 00179 const PRUnichar *name = NULL; 00180 nsresult nsres; 00181 00182 TRACE("(%p)->(%p)\n", This, p); 00183 00184 nsAString_Init(&name_str, NULL); 00185 00186 nsres = nsIDOMHTMLSelectElement_GetName(This->nsselect, &name_str); 00187 if(NS_SUCCEEDED(nsres)) { 00188 static const WCHAR wszGarbage[] = {'g','a','r','b','a','g','e',0}; 00189 00190 nsAString_GetData(&name_str, &name); 00191 00192 /* 00193 * Native never returns empty string here. If an element has no name, 00194 * name of previous element or ramdom data is returned. 00195 */ 00196 *p = SysAllocString(*name ? name : wszGarbage); 00197 }else { 00198 ERR("GetName failed: %08x\n", nsres); 00199 } 00200 00201 nsAString_Finish(&name_str); 00202 00203 TRACE("name=%s\n", debugstr_w(*p)); 00204 return S_OK; 00205 } 00206 00207 static HRESULT WINAPI HTMLSelectElement_get_options(IHTMLSelectElement *iface, IDispatch **p) 00208 { 00209 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00210 00211 TRACE("(%p)->(%p)\n", This, p); 00212 00213 *p = (IDispatch*)HTMLSELECT(This); 00214 IDispatch_AddRef(*p); 00215 return S_OK; 00216 } 00217 00218 static HRESULT WINAPI HTMLSelectElement_put_onchange(IHTMLSelectElement *iface, VARIANT v) 00219 { 00220 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00221 00222 TRACE("(%p)->()\n", This); 00223 00224 return set_node_event(&This->element.node, EVENTID_CHANGE, &v); 00225 } 00226 00227 static HRESULT WINAPI HTMLSelectElement_get_onchange(IHTMLSelectElement *iface, VARIANT *p) 00228 { 00229 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00230 FIXME("(%p)->(%p)\n", This, p); 00231 return E_NOTIMPL; 00232 } 00233 00234 static HRESULT WINAPI HTMLSelectElement_put_selectedIndex(IHTMLSelectElement *iface, LONG v) 00235 { 00236 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00237 nsresult nsres; 00238 00239 TRACE("(%p)->(%d)\n", This, v); 00240 00241 nsres = nsIDOMHTMLSelectElement_SetSelectedIndex(This->nsselect, v); 00242 if(NS_FAILED(nsres)) 00243 ERR("SetSelectedIndex failed: %08x\n", nsres); 00244 00245 return S_OK; 00246 } 00247 00248 static HRESULT WINAPI HTMLSelectElement_get_selectedIndex(IHTMLSelectElement *iface, LONG *p) 00249 { 00250 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00251 PRInt32 idx = 0; 00252 nsresult nsres; 00253 00254 TRACE("(%p)->(%p)\n", This, p); 00255 00256 nsres = nsIDOMHTMLSelectElement_GetSelectedIndex(This->nsselect, &idx); 00257 if(NS_FAILED(nsres)) 00258 ERR("GetSelectedIndex failed: %08x\n", nsres); 00259 00260 *p = idx; 00261 return S_OK; 00262 } 00263 00264 static HRESULT WINAPI HTMLSelectElement_get_type(IHTMLSelectElement *iface, BSTR *p) 00265 { 00266 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00267 const PRUnichar *type; 00268 nsAString type_str; 00269 nsresult nsres; 00270 HRESULT hres = S_OK; 00271 00272 TRACE("(%p)->(%p)\n", This, p); 00273 00274 nsAString_Init(&type_str, NULL); 00275 nsres = nsIDOMHTMLSelectElement_GetType(This->nsselect, &type_str); 00276 if(NS_SUCCEEDED(nsres)) { 00277 nsAString_GetData(&type_str, &type); 00278 *p = *type ? SysAllocString(type) : NULL; 00279 }else { 00280 ERR("GetType failed: %08x\n", nsres); 00281 hres = E_FAIL; 00282 } 00283 00284 nsAString_Finish(&type_str); 00285 00286 return hres; 00287 } 00288 00289 static HRESULT WINAPI HTMLSelectElement_put_value(IHTMLSelectElement *iface, BSTR v) 00290 { 00291 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00292 nsAString value_str; 00293 nsresult nsres; 00294 00295 TRACE("(%p)->(%s)\n", This, debugstr_w(v)); 00296 00297 nsAString_InitDepend(&value_str, v); 00298 nsres = nsIDOMHTMLSelectElement_SetValue(This->nsselect, &value_str); 00299 nsAString_Finish(&value_str); 00300 if(NS_FAILED(nsres)) 00301 ERR("SetValue failed: %08x\n", nsres); 00302 00303 return S_OK; 00304 } 00305 00306 static HRESULT WINAPI HTMLSelectElement_get_value(IHTMLSelectElement *iface, BSTR *p) 00307 { 00308 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00309 nsAString value_str; 00310 const PRUnichar *value = NULL; 00311 nsresult nsres; 00312 00313 TRACE("(%p)->(%p)\n", This, p); 00314 00315 nsAString_Init(&value_str, NULL); 00316 00317 nsres = nsIDOMHTMLSelectElement_GetValue(This->nsselect, &value_str); 00318 if(NS_SUCCEEDED(nsres)) { 00319 nsAString_GetData(&value_str, &value); 00320 *p = *value ? SysAllocString(value) : NULL; 00321 }else { 00322 ERR("GetValue failed: %08x\n", nsres); 00323 } 00324 00325 nsAString_Finish(&value_str); 00326 00327 TRACE("value=%s\n", debugstr_w(*p)); 00328 return S_OK; 00329 } 00330 00331 static HRESULT WINAPI HTMLSelectElement_put_disabled(IHTMLSelectElement *iface, VARIANT_BOOL v) 00332 { 00333 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00334 nsresult nsres; 00335 00336 TRACE("(%p)->(%x)\n", This, v); 00337 00338 nsres = nsIDOMHTMLSelectElement_SetDisabled(This->nsselect, v != VARIANT_FALSE); 00339 if(NS_FAILED(nsres)) { 00340 ERR("SetDisabled failed: %08x\n", nsres); 00341 return E_FAIL; 00342 } 00343 00344 return S_OK; 00345 } 00346 00347 static HRESULT WINAPI HTMLSelectElement_get_disabled(IHTMLSelectElement *iface, VARIANT_BOOL *p) 00348 { 00349 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00350 PRBool disabled = FALSE; 00351 nsresult nsres; 00352 00353 TRACE("(%p)->(%p)\n", This, p); 00354 00355 nsres = nsIDOMHTMLSelectElement_GetDisabled(This->nsselect, &disabled); 00356 if(NS_FAILED(nsres)) { 00357 ERR("GetDisabled failed: %08x\n", nsres); 00358 return E_FAIL; 00359 } 00360 00361 *p = disabled ? VARIANT_TRUE : VARIANT_FALSE; 00362 return S_OK; 00363 } 00364 00365 static HRESULT WINAPI HTMLSelectElement_get_form(IHTMLSelectElement *iface, IHTMLFormElement **p) 00366 { 00367 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00368 FIXME("(%p)->(%p)\n", This, p); 00369 return E_NOTIMPL; 00370 } 00371 00372 static HRESULT WINAPI HTMLSelectElement_add(IHTMLSelectElement *iface, IHTMLElement *element, 00373 VARIANT before) 00374 { 00375 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00376 IHTMLDOMNode *node, *tmp; 00377 HRESULT hres; 00378 00379 FIXME("(%p)->(%p %s): semi-stub\n", This, element, debugstr_variant(&before)); 00380 00381 if(V_VT(&before) != VT_EMPTY) { 00382 FIXME("unhandled before %s\n", debugstr_variant(&before)); 00383 return E_NOTIMPL; 00384 } 00385 00386 hres = IHTMLElement_QueryInterface(element, &IID_IHTMLDOMNode, (void**)&node); 00387 if(FAILED(hres)) 00388 return hres; 00389 00390 hres = IHTMLDOMNode_appendChild(HTMLDOMNODE(&This->element.node), node, &tmp); 00391 IHTMLDOMNode_Release(node); 00392 if(SUCCEEDED(hres) && tmp) 00393 IHTMLDOMNode_Release(tmp); 00394 00395 return hres; 00396 } 00397 00398 static HRESULT WINAPI HTMLSelectElement_remove(IHTMLSelectElement *iface, LONG index) 00399 { 00400 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00401 FIXME("(%p)->(%d)\n", This, index); 00402 return E_NOTIMPL; 00403 } 00404 00405 static HRESULT WINAPI HTMLSelectElement_put_length(IHTMLSelectElement *iface, LONG v) 00406 { 00407 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00408 nsresult nsres; 00409 00410 TRACE("(%p)->(%d)\n", This, v); 00411 00412 nsres = nsIDOMHTMLSelectElement_SetLength(This->nsselect, v); 00413 if(NS_FAILED(nsres)) 00414 ERR("SetLength failed: %08x\n", nsres); 00415 00416 return S_OK; 00417 } 00418 00419 static HRESULT WINAPI HTMLSelectElement_get_length(IHTMLSelectElement *iface, LONG *p) 00420 { 00421 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00422 PRUint32 length = 0; 00423 nsresult nsres; 00424 00425 TRACE("(%p)->(%p)\n", This, p); 00426 00427 nsres = nsIDOMHTMLSelectElement_GetLength(This->nsselect, &length); 00428 if(NS_FAILED(nsres)) 00429 ERR("GetLength failed: %08x\n", nsres); 00430 00431 *p = length; 00432 00433 TRACE("ret %d\n", *p); 00434 return S_OK; 00435 } 00436 00437 static HRESULT WINAPI HTMLSelectElement_get__newEnum(IHTMLSelectElement *iface, IUnknown **p) 00438 { 00439 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00440 FIXME("(%p)->(%p)\n", This, p); 00441 return E_NOTIMPL; 00442 } 00443 00444 static HRESULT WINAPI HTMLSelectElement_item(IHTMLSelectElement *iface, VARIANT name, 00445 VARIANT index, IDispatch **pdisp) 00446 { 00447 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00448 00449 TRACE("(%p)->(%s %s %p)\n", This, debugstr_variant(&name), debugstr_variant(&index), pdisp); 00450 00451 if(!pdisp) 00452 return E_POINTER; 00453 *pdisp = NULL; 00454 00455 if(V_VT(&name) == VT_I4) { 00456 if(V_I4(&name) < 0) 00457 return E_INVALIDARG; 00458 return htmlselect_item(This, V_I4(&name), pdisp); 00459 } 00460 00461 FIXME("Unsupported args\n"); 00462 return E_NOTIMPL; 00463 } 00464 00465 static HRESULT WINAPI HTMLSelectElement_tags(IHTMLSelectElement *iface, VARIANT tagName, 00466 IDispatch **pdisp) 00467 { 00468 HTMLSelectElement *This = HTMLSELECT_THIS(iface); 00469 FIXME("(%p)->(v %p)\n", This, pdisp); 00470 return E_NOTIMPL; 00471 } 00472 00473 #undef HTMLSELECT_THIS 00474 00475 static const IHTMLSelectElementVtbl HTMLSelectElementVtbl = { 00476 HTMLSelectElement_QueryInterface, 00477 HTMLSelectElement_AddRef, 00478 HTMLSelectElement_Release, 00479 HTMLSelectElement_GetTypeInfoCount, 00480 HTMLSelectElement_GetTypeInfo, 00481 HTMLSelectElement_GetIDsOfNames, 00482 HTMLSelectElement_Invoke, 00483 HTMLSelectElement_put_size, 00484 HTMLSelectElement_get_size, 00485 HTMLSelectElement_put_multiple, 00486 HTMLSelectElement_get_multiple, 00487 HTMLSelectElement_put_name, 00488 HTMLSelectElement_get_name, 00489 HTMLSelectElement_get_options, 00490 HTMLSelectElement_put_onchange, 00491 HTMLSelectElement_get_onchange, 00492 HTMLSelectElement_put_selectedIndex, 00493 HTMLSelectElement_get_selectedIndex, 00494 HTMLSelectElement_get_type, 00495 HTMLSelectElement_put_value, 00496 HTMLSelectElement_get_value, 00497 HTMLSelectElement_put_disabled, 00498 HTMLSelectElement_get_disabled, 00499 HTMLSelectElement_get_form, 00500 HTMLSelectElement_add, 00501 HTMLSelectElement_remove, 00502 HTMLSelectElement_put_length, 00503 HTMLSelectElement_get_length, 00504 HTMLSelectElement_get__newEnum, 00505 HTMLSelectElement_item, 00506 HTMLSelectElement_tags 00507 }; 00508 00509 #define HTMLSELECT_NODE_THIS(iface) DEFINE_THIS2(HTMLSelectElement, element.node, iface) 00510 00511 static HRESULT HTMLSelectElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) 00512 { 00513 HTMLSelectElement *This = HTMLSELECT_NODE_THIS(iface); 00514 00515 *ppv = NULL; 00516 00517 if(IsEqualGUID(&IID_IUnknown, riid)) { 00518 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); 00519 *ppv = HTMLSELECT(This); 00520 }else if(IsEqualGUID(&IID_IDispatch, riid)) { 00521 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); 00522 *ppv = HTMLSELECT(This); 00523 }else if(IsEqualGUID(&IID_IHTMLSelectElement, riid)) { 00524 TRACE("(%p)->(IID_IHTMLSelectElement %p)\n", This, ppv); 00525 *ppv = HTMLSELECT(This); 00526 } 00527 00528 if(*ppv) { 00529 IUnknown_AddRef((IUnknown*)*ppv); 00530 return S_OK; 00531 } 00532 00533 return HTMLElement_QI(&This->element.node, riid, ppv); 00534 } 00535 00536 static void HTMLSelectElement_destructor(HTMLDOMNode *iface) 00537 { 00538 HTMLSelectElement *This = HTMLSELECT_NODE_THIS(iface); 00539 00540 nsIDOMHTMLSelectElement_Release(This->nsselect); 00541 00542 HTMLElement_destructor(&This->element.node); 00543 } 00544 00545 static HRESULT HTMLSelectElementImpl_put_disabled(HTMLDOMNode *iface, VARIANT_BOOL v) 00546 { 00547 HTMLSelectElement *This = HTMLSELECT_NODE_THIS(iface); 00548 return IHTMLSelectElement_put_disabled(HTMLSELECT(This), v); 00549 } 00550 00551 static HRESULT HTMLSelectElementImpl_get_disabled(HTMLDOMNode *iface, VARIANT_BOOL *p) 00552 { 00553 HTMLSelectElement *This = HTMLSELECT_NODE_THIS(iface); 00554 return IHTMLSelectElement_get_disabled(HTMLSELECT(This), p); 00555 } 00556 00557 #define DISPID_OPTIONCOL_0 MSHTML_DISPID_CUSTOM_MIN 00558 00559 static HRESULT HTMLSelectElement_get_dispid(HTMLDOMNode *iface, BSTR name, DWORD flags, DISPID *dispid) 00560 { 00561 const WCHAR *ptr; 00562 DWORD idx = 0; 00563 00564 for(ptr = name; *ptr && isdigitW(*ptr); ptr++) { 00565 idx = idx*10 + (*ptr-'0'); 00566 if(idx > MSHTML_CUSTOM_DISPID_CNT) { 00567 WARN("too big idx\n"); 00568 return DISP_E_UNKNOWNNAME; 00569 } 00570 } 00571 if(*ptr) 00572 return DISP_E_UNKNOWNNAME; 00573 00574 *dispid = DISPID_OPTIONCOL_0 + idx; 00575 return S_OK; 00576 } 00577 00578 static HRESULT HTMLSelectElement_invoke(HTMLDOMNode *iface, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, 00579 VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) 00580 { 00581 HTMLSelectElement *This = HTMLSELECT_NODE_THIS(iface); 00582 00583 TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, flags, params, res, ei, caller); 00584 00585 switch(flags) { 00586 case DISPATCH_PROPERTYGET: { 00587 IDispatch *ret; 00588 HRESULT hres; 00589 00590 hres = htmlselect_item(This, id-DISPID_OPTIONCOL_0, &ret); 00591 if(FAILED(hres)) 00592 return hres; 00593 00594 if(ret) { 00595 V_VT(res) = VT_DISPATCH; 00596 V_DISPATCH(res) = ret; 00597 }else { 00598 V_VT(res) = VT_NULL; 00599 } 00600 break; 00601 } 00602 00603 default: 00604 FIXME("unimplemented flags %x\n", flags); 00605 return E_NOTIMPL; 00606 } 00607 00608 return S_OK; 00609 } 00610 00611 #undef HTMLSELECT_NODE_THIS 00612 00613 static const NodeImplVtbl HTMLSelectElementImplVtbl = { 00614 HTMLSelectElement_QI, 00615 HTMLSelectElement_destructor, 00616 NULL, 00617 NULL, 00618 HTMLSelectElementImpl_put_disabled, 00619 HTMLSelectElementImpl_get_disabled, 00620 NULL, 00621 NULL, 00622 HTMLSelectElement_get_dispid, 00623 HTMLSelectElement_invoke 00624 }; 00625 00626 static const tid_t HTMLSelectElement_tids[] = { 00627 HTMLELEMENT_TIDS, 00628 IHTMLSelectElement_tid, 00629 0 00630 }; 00631 00632 static dispex_static_data_t HTMLSelectElement_dispex = { 00633 NULL, 00634 DispHTMLSelectElement_tid, 00635 NULL, 00636 HTMLSelectElement_tids 00637 }; 00638 00639 HTMLElement *HTMLSelectElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem) 00640 { 00641 HTMLSelectElement *ret = heap_alloc_zero(sizeof(HTMLSelectElement)); 00642 nsresult nsres; 00643 00644 ret->lpHTMLSelectElementVtbl = &HTMLSelectElementVtbl; 00645 ret->element.node.vtbl = &HTMLSelectElementImplVtbl; 00646 00647 HTMLElement_Init(&ret->element, doc, nselem, &HTMLSelectElement_dispex); 00648 00649 nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLSelectElement, 00650 (void**)&ret->nsselect); 00651 if(NS_FAILED(nsres)) 00652 ERR("Could not get nsIDOMHTMLSelectElement interfce: %08x\n", nsres); 00653 00654 return &ret->element; 00655 } Generated on Sun May 27 2012 04:24:58 for ReactOS by
1.7.6.1
|