Module: wine Branch: master Commit: bbed41fa6a9b1745cdf2a8f82f9fd4f46f6e6597 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bbed41fa6a9b1745cdf2a8f82f...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Sep 5 11:14:55 2011 +0200
vbscript: Added AddNamedItem implementation.
---
dlls/vbscript/vbscript.c | 64 +++++++++++++++++++++++++++++++++++++++++++++- dlls/vbscript/vbscript.h | 31 ++++++++++++++++++++++ 2 files changed, 94 insertions(+), 1 deletions(-)
diff --git a/dlls/vbscript/vbscript.c b/dlls/vbscript/vbscript.c index 2ca5584..77ccaee 100644 --- a/dlls/vbscript/vbscript.c +++ b/dlls/vbscript/vbscript.c @@ -87,6 +87,18 @@ static HRESULT set_ctx_site(VBScript *This)
static void destroy_script(script_ctx_t *ctx) { + while(!list_empty(&ctx->named_items)) { + named_item_t *iter = LIST_ENTRY(list_head(&ctx->named_items), named_item_t, entry); + + list_remove(&iter->entry); + if(iter->disp) + IDispatch_Release(iter->disp); + heap_free(iter->name); + heap_free(iter); + } + + if(ctx->host_global) + IDispatch_Release(ctx->host_global); if(ctx->site) IActiveScriptSite_Release(ctx->site); if(ctx->script_obj) @@ -295,7 +307,55 @@ static HRESULT WINAPI VBScript_Close(IActiveScript *iface) static HRESULT WINAPI VBScript_AddNamedItem(IActiveScript *iface, LPCOLESTR pstrName, DWORD dwFlags) { VBScript *This = impl_from_IActiveScript(iface); - FIXME("(%p)->(%s %x)\n", This, debugstr_w(pstrName), dwFlags); + named_item_t *item; + IDispatch *disp = NULL; + HRESULT hres; + + TRACE("(%p)->(%s %x)\n", This, debugstr_w(pstrName), dwFlags); + + if(This->thread_id != GetCurrentThreadId() || !This->ctx || This->state == SCRIPTSTATE_CLOSED) + return E_UNEXPECTED; + + if(dwFlags & SCRIPTITEM_GLOBALMEMBERS) { + IUnknown *unk; + + hres = IActiveScriptSite_GetItemInfo(This->site, pstrName, SCRIPTINFO_IUNKNOWN, &unk, NULL); + if(FAILED(hres)) { + WARN("GetItemInfo failed: %08x\n", hres); + return hres; + } + + hres = IUnknown_QueryInterface(unk, &IID_IDispatch, (void**)&disp); + IUnknown_Release(unk); + if(FAILED(hres)) { + WARN("object does not implement IDispatch\n"); + return hres; + } + + if(This->ctx->host_global) + IDispatch_Release(This->ctx->host_global); + IDispatch_AddRef(disp); + This->ctx->host_global = disp; + } + + item = heap_alloc(sizeof(*item)); + if(!item) { + if(disp) + IDispatch_Release(disp); + return E_OUTOFMEMORY; + } + + item->disp = disp; + item->flags = dwFlags; + item->name = heap_strdupW(pstrName); + if(!item->name) { + if(disp) + IDispatch_Release(disp); + heap_free(item); + return E_OUTOFMEMORY; + } + + list_add_tail(&This->ctx->named_items, &item->entry); return S_OK; }
@@ -421,6 +481,8 @@ static HRESULT WINAPI VBScriptParse_InitNew(IActiveScriptParse *iface) if(!ctx) return E_OUTOFMEMORY;
+ list_init(&ctx->named_items); + old_ctx = InterlockedCompareExchangePointer((void**)&This->ctx, ctx, NULL); if(old_ctx) { destroy_script(ctx); diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h index 1f6276f..9c1d35c 100644 --- a/dlls/vbscript/vbscript.h +++ b/dlls/vbscript/vbscript.h @@ -28,6 +28,17 @@
#include "vbscript_classes.h"
+#include "wine/list.h" +#include "wine/unicode.h" + +typedef struct named_item_t { + IDispatch *disp; + DWORD flags; + LPWSTR name; + + struct list entry; +} named_item_t; + typedef struct { IDispatchEx IDispatchEx_iface;
@@ -38,7 +49,11 @@ typedef struct { IActiveScriptSite *site; LCID lcid;
+ IDispatch *host_global; + vbdisp_t *script_obj; + + struct list named_items; } script_ctx_t;
HRESULT init_global(script_ctx_t*); @@ -59,3 +74,19 @@ static inline BOOL heap_free(void *mem) { return HeapFree(GetProcessHeap(), 0, mem); } + +static inline LPWSTR heap_strdupW(LPCWSTR str) +{ + LPWSTR ret = NULL; + + if(str) { + DWORD size; + + size = (strlenW(str)+1)*sizeof(WCHAR); + ret = heap_alloc(size); + if(ret) + memcpy(ret, str, size); + } + + return ret; +}