Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenjscript.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
1.7.6.1
|