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

dispex.c
Go to the documentation of this file.
00001 /*
00002  * Copyright 2008 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 #define COBJMACROS
00020 
00021 #include "config.h"
00022 
00023 #include <stdarg.h>
00024 #include <assert.h>
00025 #include "windef.h"
00026 #include "winbase.h"
00027 #include "winuser.h"
00028 #include "winnls.h"
00029 #include "ole2.h"
00030 #include "msxml2.h"
00031 #include "wininet.h"
00032 #include "urlmon.h"
00033 #include "winreg.h"
00034 #include "shlwapi.h"
00035 
00036 #include "wine/debug.h"
00037 #include "wine/list.h"
00038 #include "wine/unicode.h"
00039 
00040 #include "msxml_private.h"
00041 
00042 WINE_DEFAULT_DEBUG_CHANNEL(msxml);
00043 
00044 #define DISPATCHEX(x)  ((IDispatchEx*)  &(x)->lpIDispatchExVtbl)
00045 
00046 typedef struct {
00047     DISPID id;
00048     BSTR name;
00049     enum tid_t tid;
00050 } func_info_t;
00051 
00052 struct dispex_data_t {
00053     DWORD func_cnt;
00054     func_info_t *funcs;
00055     func_info_t **name_table;
00056 
00057     struct list entry;
00058 };
00059 
00060 typedef struct {
00061     VARIANT var;
00062     LPWSTR name;
00063 } dynamic_prop_t;
00064 
00065 struct dispex_dynamic_data_t {
00066     DWORD buf_size;
00067     DWORD prop_cnt;
00068     dynamic_prop_t *props;
00069 };
00070 
00071 #define DISPID_DYNPROP_0    0x50000000
00072 #define DISPID_DYNPROP_MAX  0x5fffffff
00073 
00074 static struct list dispex_data_list = LIST_INIT(dispex_data_list);
00075 static ITypeLib *typelib;
00076 static ITypeInfo *typeinfos[LAST_tid];
00077 
00078 static REFIID tid_ids[] = {
00079     &IID_IXMLDOMAttribute,
00080     &IID_IXMLDOMCDATASection,
00081     &IID_IXMLDOMComment,
00082     &IID_IXMLDOMDocument,
00083     &IID_IXMLDOMDocument2,
00084     &IID_IXMLDOMDocumentFragment,
00085     &IID_IXMLDOMElement,
00086     &IID_IXMLDOMEntityReference,
00087     &IID_IXMLDOMImplementation,
00088     &IID_IXMLDOMNamedNodeMap,
00089     &IID_IXMLDOMNode,
00090     &IID_IXMLDOMNodeList,
00091     &IID_IXMLDOMParseError,
00092     &IID_IXMLDOMProcessingInstruction,
00093     &IID_IXMLDOMSchemaCollection,
00094     &IID_IXMLDOMSelection,
00095     &IID_IXMLDOMText,
00096     &IID_IXMLElement,
00097     &IID_IXMLDOMDocument,
00098     &IID_IXMLHTTPRequest,
00099     &IID_IVBSAXAttributes,
00100     &IID_IVBSAXContentHandler,
00101     &IID_IVBSAXDeclHandler,
00102     &IID_IVBSAXDTDHandler,
00103     &IID_IVBSAXEntityResolver,
00104     &IID_IVBSAXErrorHandler,
00105     &IID_IVBSAXLexicalHandler,
00106     &IID_IVBSAXLocator,
00107     &IID_IVBSAXXMLFilter,
00108     &IID_IVBSAXXMLReader,
00109     &IID_IMXAttributes,
00110     &IID_IMXReaderControl,
00111     &IID_IMXWriter,
00112 };
00113 
00114 HRESULT get_typeinfo(enum tid_t tid, ITypeInfo **typeinfo)
00115 {
00116     HRESULT hres;
00117 
00118     if(!typelib) {
00119         ITypeLib *tl;
00120 
00121         hres = LoadRegTypeLib(&LIBID_MSXML2, 3, 0, LOCALE_SYSTEM_DEFAULT, &tl);
00122         if(FAILED(hres)) {
00123             ERR("LoadRegTypeLib failed: %08x\n", hres);
00124             return hres;
00125         }
00126 
00127         if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL))
00128             ITypeLib_Release(tl);
00129     }
00130 
00131     if(!typeinfos[tid]) {
00132         ITypeInfo *typeinfo;
00133 
00134         hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &typeinfo);
00135         if(FAILED(hres)) {
00136             ERR("GetTypeInfoOfGuid failed: %08x\n", hres);
00137             return hres;
00138         }
00139 
00140         if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), typeinfo, NULL))
00141             ITypeInfo_Release(typeinfo);
00142     }
00143 
00144     *typeinfo = typeinfos[tid];
00145 
00146     ITypeInfo_AddRef(typeinfos[tid]);
00147     return S_OK;
00148 }
00149 
00150 void release_typelib(void)
00151 {
00152     dispex_data_t *iter;
00153     unsigned i;
00154 
00155     while(!list_empty(&dispex_data_list)) {
00156         iter = LIST_ENTRY(list_head(&dispex_data_list), dispex_data_t, entry);
00157         list_remove(&iter->entry);
00158 
00159         for(i=0; i < iter->func_cnt; i++)
00160             SysFreeString(iter->funcs[i].name);
00161 
00162         heap_free(iter->funcs);
00163         heap_free(iter->name_table);
00164         heap_free(iter);
00165     }
00166 
00167     if(!typelib)
00168         return;
00169 
00170     for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++)
00171         if(typeinfos[i])
00172             ITypeInfo_Release(typeinfos[i]);
00173 
00174     ITypeLib_Release(typelib);
00175 }
00176 
00177 static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, DISPID id, ITypeInfo *dti)
00178 {
00179     HRESULT hres;
00180 
00181     if(data->func_cnt && data->funcs[data->func_cnt-1].id == id)
00182         return;
00183 
00184     if(data->func_cnt == *size)
00185         data->funcs = heap_realloc(data->funcs, (*size <<= 1)*sizeof(func_info_t));
00186 
00187     hres = ITypeInfo_GetDocumentation(dti, id, &data->funcs[data->func_cnt].name, NULL, NULL, NULL);
00188     if(FAILED(hres))
00189         return;
00190 
00191     data->funcs[data->func_cnt].id = id;
00192     data->funcs[data->func_cnt].tid = tid;
00193 
00194     data->func_cnt++;
00195 }
00196 
00197 static int dispid_cmp(const void *p1, const void *p2)
00198 {
00199     return ((const func_info_t*)p1)->id - ((const func_info_t*)p2)->id;
00200 }
00201 
00202 static int func_name_cmp(const void *p1, const void *p2)
00203 {
00204     return strcmpiW((*(func_info_t* const*)p1)->name, (*(func_info_t* const*)p2)->name);
00205 }
00206 
00207 static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
00208 {
00209     const tid_t *tid = This->data->iface_tids;
00210     FUNCDESC *funcdesc;
00211     dispex_data_t *data;
00212     DWORD size = 16, i;
00213     ITypeInfo *ti, *dti;
00214     HRESULT hres;
00215 
00216     TRACE("(%p)\n", This);
00217 
00218     hres = get_typeinfo(This->data->disp_tid, &dti);
00219     if(FAILED(hres)) {
00220         ERR("Could not get disp type info: %08x\n", hres);
00221         return NULL;
00222     }
00223 
00224     data = heap_alloc(sizeof(dispex_data_t));
00225     data->func_cnt = 0;
00226     data->funcs = heap_alloc(size*sizeof(func_info_t));
00227     list_add_tail(&dispex_data_list, &data->entry);
00228 
00229     while(*tid) {
00230         hres = get_typeinfo(*tid, &ti);
00231         if(FAILED(hres))
00232             break;
00233 
00234         i=0;
00235         while(1) {
00236             hres = ITypeInfo_GetFuncDesc(ti, i++, &funcdesc);
00237             if(FAILED(hres))
00238                 break;
00239 
00240             add_func_info(data, &size, *tid, funcdesc->memid, dti);
00241             ITypeInfo_ReleaseFuncDesc(ti, funcdesc);
00242         }
00243 
00244         ITypeInfo_Release(ti);
00245         tid++;
00246     }
00247 
00248     if(!data->func_cnt) {
00249         heap_free(data->funcs);
00250         data->funcs = NULL;
00251     }else if(data->func_cnt != size) {
00252         data->funcs = heap_realloc(data->funcs, data->func_cnt * sizeof(func_info_t));
00253     }
00254 
00255     qsort(data->funcs, data->func_cnt, sizeof(func_info_t), dispid_cmp);
00256 
00257     if(data->funcs) {
00258         data->name_table = heap_alloc(data->func_cnt * sizeof(func_info_t*));
00259         for(i=0; i < data->func_cnt; i++)
00260             data->name_table[i] = data->funcs+i;
00261         qsort(data->name_table, data->func_cnt, sizeof(func_info_t*), func_name_cmp);
00262     }else {
00263         data->name_table = NULL;
00264     }
00265 
00266     ITypeInfo_Release(dti);
00267     return data;
00268 }
00269 
00270 static CRITICAL_SECTION cs_dispex_static_data;
00271 static CRITICAL_SECTION_DEBUG cs_dispex_static_data_dbg =
00272 {
00273     0, 0, &cs_dispex_static_data,
00274     { &cs_dispex_static_data_dbg.ProcessLocksList, &cs_dispex_static_data_dbg.ProcessLocksList },
00275       0, 0, { (DWORD_PTR)(__FILE__ ": dispex_static_data") }
00276 };
00277 static CRITICAL_SECTION cs_dispex_static_data = { &cs_dispex_static_data_dbg, -1, 0, 0, 0, 0 };
00278 
00279 
00280 static dispex_data_t *get_dispex_data(DispatchEx *This)
00281 {
00282     if(This->data->data)
00283         return This->data->data;
00284 
00285     EnterCriticalSection(&cs_dispex_static_data);
00286 
00287     if(!This->data->data)
00288         This->data->data = preprocess_dispex_data(This);
00289 
00290     LeaveCriticalSection(&cs_dispex_static_data);
00291 
00292     return This->data->data;
00293 }
00294 
00295 static inline BOOL is_custom_dispid(DISPID id)
00296 {
00297     return MSXML_DISPID_CUSTOM_MIN <= id && id <= MSXML_DISPID_CUSTOM_MAX;
00298 }
00299 
00300 static inline BOOL is_dynamic_dispid(DISPID id)
00301 {
00302     return DISPID_DYNPROP_0 <= id && id <= DISPID_DYNPROP_MAX;
00303 }
00304 
00305 static inline DispatchEx *impl_from_IDispatchEx(IDispatchEx *iface)
00306 {
00307     return (DispatchEx*)((char*)iface - FIELD_OFFSET(DispatchEx, lpIDispatchExVtbl));
00308 }
00309 
00310 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
00311 {
00312     DispatchEx *This = impl_from_IDispatchEx(iface);
00313 
00314     return IUnknown_QueryInterface(This->outer, riid, ppv);
00315 }
00316 
00317 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
00318 {
00319     DispatchEx *This = impl_from_IDispatchEx(iface);
00320 
00321     return IUnknown_AddRef(This->outer);
00322 }
00323 
00324 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
00325 {
00326     DispatchEx *This = impl_from_IDispatchEx(iface);
00327 
00328     return IUnknown_Release(This->outer);
00329 }
00330 
00331 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
00332 {
00333     DispatchEx *This = impl_from_IDispatchEx(iface);
00334 
00335     TRACE("(%p)->(%p)\n", This, pctinfo);
00336 
00337     *pctinfo = 1;
00338     return S_OK;
00339 }
00340 
00341 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
00342                                               LCID lcid, ITypeInfo **ppTInfo)
00343 {
00344     DispatchEx *This = impl_from_IDispatchEx(iface);
00345 
00346     TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
00347 
00348     return get_typeinfo(This->data->disp_tid, ppTInfo);
00349 }
00350 
00351 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
00352                                                 LPOLESTR *rgszNames, UINT cNames,
00353                                                 LCID lcid, DISPID *rgDispId)
00354 {
00355     DispatchEx *This = impl_from_IDispatchEx(iface);
00356     UINT i;
00357     HRESULT hres;
00358 
00359     TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
00360           lcid, rgDispId);
00361 
00362     for(i=0; i < cNames; i++) {
00363         hres = IDispatchEx_GetDispID(DISPATCHEX(This), rgszNames[i], 0, rgDispId+i);
00364         if(FAILED(hres))
00365             return hres;
00366     }
00367 
00368     return S_OK;
00369 }
00370 
00371 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
00372                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
00373                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
00374 {
00375     DispatchEx *This = impl_from_IDispatchEx(iface);
00376 
00377     TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
00378           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
00379 
00380     return IDispatchEx_InvokeEx(DISPATCHEX(This), dispIdMember, lcid, wFlags,
00381                                 pDispParams, pVarResult, pExcepInfo, NULL);
00382 }
00383 
00384 static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
00385 {
00386     DispatchEx *This = impl_from_IDispatchEx(iface);
00387     dispex_data_t *data;
00388     int min, max, n, c;
00389 
00390     TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid);
00391 
00392     if(grfdex & ~(fdexNameCaseSensitive|fdexNameEnsure|fdexNameImplicit))
00393         FIXME("Unsupported grfdex %x\n", grfdex);
00394 
00395     data = get_dispex_data(This);
00396     if(!data)
00397         return E_FAIL;
00398 
00399     min = 0;
00400     max = data->func_cnt-1;
00401 
00402     while(min <= max) {
00403         n = (min+max)/2;
00404 
00405         c = strcmpiW(data->name_table[n]->name, bstrName);
00406         if(!c) {
00407             if((grfdex & fdexNameCaseSensitive) && strcmpW(data->name_table[n]->name, bstrName))
00408                 break;
00409 
00410             *pid = data->name_table[n]->id;
00411             return S_OK;
00412         }
00413 
00414         if(c > 0)
00415             max = n-1;
00416         else
00417             min = n+1;
00418     }
00419 
00420     if(This->dynamic_data) {
00421         unsigned i;
00422 
00423         for(i=0; i < This->dynamic_data->prop_cnt; i++) {
00424             if(!strcmpW(This->dynamic_data->props[i].name, bstrName)) {
00425                 *pid = DISPID_DYNPROP_0 + i;
00426                 return S_OK;
00427             }
00428         }
00429     }
00430 
00431     if(This->data->vtbl && This->data->vtbl->get_dispid) {
00432         HRESULT hres;
00433 
00434         hres = This->data->vtbl->get_dispid(This->outer, bstrName, grfdex, pid);
00435         if(hres != DISP_E_UNKNOWNNAME)
00436             return hres;
00437     }
00438 
00439     if(grfdex & fdexNameEnsure) {
00440         dispex_dynamic_data_t *dynamic_data;
00441 
00442         TRACE("creating dynamic prop %s\n", debugstr_w(bstrName));
00443 
00444         if(This->dynamic_data) {
00445             dynamic_data = This->dynamic_data;
00446         }else {
00447             dynamic_data = This->dynamic_data = heap_alloc_zero(sizeof(dispex_dynamic_data_t));
00448             if(!dynamic_data)
00449                 return E_OUTOFMEMORY;
00450         }
00451 
00452         if(!dynamic_data->buf_size) {
00453             dynamic_data->props = heap_alloc(sizeof(dynamic_prop_t)*4);
00454             if(!dynamic_data->props)
00455                 return E_OUTOFMEMORY;
00456             dynamic_data->buf_size = 4;
00457         }else if(dynamic_data->buf_size == dynamic_data->prop_cnt) {
00458             dynamic_prop_t *new_props;
00459 
00460             new_props = heap_realloc(dynamic_data->props, sizeof(dynamic_prop_t)*(dynamic_data->buf_size<<1));
00461             if(!new_props)
00462                 return E_OUTOFMEMORY;
00463 
00464             dynamic_data->props = new_props;
00465             dynamic_data->buf_size <<= 1;
00466         }
00467 
00468         dynamic_data->props[dynamic_data->prop_cnt].name = heap_strdupW(bstrName);
00469         VariantInit(&dynamic_data->props[dynamic_data->prop_cnt].var);
00470         *pid = DISPID_DYNPROP_0 + dynamic_data->prop_cnt++;
00471 
00472         return S_OK;
00473     }
00474 
00475     TRACE("not found %s\n", debugstr_w(bstrName));
00476     return DISP_E_UNKNOWNNAME;
00477 }
00478 
00479 static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
00480         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
00481 {
00482     DispatchEx *This = impl_from_IDispatchEx(iface);
00483     IUnknown *unk;
00484     ITypeInfo *ti;
00485     dispex_data_t *data;
00486     UINT argerr=0;
00487     int min, max, n;
00488     HRESULT hres;
00489 
00490     TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
00491 
00492     if(is_custom_dispid(id) && This->data->vtbl && This->data->vtbl->invoke)
00493         return This->data->vtbl->invoke(This->outer, id, lcid, wFlags, pdp, pvarRes, pei);
00494 
00495     if(wFlags == DISPATCH_CONSTRUCT) {
00496         FIXME("DISPATCH_CONSTRUCT not implemented\n");
00497         return E_NOTIMPL;
00498     }
00499 
00500     if(is_dynamic_dispid(id)) {
00501         DWORD idx = id - DISPID_DYNPROP_0;
00502         VARIANT *var;
00503 
00504         if(!This->dynamic_data || This->dynamic_data->prop_cnt <= idx)
00505             return DISP_E_UNKNOWNNAME;
00506 
00507         var = &This->dynamic_data->props[idx].var;
00508 
00509         switch(wFlags) {
00510         case INVOKE_PROPERTYGET:
00511             return VariantCopy(pvarRes, var);
00512         case INVOKE_PROPERTYPUT:
00513             VariantClear(var);
00514             return VariantCopy(var, pdp->rgvarg);
00515         default:
00516             FIXME("unhandled wFlags %x\n", wFlags);
00517             return E_NOTIMPL;
00518         }
00519     }
00520 
00521     data = get_dispex_data(This);
00522     if(!data)
00523         return E_FAIL;
00524 
00525     min = 0;
00526     max = data->func_cnt-1;
00527 
00528     while(min <= max) {
00529         n = (min+max)/2;
00530 
00531         if(data->funcs[n].id == id)
00532             break;
00533 
00534         if(data->funcs[n].id < id)
00535             min = n+1;
00536         else
00537             max = n-1;
00538     }
00539 
00540     if(min > max) {
00541         WARN("invalid id %x\n", id);
00542         return DISP_E_UNKNOWNNAME;
00543     }
00544 
00545     hres = get_typeinfo(data->funcs[n].tid, &ti);
00546     if(FAILED(hres)) {
00547         ERR("Could not get type info: %08x\n", hres);
00548         return hres;
00549     }
00550 
00551     hres = IUnknown_QueryInterface(This->outer, tid_ids[data->funcs[n].tid], (void**)&unk);
00552     if(FAILED(hres)) {
00553         ERR("Could not get iface: %08x\n", hres);
00554         return E_FAIL;
00555     }
00556 
00557     hres = ITypeInfo_Invoke(ti, unk, id, wFlags, pdp, pvarRes, pei, &argerr);
00558 
00559     ITypeInfo_Release(ti);
00560     IUnknown_Release(unk);
00561     return hres;
00562 }
00563 
00564 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
00565 {
00566     DispatchEx *This = impl_from_IDispatchEx(iface);
00567     TRACE("Not implemented in native msxml3 (%p)->(%s %x)\n", This, debugstr_w(bstrName), grfdex);
00568     return E_NOTIMPL;
00569 }
00570 
00571 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
00572 {
00573     DispatchEx *This = impl_from_IDispatchEx(iface);
00574     TRACE("Not implemented in native msxml3 (%p)->(%x)\n", This, id);
00575     return E_NOTIMPL;
00576 }
00577 
00578 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
00579 {
00580     DispatchEx *This = impl_from_IDispatchEx(iface);
00581     TRACE("Not implemented in native msxml3 (%p)->(%x %x %p)\n", This, id, grfdexFetch, pgrfdex);
00582     return E_NOTIMPL;
00583 }
00584 
00585 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
00586 {
00587     DispatchEx *This = impl_from_IDispatchEx(iface);
00588     TRACE("Not implemented in native msxml3 (%p)->(%x %p)\n", This, id, pbstrName);
00589     return E_NOTIMPL;
00590 }
00591 
00592 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
00593 {
00594     DispatchEx *This = impl_from_IDispatchEx(iface);
00595     TRACE(" Not implemented in native msxml3 (%p)->(%x %x %p)\n", This, grfdex, id, pid);
00596     return E_NOTIMPL;
00597 }
00598 
00599 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
00600 {
00601     DispatchEx *This = impl_from_IDispatchEx(iface);
00602     TRACE("Not implemented in native msxml3 (%p)->(%p)\n", This, ppunk);
00603     return E_NOTIMPL;
00604 }
00605 
00606 static IDispatchExVtbl DispatchExVtbl = {
00607     DispatchEx_QueryInterface,
00608     DispatchEx_AddRef,
00609     DispatchEx_Release,
00610     DispatchEx_GetTypeInfoCount,
00611     DispatchEx_GetTypeInfo,
00612     DispatchEx_GetIDsOfNames,
00613     DispatchEx_Invoke,
00614     DispatchEx_GetDispID,
00615     DispatchEx_InvokeEx,
00616     DispatchEx_DeleteMemberByName,
00617     DispatchEx_DeleteMemberByDispID,
00618     DispatchEx_GetMemberProperties,
00619     DispatchEx_GetMemberName,
00620     DispatchEx_GetNextDispID,
00621     DispatchEx_GetNameSpaceParent
00622 };
00623 
00624 BOOL dispex_query_interface(DispatchEx *This, REFIID riid, void **ppv)
00625 {
00626     static const IID IID_UndocumentedScriptIface =
00627         {0x719c3050,0xf9d3,0x11cf,{0xa4,0x93,0x00,0x40,0x05,0x23,0xa8,0xa0}};
00628 
00629     if(IsEqualGUID(&IID_IDispatch, riid)) {
00630         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
00631         *ppv = DISPATCHEX(This);
00632     }else if(IsEqualGUID(&IID_IDispatchEx, riid)) {
00633         TRACE("(%p)->(IID_IDispatchEx %p)\n", This, ppv);
00634         *ppv = DISPATCHEX(This);
00635     }else if(IsEqualGUID(&IID_UndocumentedScriptIface, riid)) {
00636         TRACE("(%p)->(IID_UndocumentedScriptIface %p) returning NULL\n", This, ppv);
00637         *ppv = NULL;
00638     }else if (IsEqualGUID(&IID_IObjectIdentity, riid)) {
00639         TRACE("IID_IObjectIdentity not supported returning NULL\n");
00640         *ppv = NULL;
00641     }else {
00642         return FALSE;
00643     }
00644 
00645     if(*ppv)
00646         IUnknown_AddRef((IUnknown*)*ppv);
00647     return TRUE;
00648 }
00649 
00650 void init_dispex(DispatchEx *dispex, IUnknown *outer, dispex_static_data_t *data)
00651 {
00652     dispex->lpIDispatchExVtbl = &DispatchExVtbl;
00653     dispex->outer = outer;
00654     dispex->data = data;
00655 }

Generated on Sun May 27 2012 04:24:20 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.