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

jscript.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 #include "jscript.h"
00020 #include "engine.h"
00021 #include "objsafe.h"
00022 
00023 #include "wine/debug.h"
00024 
00025 WINE_DEFAULT_DEBUG_CHANNEL(jscript);
00026 
00027 #ifdef _WIN64
00028 
00029 #define CTXARG_T DWORDLONG
00030 #define IActiveScriptParseVtbl IActiveScriptParse64Vtbl
00031 #define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_64Vtbl
00032 
00033 #else
00034 
00035 #define CTXARG_T DWORD
00036 #define IActiveScriptParseVtbl IActiveScriptParse32Vtbl
00037 #define IActiveScriptParseProcedure2Vtbl IActiveScriptParseProcedure2_32Vtbl
00038 
00039 #endif
00040 
00041 typedef struct {
00042     const IActiveScriptVtbl                 *lpIActiveScriptVtbl;
00043     const IActiveScriptParseVtbl            *lpIActiveScriptParseVtbl;
00044     const IActiveScriptParseProcedure2Vtbl  *lpIActiveScriptParseProcedure2Vtbl;
00045     const IActiveScriptPropertyVtbl         *lpIActiveScriptPropertyVtbl;
00046     const IObjectSafetyVtbl                 *lpIObjectSafetyVtbl;
00047 
00048     LONG ref;
00049 
00050     DWORD safeopt;
00051     script_ctx_t *ctx;
00052     LONG thread_id;
00053     LCID lcid;
00054     DWORD version;
00055 
00056     IActiveScriptSite *site;
00057 
00058     parser_ctx_t *queue_head;
00059     parser_ctx_t *queue_tail;
00060 } JScript;
00061 
00062 #define ACTSCRIPT(x)    ((IActiveScript*) &(x)->lpIActiveScriptVtbl)
00063 #define ASPARSE(x)      (&(x)->lpIActiveScriptParseVtbl)
00064 #define ASPARSEPROC(x)  (&(x)->lpIActiveScriptParseProcedure2Vtbl)
00065 #define ACTSCPPROP(x)   (&(x)->lpIActiveScriptPropertyVtbl)
00066 #define OBJSAFETY(x)    (&(x)->lpIObjectSafetyVtbl)
00067 
00068 void script_release(script_ctx_t *ctx)
00069 {
00070     if(--ctx->ref)
00071         return;
00072 
00073     jsheap_free(&ctx->tmp_heap);
00074     SysFreeString(ctx->last_match);
00075     heap_free(ctx);
00076 }
00077 
00078 static void change_state(JScript *This, SCRIPTSTATE state)
00079 {
00080     if(This->ctx->state == state)
00081         return;
00082 
00083     This->ctx->state = state;
00084     IActiveScriptSite_OnStateChange(This->site, state);
00085 }
00086 
00087 static inline BOOL is_started(script_ctx_t *ctx)
00088 {
00089     return ctx->state == SCRIPTSTATE_STARTED
00090         || ctx->state == SCRIPTSTATE_CONNECTED
00091         || ctx->state == SCRIPTSTATE_DISCONNECTED;
00092 }
00093 
00094 static HRESULT exec_global_code(JScript *This, parser_ctx_t *parser_ctx)
00095 {
00096     exec_ctx_t *exec_ctx;
00097     jsexcept_t jsexcept;
00098     HRESULT hres;
00099 
00100     hres = create_exec_ctx(This->ctx, NULL, This->ctx->global, NULL, &exec_ctx);
00101     if(FAILED(hres))
00102         return hres;
00103 
00104     IActiveScriptSite_OnEnterScript(This->site);
00105 
00106     memset(&jsexcept, 0, sizeof(jsexcept));
00107     hres = exec_source(exec_ctx, parser_ctx, parser_ctx->source, EXECT_PROGRAM, &jsexcept, NULL);
00108     VariantClear(&jsexcept.var);
00109     exec_release(exec_ctx);
00110 
00111     IActiveScriptSite_OnLeaveScript(This->site);
00112     return hres;
00113 }
00114 
00115 static void clear_script_queue(JScript *This)
00116 {
00117     parser_ctx_t *iter, *iter2;
00118 
00119     if(!This->queue_head)
00120         return;
00121 
00122     iter = This->queue_head;
00123     while(iter) {
00124         iter2 = iter->next;
00125         iter->next = NULL;
00126         parser_release(iter);
00127         iter = iter2;
00128     }
00129 
00130     This->queue_head = This->queue_tail = NULL;
00131 }
00132 
00133 static void exec_queued_code(JScript *This)
00134 {
00135     parser_ctx_t *iter;
00136 
00137     for(iter = This->queue_head; iter; iter = iter->next)
00138         exec_global_code(This, iter);
00139 
00140     clear_script_queue(This);
00141 }
00142 
00143 static HRESULT set_ctx_site(JScript *This)
00144 {
00145     HRESULT hres;
00146 
00147     This->ctx->lcid = This->lcid;
00148 
00149     hres = init_global(This->ctx);
00150     if(FAILED(hres))
00151         return hres;
00152 
00153     IActiveScriptSite_AddRef(This->site);
00154     This->ctx->site = This->site;
00155 
00156     change_state(This, SCRIPTSTATE_INITIALIZED);
00157     return S_OK;
00158 }
00159 
00160 typedef struct {
00161     const IServiceProviderVtbl *lpIServiceProviderVtbl;
00162 
00163     LONG ref;
00164 
00165     IServiceProvider *sp;
00166 } AXSite;
00167 
00168 #define SERVPROV(x)  ((IServiceProvider*) &(x)->lpIServiceProviderVtbl)
00169 
00170 #define SERVPROV_THIS(iface) DEFINE_THIS(AXSite, IServiceProvider, iface)
00171 
00172 static HRESULT WINAPI AXSite_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
00173 {
00174     AXSite *This = SERVPROV_THIS(iface);
00175 
00176     if(IsEqualGUID(&IID_IUnknown, riid)) {
00177         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
00178         *ppv = SERVPROV(This);
00179     }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
00180         TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
00181         *ppv = SERVPROV(This);
00182     }else {
00183         TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
00184         *ppv = NULL;
00185         return E_NOINTERFACE;
00186     }
00187 
00188     IUnknown_AddRef((IUnknown*)*ppv);
00189     return S_OK;
00190 }
00191 
00192 static ULONG WINAPI AXSite_AddRef(IServiceProvider *iface)
00193 {
00194     AXSite *This = SERVPROV_THIS(iface);
00195     LONG ref = InterlockedIncrement(&This->ref);
00196 
00197     TRACE("(%p) ref=%d\n", This, ref);
00198 
00199     return ref;
00200 }
00201 
00202 static ULONG WINAPI AXSite_Release(IServiceProvider *iface)
00203 {
00204     AXSite *This = SERVPROV_THIS(iface);
00205     LONG ref = InterlockedDecrement(&This->ref);
00206 
00207     TRACE("(%p) ref=%d\n", This, ref);
00208 
00209     if(!ref)
00210         heap_free(This);
00211 
00212     return ref;
00213 }
00214 
00215 static HRESULT WINAPI AXSite_QueryService(IServiceProvider *iface,
00216         REFGUID guidService, REFIID riid, void **ppv)
00217 {
00218     AXSite *This = SERVPROV_THIS(iface);
00219 
00220     TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
00221 
00222     return IServiceProvider_QueryService(This->sp, guidService, riid, ppv);
00223 }
00224 
00225 #undef SERVPROV_THIS
00226 
00227 static IServiceProviderVtbl AXSiteVtbl = {
00228     AXSite_QueryInterface,
00229     AXSite_AddRef,
00230     AXSite_Release,
00231     AXSite_QueryService
00232 };
00233 
00234 IUnknown *create_ax_site(script_ctx_t *ctx)
00235 {
00236     IServiceProvider *sp;
00237     AXSite *ret;
00238     HRESULT hres;
00239 
00240     hres = IActiveScriptSite_QueryInterface(ctx->site, &IID_IServiceProvider, (void**)&sp);
00241     if(FAILED(hres)) {
00242         ERR("Could not get IServiceProvider iface: %08x\n", hres);
00243         return NULL;
00244     }
00245 
00246     ret = heap_alloc(sizeof(AXSite));
00247     if(!ret) {
00248         IServiceProvider_Release(sp);
00249         return NULL;
00250     }
00251 
00252     ret->lpIServiceProviderVtbl = &AXSiteVtbl;
00253     ret->ref = 1;
00254     ret->sp = sp;
00255 
00256     return (IUnknown*)SERVPROV(ret);
00257 }
00258 
00259 #define ACTSCRIPT_THIS(iface) DEFINE_THIS(JScript, IActiveScript, iface)
00260 
00261 static HRESULT WINAPI JScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv)
00262 {
00263     JScript *This = ACTSCRIPT_THIS(iface);
00264 
00265     *ppv = NULL;
00266 
00267     if(IsEqualGUID(riid, &IID_IUnknown)) {
00268         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
00269         *ppv = ACTSCRIPT(This);
00270     }else if(IsEqualGUID(riid, &IID_IActiveScript)) {
00271         TRACE("(%p)->(IID_IActiveScript %p)\n", This, ppv);
00272         *ppv = ACTSCRIPT(This);
00273     }else if(IsEqualGUID(riid, &IID_IActiveScriptParse)) {
00274         TRACE("(%p)->(IID_IActiveScriptParse %p)\n", This, ppv);
00275         *ppv = ASPARSE(This);
00276     }else if(IsEqualGUID(riid, &IID_IActiveScriptParseProcedure)) {
00277         TRACE("(%p)->(IID_IActiveScriptParseProcedure %p)\n", This, ppv);
00278         *ppv = ASPARSEPROC(This);
00279     }else if(IsEqualGUID(riid, &IID_IActiveScriptParseProcedure2)) {
00280         TRACE("(%p)->(IID_IActiveScriptParseProcedure2 %p)\n", This, ppv);
00281         *ppv = ASPARSEPROC(This);
00282     }else if(IsEqualGUID(riid, &IID_IActiveScriptProperty)) {
00283         TRACE("(%p)->(IID_IActiveScriptProperty %p)\n", This, ppv);
00284         *ppv = ACTSCPPROP(This);
00285     }else if(IsEqualGUID(riid, &IID_IObjectSafety)) {
00286         TRACE("(%p)->(IID_IObjectSafety %p)\n", This, ppv);
00287         *ppv = OBJSAFETY(This);
00288     }
00289 
00290     if(*ppv) {
00291         IUnknown_AddRef((IUnknown*)*ppv);
00292         return S_OK;
00293     }
00294 
00295     FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
00296     return E_NOINTERFACE;
00297 }
00298 
00299 static ULONG WINAPI JScript_AddRef(IActiveScript *iface)
00300 {
00301     JScript *This = ACTSCRIPT_THIS(iface);
00302     LONG ref = InterlockedIncrement(&This->ref);
00303 
00304     TRACE("(%p) ref=%d\n", This, ref);
00305 
00306     return ref;
00307 }
00308 
00309 static ULONG WINAPI JScript_Release(IActiveScript *iface)
00310 {
00311     JScript *This = ACTSCRIPT_THIS(iface);
00312     LONG ref = InterlockedDecrement(&This->ref);
00313 
00314     TRACE("(%p) ref=%d\n", iface, ref);
00315 
00316     if(!ref) {
00317         if(This->ctx && This->ctx->state != SCRIPTSTATE_CLOSED)
00318             IActiveScript_Close(ACTSCRIPT(This));
00319         if(This->ctx)
00320             script_release(This->ctx);
00321         heap_free(This);
00322         unlock_module();
00323     }
00324 
00325     return ref;
00326 }
00327 
00328 static HRESULT WINAPI JScript_SetScriptSite(IActiveScript *iface,
00329                                             IActiveScriptSite *pass)
00330 {
00331     JScript *This = ACTSCRIPT_THIS(iface);
00332     LCID lcid;
00333     HRESULT hres;
00334 
00335     TRACE("(%p)->(%p)\n", This, pass);
00336 
00337     if(!pass)
00338         return E_POINTER;
00339 
00340     if(This->site)
00341         return E_UNEXPECTED;
00342 
00343     if(InterlockedCompareExchange(&This->thread_id, GetCurrentThreadId(), 0))
00344         return E_UNEXPECTED;
00345 
00346     This->site = pass;
00347     IActiveScriptSite_AddRef(This->site);
00348 
00349     hres = IActiveScriptSite_GetLCID(This->site, &lcid);
00350     if(hres == S_OK)
00351         This->lcid = lcid;
00352 
00353     return This->ctx ? set_ctx_site(This) : S_OK;
00354 }
00355 
00356 static HRESULT WINAPI JScript_GetScriptSite(IActiveScript *iface, REFIID riid,
00357                                             void **ppvObject)
00358 {
00359     JScript *This = ACTSCRIPT_THIS(iface);
00360     FIXME("(%p)->()\n", This);
00361     return E_NOTIMPL;
00362 }
00363 
00364 static HRESULT WINAPI JScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss)
00365 {
00366     JScript *This = ACTSCRIPT_THIS(iface);
00367 
00368     TRACE("(%p)->(%d)\n", This, ss);
00369 
00370     if(!This->ctx || GetCurrentThreadId() != This->thread_id)
00371         return E_UNEXPECTED;
00372 
00373     switch(ss) {
00374     case SCRIPTSTATE_STARTED:
00375     case SCRIPTSTATE_CONNECTED: /* FIXME */
00376         if(This->ctx->state == SCRIPTSTATE_CLOSED)
00377             return E_UNEXPECTED;
00378 
00379         exec_queued_code(This);
00380         break;
00381     default:
00382         FIXME("unimplemented state %d\n", ss);
00383         return E_NOTIMPL;
00384     }
00385 
00386     change_state(This, ss);
00387     return S_OK;
00388 }
00389 
00390 static HRESULT WINAPI JScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState)
00391 {
00392     JScript *This = ACTSCRIPT_THIS(iface);
00393 
00394     TRACE("(%p)->(%p)\n", This, pssState);
00395 
00396     if(!pssState)
00397         return E_POINTER;
00398 
00399     if(!This->thread_id) {
00400         *pssState = SCRIPTSTATE_UNINITIALIZED;
00401         return S_OK;
00402     }
00403 
00404     if(This->thread_id != GetCurrentThreadId())
00405         return E_UNEXPECTED;
00406 
00407     *pssState = This->ctx ? This->ctx->state : SCRIPTSTATE_UNINITIALIZED;
00408     return S_OK;
00409 }
00410 
00411 static HRESULT WINAPI JScript_Close(IActiveScript *iface)
00412 {
00413     JScript *This = ACTSCRIPT_THIS(iface);
00414 
00415     TRACE("(%p)->()\n", This);
00416 
00417     if(This->thread_id != GetCurrentThreadId())
00418         return E_UNEXPECTED;
00419 
00420     if(This->ctx) {
00421         if(This->ctx->state == SCRIPTSTATE_CONNECTED)
00422             change_state(This, SCRIPTSTATE_DISCONNECTED);
00423 
00424         clear_script_queue(This);
00425 
00426         if(This->ctx->state == SCRIPTSTATE_DISCONNECTED)
00427             change_state(This, SCRIPTSTATE_INITIALIZED);
00428 
00429         if(This->ctx->host_global) {
00430             IDispatch_Release(This->ctx->host_global);
00431             This->ctx->host_global = NULL;
00432         }
00433 
00434         if(This->ctx->named_items) {
00435             named_item_t *iter, *iter2;
00436 
00437             iter = This->ctx->named_items;
00438             while(iter) {
00439                 iter2 = iter->next;
00440 
00441                 if(iter->disp)
00442                     IDispatch_Release(iter->disp);
00443                 heap_free(iter->name);
00444                 heap_free(iter);
00445                 iter = iter2;
00446             }
00447 
00448             This->ctx->named_items = NULL;
00449         }
00450 
00451         if(This->ctx->secmgr) {
00452             IInternetHostSecurityManager_Release(This->ctx->secmgr);
00453             This->ctx->secmgr = NULL;
00454         }
00455 
00456         if(This->ctx->site) {
00457             IActiveScriptSite_Release(This->ctx->site);
00458             This->ctx->site = NULL;
00459         }
00460 
00461         if (This->site)
00462             change_state(This, SCRIPTSTATE_CLOSED);
00463 
00464         if(This->ctx->global) {
00465             jsdisp_release(This->ctx->global);
00466             This->ctx->global = NULL;
00467         }
00468     }
00469 
00470     if(This->site) {
00471         IActiveScriptSite_Release(This->site);
00472         This->site = NULL;
00473     }
00474 
00475     return S_OK;
00476 }
00477 
00478 static HRESULT WINAPI JScript_AddNamedItem(IActiveScript *iface,
00479                                            LPCOLESTR pstrName, DWORD dwFlags)
00480 {
00481     JScript *This = ACTSCRIPT_THIS(iface);
00482     named_item_t *item;
00483     IDispatch *disp = NULL;
00484     HRESULT hres;
00485 
00486     TRACE("(%p)->(%s %x)\n", This, debugstr_w(pstrName), dwFlags);
00487 
00488     if(This->thread_id != GetCurrentThreadId() || !This->ctx || This->ctx->state == SCRIPTSTATE_CLOSED)
00489         return E_UNEXPECTED;
00490 
00491     if(dwFlags & SCRIPTITEM_GLOBALMEMBERS) {
00492         IUnknown *unk;
00493 
00494         hres = IActiveScriptSite_GetItemInfo(This->site, pstrName, SCRIPTINFO_IUNKNOWN, &unk, NULL);
00495         if(FAILED(hres)) {
00496             WARN("GetItemInfo failed: %08x\n", hres);
00497             return hres;
00498         }
00499 
00500         hres = IUnknown_QueryInterface(unk, &IID_IDispatch, (void**)&disp);
00501         IUnknown_Release(unk);
00502         if(FAILED(hres)) {
00503             WARN("object does not implement IDispatch\n");
00504             return hres;
00505         }
00506 
00507         if(This->ctx->host_global)
00508             IDispatch_Release(This->ctx->host_global);
00509         IDispatch_AddRef(disp);
00510         This->ctx->host_global = disp;
00511     }
00512 
00513     item = heap_alloc(sizeof(*item));
00514     if(!item) {
00515         if(disp)
00516             IDispatch_Release(disp);
00517         return E_OUTOFMEMORY;
00518     }
00519 
00520     item->disp = disp;
00521     item->flags = dwFlags;
00522     item->name = heap_strdupW(pstrName);
00523     if(!item->name) {
00524         IDispatch_Release(disp);
00525         heap_free(item);
00526         return E_OUTOFMEMORY;
00527     }
00528 
00529     item->next = This->ctx->named_items;
00530     This->ctx->named_items = item;
00531 
00532     return S_OK;
00533 }
00534 
00535 static HRESULT WINAPI JScript_AddTypeLib(IActiveScript *iface, REFGUID rguidTypeLib,
00536                                          DWORD dwMajor, DWORD dwMinor, DWORD dwFlags)
00537 {
00538     JScript *This = ACTSCRIPT_THIS(iface);
00539     FIXME("(%p)->()\n", This);
00540     return E_NOTIMPL;
00541 }
00542 
00543 static HRESULT WINAPI JScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR pstrItemName,
00544                                                 IDispatch **ppdisp)
00545 {
00546     JScript *This = ACTSCRIPT_THIS(iface);
00547 
00548     TRACE("(%p)->(%p)\n", This, ppdisp);
00549 
00550     if(!ppdisp)
00551         return E_POINTER;
00552 
00553     if(This->thread_id != GetCurrentThreadId() || !This->ctx->global) {
00554         *ppdisp = NULL;
00555         return E_UNEXPECTED;
00556     }
00557 
00558     *ppdisp = (IDispatch*)_IDispatchEx_(This->ctx->global);
00559     IDispatch_AddRef(*ppdisp);
00560     return S_OK;
00561 }
00562 
00563 static HRESULT WINAPI JScript_GetCurrentScriptThreadID(IActiveScript *iface,
00564                                                        SCRIPTTHREADID *pstridThread)
00565 {
00566     JScript *This = ACTSCRIPT_THIS(iface);
00567     FIXME("(%p)->()\n", This);
00568     return E_NOTIMPL;
00569 }
00570 
00571 static HRESULT WINAPI JScript_GetScriptThreadID(IActiveScript *iface,
00572                                                 DWORD dwWin32ThreadId, SCRIPTTHREADID *pstidThread)
00573 {
00574     JScript *This = ACTSCRIPT_THIS(iface);
00575     FIXME("(%p)->()\n", This);
00576     return E_NOTIMPL;
00577 }
00578 
00579 static HRESULT WINAPI JScript_GetScriptThreadState(IActiveScript *iface,
00580         SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE *pstsState)
00581 {
00582     JScript *This = ACTSCRIPT_THIS(iface);
00583     FIXME("(%p)->()\n", This);
00584     return E_NOTIMPL;
00585 }
00586 
00587 static HRESULT WINAPI JScript_InterruptScriptThread(IActiveScript *iface,
00588         SCRIPTTHREADID stidThread, const EXCEPINFO *pexcepinfo, DWORD dwFlags)
00589 {
00590     JScript *This = ACTSCRIPT_THIS(iface);
00591     FIXME("(%p)->()\n", This);
00592     return E_NOTIMPL;
00593 }
00594 
00595 static HRESULT WINAPI JScript_Clone(IActiveScript *iface, IActiveScript **ppscript)
00596 {
00597     JScript *This = ACTSCRIPT_THIS(iface);
00598     FIXME("(%p)->()\n", This);
00599     return E_NOTIMPL;
00600 }
00601 
00602 #undef ACTSCRIPT_THIS
00603 
00604 static const IActiveScriptVtbl JScriptVtbl = {
00605     JScript_QueryInterface,
00606     JScript_AddRef,
00607     JScript_Release,
00608     JScript_SetScriptSite,
00609     JScript_GetScriptSite,
00610     JScript_SetScriptState,
00611     JScript_GetScriptState,
00612     JScript_Close,
00613     JScript_AddNamedItem,
00614     JScript_AddTypeLib,
00615     JScript_GetScriptDispatch,
00616     JScript_GetCurrentScriptThreadID,
00617     JScript_GetScriptThreadID,
00618     JScript_GetScriptThreadState,
00619     JScript_InterruptScriptThread,
00620     JScript_Clone
00621 };
00622 
00623 #define ASPARSE_THIS(iface) DEFINE_THIS(JScript, IActiveScriptParse, iface)
00624 
00625 static HRESULT WINAPI JScriptParse_QueryInterface(IActiveScriptParse *iface, REFIID riid, void **ppv)
00626 {
00627     JScript *This = ASPARSE_THIS(iface);
00628     return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
00629 }
00630 
00631 static ULONG WINAPI JScriptParse_AddRef(IActiveScriptParse *iface)
00632 {
00633     JScript *This = ASPARSE_THIS(iface);
00634     return IActiveScript_AddRef(ACTSCRIPT(This));
00635 }
00636 
00637 static ULONG WINAPI JScriptParse_Release(IActiveScriptParse *iface)
00638 {
00639     JScript *This = ASPARSE_THIS(iface);
00640     return IActiveScript_Release(ACTSCRIPT(This));
00641 }
00642 
00643 static HRESULT WINAPI JScriptParse_InitNew(IActiveScriptParse *iface)
00644 {
00645     JScript *This = ASPARSE_THIS(iface);
00646     script_ctx_t *ctx;
00647 
00648     TRACE("(%p)\n", This);
00649 
00650     if(This->ctx)
00651         return E_UNEXPECTED;
00652 
00653     ctx = heap_alloc_zero(sizeof(script_ctx_t));
00654     if(!ctx)
00655         return E_OUTOFMEMORY;
00656 
00657     ctx->ref = 1;
00658     ctx->state = SCRIPTSTATE_UNINITIALIZED;
00659     ctx->safeopt = This->safeopt;
00660     ctx->version = This->version;
00661     jsheap_init(&ctx->tmp_heap);
00662 
00663     ctx = InterlockedCompareExchangePointer((void**)&This->ctx, ctx, NULL);
00664     if(ctx) {
00665         script_release(ctx);
00666         return E_UNEXPECTED;
00667     }
00668 
00669     return This->site ? set_ctx_site(This) : S_OK;
00670 }
00671 
00672 static HRESULT WINAPI JScriptParse_AddScriptlet(IActiveScriptParse *iface,
00673         LPCOLESTR pstrDefaultName, LPCOLESTR pstrCode, LPCOLESTR pstrItemName,
00674         LPCOLESTR pstrSubItemName, LPCOLESTR pstrEventName, LPCOLESTR pstrDelimiter,
00675         CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags,
00676         BSTR *pbstrName, EXCEPINFO *pexcepinfo)
00677 {
00678     JScript *This = ASPARSE_THIS(iface);
00679     FIXME("(%p)->(%s %s %s %s %s %s %s %u %x %p %p)\n", This, debugstr_w(pstrDefaultName),
00680           debugstr_w(pstrCode), debugstr_w(pstrItemName), debugstr_w(pstrSubItemName),
00681           debugstr_w(pstrEventName), debugstr_w(pstrDelimiter), wine_dbgstr_longlong(dwSourceContextCookie),
00682           ulStartingLineNumber, dwFlags, pbstrName, pexcepinfo);
00683     return E_NOTIMPL;
00684 }
00685 
00686 static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface,
00687         LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext,
00688         LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLine,
00689         DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo)
00690 {
00691     JScript *This = ASPARSE_THIS(iface);
00692     parser_ctx_t *parser_ctx;
00693     HRESULT hres;
00694 
00695     TRACE("(%p)->(%s %s %p %s %s %u %x %p %p)\n", This, debugstr_w(pstrCode),
00696           debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter),
00697           wine_dbgstr_longlong(dwSourceContextCookie), ulStartingLine, dwFlags, pvarResult, pexcepinfo);
00698 
00699     if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED)
00700         return E_UNEXPECTED;
00701 
00702     hres = script_parse(This->ctx, pstrCode, pstrDelimiter, &parser_ctx);
00703     if(FAILED(hres))
00704         return hres;
00705 
00706     if(!is_started(This->ctx)) {
00707         if(This->queue_tail)
00708             This->queue_tail = This->queue_tail->next = parser_ctx;
00709         else
00710             This->queue_head = This->queue_tail = parser_ctx;
00711         return S_OK;
00712     }
00713 
00714     hres = exec_global_code(This, parser_ctx);
00715     parser_release(parser_ctx);
00716 
00717     return hres;
00718 }
00719 
00720 #undef ASPARSE_THIS
00721 
00722 static const IActiveScriptParseVtbl JScriptParseVtbl = {
00723     JScriptParse_QueryInterface,
00724     JScriptParse_AddRef,
00725     JScriptParse_Release,
00726     JScriptParse_InitNew,
00727     JScriptParse_AddScriptlet,
00728     JScriptParse_ParseScriptText
00729 };
00730 
00731 #define ASPARSEPROC_THIS(iface) DEFINE_THIS(JScript, IActiveScriptParseProcedure2, iface)
00732 
00733 static HRESULT WINAPI JScriptParseProcedure_QueryInterface(IActiveScriptParseProcedure2 *iface, REFIID riid, void **ppv)
00734 {
00735     JScript *This = ASPARSEPROC_THIS(iface);
00736     return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
00737 }
00738 
00739 static ULONG WINAPI JScriptParseProcedure_AddRef(IActiveScriptParseProcedure2 *iface)
00740 {
00741     JScript *This = ASPARSEPROC_THIS(iface);
00742     return IActiveScript_AddRef(ACTSCRIPT(This));
00743 }
00744 
00745 static ULONG WINAPI JScriptParseProcedure_Release(IActiveScriptParseProcedure2 *iface)
00746 {
00747     JScript *This = ASPARSEPROC_THIS(iface);
00748     return IActiveScript_Release(ACTSCRIPT(This));
00749 }
00750 
00751 static HRESULT WINAPI JScriptParseProcedure_ParseProcedureText(IActiveScriptParseProcedure2 *iface,
00752         LPCOLESTR pstrCode, LPCOLESTR pstrFormalParams, LPCOLESTR pstrProcedureName,
00753         LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrDelimiter,
00754         CTXARG_T dwSourceContextCookie, ULONG ulStartingLineNumber, DWORD dwFlags, IDispatch **ppdisp)
00755 {
00756     JScript *This = ASPARSEPROC_THIS(iface);
00757     parser_ctx_t *parser_ctx;
00758     DispatchEx *dispex;
00759     HRESULT hres;
00760 
00761     TRACE("(%p)->(%s %s %s %s %p %s %s %u %x %p)\n", This, debugstr_w(pstrCode), debugstr_w(pstrFormalParams),
00762           debugstr_w(pstrProcedureName), debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter),
00763           wine_dbgstr_longlong(dwSourceContextCookie), ulStartingLineNumber, dwFlags, ppdisp);
00764 
00765     if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED)
00766         return E_UNEXPECTED;
00767 
00768     hres = script_parse(This->ctx, pstrCode, pstrDelimiter, &parser_ctx);
00769     if(FAILED(hres)) {
00770         WARN("Parse failed %08x\n", hres);
00771         return hres;
00772     }
00773 
00774     hres = create_source_function(parser_ctx, NULL, parser_ctx->source, NULL, NULL, 0, &dispex);
00775     parser_release(parser_ctx);
00776     if(FAILED(hres))
00777         return hres;
00778 
00779     *ppdisp = (IDispatch*)_IDispatchEx_(dispex);
00780     return S_OK;
00781 }
00782 
00783 #undef ASPARSEPROC_THIS
00784 
00785 static const IActiveScriptParseProcedure2Vtbl JScriptParseProcedureVtbl = {
00786     JScriptParseProcedure_QueryInterface,
00787     JScriptParseProcedure_AddRef,
00788     JScriptParseProcedure_Release,
00789     JScriptParseProcedure_ParseProcedureText,
00790 };
00791 
00792 #define ACTSCPPROP_THIS(iface) DEFINE_THIS(JScript, IActiveScriptProperty, iface)
00793 
00794 static HRESULT WINAPI JScriptProperty_QueryInterface(IActiveScriptProperty *iface, REFIID riid, void **ppv)
00795 {
00796     JScript *This = ACTSCPPROP_THIS(iface);
00797     return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
00798 }
00799 
00800 static ULONG WINAPI JScriptProperty_AddRef(IActiveScriptProperty *iface)
00801 {
00802     JScript *This = ACTSCPPROP_THIS(iface);
00803     return IActiveScript_AddRef(ACTSCRIPT(This));
00804 }
00805 
00806 static ULONG WINAPI JScriptProperty_Release(IActiveScriptProperty *iface)
00807 {
00808     JScript *This = ACTSCPPROP_THIS(iface);
00809     return IActiveScript_Release(ACTSCRIPT(This));
00810 }
00811 
00812 static HRESULT WINAPI JScriptProperty_GetProperty(IActiveScriptProperty *iface, DWORD dwProperty,
00813         VARIANT *pvarIndex, VARIANT *pvarValue)
00814 {
00815     JScript *This = ACTSCPPROP_THIS(iface);
00816     FIXME("(%p)->(%x %p %p)\n", This, dwProperty, pvarIndex, pvarValue);
00817     return E_NOTIMPL;
00818 }
00819 
00820 static HRESULT WINAPI JScriptProperty_SetProperty(IActiveScriptProperty *iface, DWORD dwProperty,
00821         VARIANT *pvarIndex, VARIANT *pvarValue)
00822 {
00823     JScript *This = ACTSCPPROP_THIS(iface);
00824 
00825     TRACE("(%p)->(%x %s %s)\n", This, dwProperty, debugstr_variant(pvarIndex), debugstr_variant(pvarValue));
00826 
00827     if(pvarIndex)
00828         FIXME("unsupported pvarIndex\n");
00829 
00830     switch(dwProperty) {
00831     case SCRIPTPROP_INVOKEVERSIONING:
00832         if(V_VT(pvarValue) != VT_I4 || V_I4(pvarValue) < 0 || V_I4(pvarValue) > 15) {
00833             WARN("invalid value %s\n", debugstr_variant(pvarValue));
00834             return E_INVALIDARG;
00835         }
00836 
00837         This->version = V_I4(pvarValue);
00838         break;
00839     default:
00840         FIXME("Unimplemented property %x\n", dwProperty);
00841         return E_NOTIMPL;
00842     }
00843 
00844     return S_OK;
00845 }
00846 
00847 #undef ACTSCPPROP_THIS
00848 
00849 static const IActiveScriptPropertyVtbl JScriptPropertyVtbl = {
00850     JScriptProperty_QueryInterface,
00851     JScriptProperty_AddRef,
00852     JScriptProperty_Release,
00853     JScriptProperty_GetProperty,
00854     JScriptProperty_SetProperty
00855 };
00856 
00857 #define OBJSAFETY_THIS(iface) DEFINE_THIS(JScript, IObjectSafety, iface)
00858 
00859 static HRESULT WINAPI JScriptSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
00860 {
00861     JScript *This = OBJSAFETY_THIS(iface);
00862     return IActiveScript_QueryInterface(ACTSCRIPT(This), riid, ppv);
00863 }
00864 
00865 static ULONG WINAPI JScriptSafety_AddRef(IObjectSafety *iface)
00866 {
00867     JScript *This = OBJSAFETY_THIS(iface);
00868     return IActiveScript_AddRef(ACTSCRIPT(This));
00869 }
00870 
00871 static ULONG WINAPI JScriptSafety_Release(IObjectSafety *iface)
00872 {
00873     JScript *This = OBJSAFETY_THIS(iface);
00874     return IActiveScript_Release(ACTSCRIPT(This));
00875 }
00876 
00877 #define SUPPORTED_OPTIONS (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER)
00878 
00879 static HRESULT WINAPI JScriptSafety_GetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
00880         DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
00881 {
00882     JScript *This = OBJSAFETY_THIS(iface);
00883 
00884     TRACE("(%p)->(%s %p %p)\n", This, debugstr_guid(riid), pdwSupportedOptions, pdwEnabledOptions);
00885 
00886     if(!pdwSupportedOptions || !pdwEnabledOptions)
00887         return E_POINTER;
00888 
00889     *pdwSupportedOptions = SUPPORTED_OPTIONS;
00890     *pdwEnabledOptions = This->safeopt;
00891 
00892     return S_OK;
00893 }
00894 
00895 static HRESULT WINAPI JScriptSafety_SetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
00896         DWORD dwOptionSetMask, DWORD dwEnabledOptions)
00897 {
00898     JScript *This = OBJSAFETY_THIS(iface);
00899 
00900     TRACE("(%p)->(%s %x %x)\n", This, debugstr_guid(riid), dwOptionSetMask, dwEnabledOptions);
00901 
00902     if(dwOptionSetMask & ~SUPPORTED_OPTIONS)
00903         return E_FAIL;
00904 
00905     This->safeopt = dwEnabledOptions & dwEnabledOptions;
00906     return S_OK;
00907 }
00908 
00909 #undef OBJSAFETY_THIS
00910 
00911 static const IObjectSafetyVtbl JScriptSafetyVtbl = {
00912     JScriptSafety_QueryInterface,
00913     JScriptSafety_AddRef,
00914     JScriptSafety_Release,
00915     JScriptSafety_GetInterfaceSafetyOptions,
00916     JScriptSafety_SetInterfaceSafetyOptions
00917 };
00918 
00919 HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pUnkOuter,
00920                                              REFIID riid, void **ppv)
00921 {
00922     JScript *ret;
00923     HRESULT hres;
00924 
00925     TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppv);
00926 
00927     lock_module();
00928 
00929     ret = heap_alloc_zero(sizeof(*ret));
00930     if(!ret)
00931         return E_OUTOFMEMORY;
00932 
00933     ret->lpIActiveScriptVtbl                 = &JScriptVtbl;
00934     ret->lpIActiveScriptParseVtbl            = &JScriptParseVtbl;
00935     ret->lpIActiveScriptParseProcedure2Vtbl  = &JScriptParseProcedureVtbl;
00936     ret->lpIActiveScriptPropertyVtbl         = &JScriptPropertyVtbl;
00937     ret->lpIObjectSafetyVtbl                 = &JScriptSafetyVtbl;
00938     ret->ref = 1;
00939     ret->safeopt = INTERFACE_USES_DISPEX;
00940 
00941     hres = IActiveScript_QueryInterface(ACTSCRIPT(ret), riid, ppv);
00942     IActiveScript_Release(ACTSCRIPT(ret));
00943     return hres;
00944 }

Generated on Sat May 26 2012 04:22:53 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.