ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

htmlselect.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.