Module: wine Branch: refs/heads/master Commit: 25aff05e4a0b2147a2b10088d186082aca51aace URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=25aff05e4a0b2147a2b10088...
Author: Robert Shearman rob@codeweavers.com Date: Fri Jul 28 01:22:02 2006 +0100
oleaut32: Add validation for parameters in IPictureDisp::Invoke.
Add some tests for IPictureDisp::Invoke.
---
dlls/oleaut32/olepicture.c | 37 +++++++++++++++++++++ dlls/oleaut32/tests/olepicture.c | 66 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 0 deletions(-)
diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c index a72919e..b2d9cf0 100644 --- a/dlls/oleaut32/olepicture.c +++ b/dlls/oleaut32/olepicture.c @@ -2048,6 +2048,43 @@ static HRESULT WINAPI OLEPictureImpl_Inv UINT* puArgErr) { OLEPictureImpl *This = impl_from_IDispatch(iface); + + /* validate parameters */ + + if (!IsEqualIID(riid, &IID_NULL)) + { + ERR("riid was %s instead of IID_NULL\n", debugstr_guid(riid)); + return DISP_E_UNKNOWNNAME; + } + + if (!pDispParams) + { + ERR("null pDispParams not allowed\n"); + return DISP_E_PARAMNOTOPTIONAL; + } + + if (wFlags & DISPATCH_PROPERTYGET) + { + if (!pVarResult) + { + ERR("null pVarResult not allowed when DISPATCH_PROPERTYGET specified\n"); + return DISP_E_PARAMNOTOPTIONAL; + } + } + else if (wFlags & DISPATCH_PROPERTYPUT) + { + if (pDispParams->cArgs != 1) + { + ERR("param count for DISPATCH_PROPERTYPUT was %d instead of 1\n", pDispParams->cArgs); + return DISP_E_BADPARAMCOUNT; + } + } + else + { + ERR("one of DISPATCH_PROPERTYGET or DISPATCH_PROPERTYPUT must be specified\n"); + return DISP_E_MEMBERNOTFOUND; + } + if (dispIdMember == DISPID_PICT_TYPE) { TRACE("DISPID_PICT_TYPE\n"); diff --git a/dlls/oleaut32/tests/olepicture.c b/dlls/oleaut32/tests/olepicture.c index ada567a..b4a5697 100644 --- a/dlls/oleaut32/tests/olepicture.c +++ b/dlls/oleaut32/tests/olepicture.c @@ -44,6 +44,8 @@ static HMODULE hOleaut32;
static HRESULT (WINAPI *pOleLoadPicture)(LPSTREAM,LONG,BOOL,REFIID,LPVOID*);
+#define ok_ole_success(hr, func) ok(hr == S_OK, func " failed with error 0x%08lx\n", hr) + /* 1x1 pixel gif */ static const unsigned char gifimage[35] = { 0x47,0x49,0x46,0x38,0x37,0x61,0x01,0x00,0x01,0x00,0x80,0x00,0x00,0xff,0xff,0xff, @@ -285,6 +287,68 @@ static void test_empty_image_2(void) { IPicture_Release (pic); }
+static void test_Invoke(void) +{ + IPictureDisp *picdisp; + HRESULT hr; + VARIANTARG vararg; + DISPPARAMS dispparams; + VARIANT varresult; + IStream *stream; + HGLOBAL hglob; + void *data; + + hglob = GlobalAlloc (0, sizeof(gifimage)); + data = GlobalLock(hglob); + memcpy(data, gifimage, sizeof(gifimage)); + GlobalUnlock(hglob); + + hr = CreateStreamOnHGlobal (hglob, FALSE, &stream); + ok_ole_success(hr, "CreateStreamOnHGlobal"); + + hr = pOleLoadPicture(stream, sizeof(gifimage), TRUE, &IID_IPictureDisp, (void **)&picdisp); + IStream_Release(stream); + ok_ole_success(hr, "OleLoadPicture"); + + V_VT(&vararg) = VT_BOOL; + V_BOOL(&vararg) = VARIANT_FALSE; + dispparams.cNamedArgs = 0; + dispparams.rgdispidNamedArgs = NULL; + dispparams.cArgs = 1; + dispparams.rgvarg = &vararg; + hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_IPictureDisp, 0, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, NULL); + ok(hr == DISP_E_UNKNOWNNAME, "IPictureDisp_Invoke should have returned DISP_E_UNKNOWNNAME instead of 0x%08lx\n", hr); + hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_IUnknown, 0, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, NULL); + ok(hr == DISP_E_UNKNOWNNAME, "IPictureDisp_Invoke should have returned DISP_E_UNKNOWNNAME instead of 0x%08lx\n", hr); + + dispparams.cArgs = 0; + dispparams.rgvarg = NULL; + hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_NULL, 0, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, NULL); + ok(hr == DISP_E_BADPARAMCOUNT, "IPictureDisp_Invoke should have returned DISP_E_BADPARAMCOUNT instead of 0x%08lx\n", hr); + + hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_NULL, 0, DISPATCH_PROPERTYPUT, NULL, NULL, NULL, NULL); + ok(hr == DISP_E_PARAMNOTOPTIONAL, "IPictureDisp_Invoke should have returned DISP_E_PARAMNOTOPTIONAL instead of 0x%08lx\n", hr); + + hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_NULL, 0, DISPATCH_PROPERTYGET, NULL, NULL, NULL, NULL); + ok(hr == DISP_E_PARAMNOTOPTIONAL, "IPictureDisp_Invoke should have returned DISP_E_PARAMNOTOPTIONAL instead of 0x%08lx\n", hr); + + hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_NULL, 0, DISPATCH_PROPERTYGET, NULL, &varresult, NULL, NULL); + ok(hr == DISP_E_PARAMNOTOPTIONAL, "IPictureDisp_Invoke should have returned DISP_E_PARAMNOTOPTIONAL instead of 0x%08lx\n", hr); + + hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &varresult, NULL, NULL); + ok_ole_success(hr, "IPictureDisp_Invoke"); + + hr = IPictureDisp_Invoke(picdisp, DISPID_PICT_HPAL, &IID_NULL, 0, DISPATCH_METHOD, &dispparams, &varresult, NULL, NULL); + ok(hr == DISP_E_MEMBERNOTFOUND, "IPictureDisp_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08lx\n", hr); + + hr = IPictureDisp_Invoke(picdisp, 0xdeadbeef, &IID_NULL, 0, DISPATCH_PROPERTYGET, &dispparams, &varresult, NULL, NULL); + todo_wine { + ok(hr == DISP_E_MEMBERNOTFOUND, "IPictureDisp_Invoke should have returned DISP_E_MEMBERNOTFOUND instead of 0x%08lx\n", hr); + } + + IPictureDisp_Release(picdisp); +} + START_TEST(olepicture) { hOleaut32 = LoadLibraryA("oleaut32.dll"); @@ -302,6 +366,8 @@ START_TEST(olepicture) */ test_empty_image(); test_empty_image_2(); + + test_Invoke(); }