Gabriel Ivăncescu : jscript: Implement ScriptTypeInfo_GetIDsOfNames.
Alexandre Julliard
julliard at winehq.org
Thu Dec 12 16:29:42 CST 2019
Module: wine
Branch: master
Commit: a6ac60dcc30815bb73571ea504519a32d3a3e3da
URL: https://source.winehq.org/git/wine.git/?a=commit;h=a6ac60dcc30815bb73571ea504519a32d3a3e3da
Author: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Date: Thu Dec 12 14:53:59 2019 +0200
jscript: Implement ScriptTypeInfo_GetIDsOfNames.
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/jscript/dispex.c | 47 +++++++++++++++++++++++++++++++++++++++++++--
dlls/jscript/jscript.h | 1 +
dlls/jscript/jscript_main.c | 25 ++++++++++++++++++++++++
3 files changed, 71 insertions(+), 2 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c
index df87aedcac..1ac747b491 100644
--- a/dlls/jscript/dispex.c
+++ b/dlls/jscript/dispex.c
@@ -802,10 +802,53 @@ static HRESULT WINAPI ScriptTypeInfo_GetIDsOfNames(ITypeInfo *iface, LPOLESTR *r
MEMBERID *pMemId)
{
ScriptTypeInfo *This = ScriptTypeInfo_from_ITypeInfo(iface);
+ ITypeInfo *disp_typeinfo;
+ const WCHAR *name;
+ HRESULT hr = S_OK;
+ int i, j, arg;
- FIXME("(%p)->(%p %u %p)\n", This, rgszNames, cNames, pMemId);
+ TRACE("(%p)->(%p %u %p)\n", This, rgszNames, cNames, pMemId);
- return E_NOTIMPL;
+ if (!rgszNames || !cNames || !pMemId) return E_INVALIDARG;
+
+ for (i = 0; i < cNames; i++) pMemId[i] = MEMBERID_NIL;
+ name = rgszNames[0];
+
+ for (i = 0; i < This->num_funcs; i++)
+ {
+ struct typeinfo_func *func = &This->funcs[i];
+
+ if (wcsicmp(name, func->prop->name)) continue;
+ pMemId[0] = prop_to_id(This->jsdisp, func->prop);
+
+ for (j = 1; j < cNames; j++)
+ {
+ name = rgszNames[j];
+ for (arg = func->code->param_cnt; --arg >= 0;)
+ if (!wcsicmp(name, func->code->params[arg]))
+ break;
+ if (arg >= 0)
+ pMemId[j] = arg;
+ else
+ hr = DISP_E_UNKNOWNNAME;
+ }
+ return hr;
+ }
+
+ for (i = 0; i < This->num_vars; i++)
+ {
+ dispex_prop_t *var = This->vars[i];
+
+ if (wcsicmp(name, var->name)) continue;
+ pMemId[0] = prop_to_id(This->jsdisp, var);
+ return S_OK;
+ }
+
+ /* Look into the inherited IDispatch */
+ hr = get_dispatch_typeinfo(&disp_typeinfo);
+ if (FAILED(hr)) return hr;
+
+ return ITypeInfo_GetIDsOfNames(disp_typeinfo, rgszNames, cNames, pMemId);
}
static HRESULT WINAPI ScriptTypeInfo_Invoke(ITypeInfo *iface, PVOID pvInstance, MEMBERID memid, WORD wFlags,
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index 7174db8e0c..4ec5004df0 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -87,6 +87,7 @@ static inline LPWSTR heap_strdupW(LPCWSTR str)
typedef struct jsdisp_t jsdisp_t;
extern HINSTANCE jscript_hinstance DECLSPEC_HIDDEN;
+HRESULT get_dispatch_typeinfo(ITypeInfo**) DECLSPEC_HIDDEN;
#define PROPF_ARGMASK 0x00ff
#define PROPF_METHOD 0x0100
diff --git a/dlls/jscript/jscript_main.c b/dlls/jscript/jscript_main.c
index 9f9f4121f7..532cdf96d9 100644
--- a/dlls/jscript/jscript_main.c
+++ b/dlls/jscript/jscript_main.c
@@ -37,6 +37,30 @@ LONG module_ref = 0;
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
HINSTANCE jscript_hinstance;
+static ITypeInfo *dispatch_typeinfo;
+
+HRESULT get_dispatch_typeinfo(ITypeInfo **out)
+{
+ ITypeInfo *typeinfo;
+ ITypeLib *typelib;
+ HRESULT hr;
+
+ if (!dispatch_typeinfo)
+ {
+ hr = LoadRegTypeLib(&IID_StdOle, STDOLE_MAJORVERNUM, STDOLE_MINORVERNUM, STDOLE_LCID, &typelib);
+ if (FAILED(hr)) return hr;
+
+ hr = ITypeLib_GetTypeInfoOfGuid(typelib, &IID_IDispatch, &typeinfo);
+ ITypeLib_Release(typelib);
+ if (FAILED(hr)) return hr;
+
+ if (InterlockedCompareExchangePointer((void**)&dispatch_typeinfo, typeinfo, NULL))
+ ITypeInfo_Release(typeinfo);
+ }
+
+ *out = dispatch_typeinfo;
+ return S_OK;
+}
static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
{
@@ -145,6 +169,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
break;
case DLL_PROCESS_DETACH:
if (lpv) break;
+ if (dispatch_typeinfo) ITypeInfo_Release(dispatch_typeinfo);
free_strings();
}
More information about the wine-cvs
mailing list