Jacek Caban : vbscript: Added beginning GetDispID implementation.
Alexandre Julliard
julliard at winehq.org
Thu Sep 15 12:34:55 CDT 2011
Module: wine
Branch: master
Commit: 8b4c560d756815b9632dcf99709e7a554e52ed46
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8b4c560d756815b9632dcf99709e7a554e52ed46
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Sep 15 14:21:13 2011 +0200
vbscript: Added beginning GetDispID implementation.
---
dlls/vbscript/tests/lang.vbs | 4 ++-
dlls/vbscript/tests/run.c | 62 ++++++++++++++++++++++++++++++++++++++++-
dlls/vbscript/vbdisp.c | 34 +++++++++++++++++++++-
3 files changed, 95 insertions(+), 5 deletions(-)
diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs
index 2f78403..3f39a4e 100644
--- a/dlls/vbscript/tests/lang.vbs
+++ b/dlls/vbscript/tests/lang.vbs
@@ -394,8 +394,10 @@ Class TestClass
Public Sub publicSub
End Sub
- Public Sub privateSub
+ Private Sub privateSub
End Sub
End Class
+Call testDisp(new testClass)
+
reportSuccess()
diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c
index fa6eec1..fb6302a 100644
--- a/dlls/vbscript/tests/run.c
+++ b/dlls/vbscript/tests/run.c
@@ -73,6 +73,7 @@ DEFINE_EXPECT(testobj_propput_i);
#define DISPID_GLOBAL_VBVAR 1005
#define DISPID_GLOBAL_TESTOBJ 1006
#define DISPID_GLOBAL_ISNULLDISP 1007
+#define DISPID_GLOBAL_TESTDISP 1008
#define DISPID_TESTOBJ_PROPGET 2000
#define DISPID_TESTOBJ_PROPPUT 2001
@@ -140,6 +141,46 @@ static BOOL is_english(void)
&& PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
}
+static void test_disp(IDispatch *disp)
+{
+ DISPID id, public_func_id, public_sub_id;
+ IDispatchEx *dispex;
+ BSTR str;
+ HRESULT hres;
+
+ hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
+ ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
+
+ str = a2bstr("publicFunction");
+ hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_func_id);
+ SysFreeString(str);
+ ok(hres == S_OK, "GetDispID(publicFunction) failed: %08x\n", hres);
+ ok(public_func_id != -1, "public_func_id = -1\n");
+
+ str = a2bstr("publicSub");
+ hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_sub_id);
+ SysFreeString(str);
+ ok(hres == S_OK, "GetDispID(publicSub) failed: %08x\n", hres);
+ ok(public_sub_id != -1, "public_func_id = -1\n");
+
+ str = a2bstr("privateSub");
+ hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
+ SysFreeString(str);
+ ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateSub) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
+ ok(id == -1, "id = %d\n", id);
+
+ str = a2bstr("dynprop");
+ hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive|fdexNameEnsure, &id);
+ ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
+ ok(id == -1, "id = %d\n", id);
+ hres = IDispatchEx_GetDispID(dispex, str, fdexNameEnsure, &id);
+ ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
+ ok(id == -1, "id = %d\n", id);
+ SysFreeString(str);
+
+ IDispatchEx_Release(dispex);
+}
+
#define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
{
@@ -359,7 +400,11 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
*pid = DISPID_GLOBAL_ISNULLDISP;
return S_OK;
}
-
+ if(!strcmp_wa(bstrName, "testDisp")) {
+ test_grfdex(grfdex, fdexNameCaseInsensitive);
+ *pid = DISPID_GLOBAL_TESTDISP;
+ return S_OK;
+ }
if(strict_dispid_check && strcmp_wa(bstrName, "x"))
ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
@@ -473,7 +518,6 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
ok(V_I2(pdp->rgvarg) == 3, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
-
return S_OK;
case DISPID_GLOBAL_TESTOBJ:
@@ -512,6 +556,20 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
V_BOOL(pvarRes) = V_DISPATCH(v) ? VARIANT_FALSE : VARIANT_TRUE;
return S_OK;
}
+
+ case DISPID_GLOBAL_TESTDISP:
+ ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
+ ok(pdp != NULL, "pdp == NULL\n");
+ ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
+ ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
+ ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
+ ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
+ ok(!pvarRes, "pvarRes != NULL\n");
+ ok(pei != NULL, "pei == NULL\n");
+
+ ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
+ test_disp(V_DISPATCH(pdp->rgvarg));
+ return S_OK;
}
ok(0, "unexpected call %d\n", id);
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c
index f1a323d..77837c6 100644
--- a/dlls/vbscript/vbdisp.c
+++ b/dlls/vbscript/vbdisp.c
@@ -22,6 +22,25 @@
WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
+static BOOL get_func_id(vbdisp_t *This, const WCHAR *name, BOOL search_private, DISPID *id)
+{
+ unsigned i;
+
+ for(i = 0; i < This->desc->func_cnt; i++) {
+ if(!search_private && !This->desc->funcs[i].is_public)
+ continue;
+ if(!This->desc->funcs[i].name) /* default value may not exist */
+ continue;
+
+ if(!strcmpiW(This->desc->funcs[i].name, name)) {
+ *id = i;
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
static inline vbdisp_t *impl_from_IDispatchEx(IDispatchEx *iface)
{
return CONTAINING_RECORD(iface, vbdisp_t, IDispatchEx_iface);
@@ -112,8 +131,19 @@ static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
{
vbdisp_t *This = impl_from_IDispatchEx(iface);
- FIXME("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid);
+
+ if(grfdex & ~(fdexNameEnsure|fdexNameCaseInsensitive)) {
+ FIXME("unsupported flags %x\n", grfdex);
+ return E_NOTIMPL;
+ }
+
+ if(get_func_id(This, bstrName, FALSE, pid))
+ return S_OK;
+
+ *pid = -1;
+ return DISP_E_UNKNOWNNAME;
}
static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
More information about the wine-cvs
mailing list