PATCH: safearray fixes and regtest, take 2

Marcus Meissner marcus at jet.franken.de
Fri Dec 20 16:26:34 CST 2002


Hi,

Resubmitting updated.

dlls/oleaut32/tests/safearray.c attached again.

Ciao, Marcus

Changelog:
	Fixed VarBstrCmp/Cat .spec entries.
	Started regression test for SafeArray functions.
	Fixed SafeArrayAllocDescriptor (check bounds, set cDims).
	Fixed VARTYPE_SIZE array entries so it matches native.

Index: dlls/oleaut32/oleaut32.spec
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/oleaut32.spec,v
retrieving revision 1.45
diff -u -u -r1.45 oleaut32.spec
--- dlls/oleaut32/oleaut32.spec	16 Dec 2002 22:08:48 -0000	1.45
+++ dlls/oleaut32/oleaut32.spec	20 Dec 2002 22:22:30 -0000
@@ -305,8 +305,8 @@
 310 stub VarCyRound
 311 stub VarCyCmp
 312 stub VarCyCmpR8
-313 stdcall VarBstrCat(ptr ptr ptr) VarBstrCat
-314 stdcall VarBstrCmp(ptr ptr long long) VarBstrCmp
+313 stdcall VarBstrCat(wstr wstr ptr) VarBstrCat
+314 stdcall VarBstrCmp(wstr wstr long long) VarBstrCmp
 315 stub VarR8Pow # stdcall (double double ptr)
 316 stub VarR4CmpR8
 317 stub VarR8Round # stdcall (double long ptr)
Index: dlls/oleaut32/safearray.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/safearray.c,v
retrieving revision 1.20
diff -u -u -r1.20 safearray.c
--- dlls/oleaut32/safearray.c	12 Dec 2002 22:59:07 -0000	1.20
+++ dlls/oleaut32/safearray.c	20 Dec 2002 22:22:31 -0000
@@ -79,19 +79,19 @@
 sizeof(BSTR),           /* VT_BSTR     [V][T][P][S] OLE Automation string*/
 sizeof(LPDISPATCH),     /* VT_DISPATCH [V][T][P][S] IDispatch *	*/
 4,                      /* VT_ERROR    [V][T]   [S] SCODE	*/
-4,                      /* VT_BOOL     [V][T][P][S] True=-1, False=0*/
+2,                      /* VT_BOOL     [V][T][P][S] True=-1, False=0*/
 sizeof(VARIANT),        /* VT_VARIANT  [V][T][P][S] VARIANT *	*/
 sizeof(LPUNKNOWN),      /* VT_UNKNOWN  [V][T]   [S] IUnknown * */
 sizeof(DECIMAL),        /* VT_DECIMAL  [V][T]   [S] 16 byte fixed point	*/
-VARTYPE_NOT_SUPPORTED,                         /* no VARTYPE here..... */
-VARTYPE_NOT_SUPPORTED,	/* VT_I1          [T]       signed char	*/
-1,                      /* VT_UI1      [V][T][P][S] unsigned char			*/
-VARTYPE_NOT_SUPPORTED,	/* VT_UI2         [T][P]    unsigned short	*/
-VARTYPE_NOT_SUPPORTED,	/* VT_UI4         [T][P]    unsigned short	*/
+VARTYPE_NOT_SUPPORTED,                         /* no VARTYPE here.....	*/
+1,			/* VT_I1          [T]   [S] signed char		*/
+1,                      /* VT_UI1      [V][T][P][S] unsigned char	*/
+2,			/* VT_UI2         [T][P][S] unsigned short	*/
+4,			/* VT_UI4         [T][P][S] unsigned int	*/
 VARTYPE_NOT_SUPPORTED,	/* VT_I8          [T][P]    signed 64-bit int			*/
 VARTYPE_NOT_SUPPORTED,	/* VT_UI8         [T][P]    unsigned 64-bit int		*/
-VARTYPE_NOT_SUPPORTED,	/* VT_INT         [T]       signed machine int		*/
-VARTYPE_NOT_SUPPORTED,	/* VT_UINT        [T]       unsigned machine int	*/
+sizeof(INT),		/* VT_INT         [T]       signed machine int		*/
+sizeof(UINT),		/* VT_UINT        [T]       unsigned machine int	*/
 VARTYPE_NOT_SUPPORTED,	/* VT_VOID        [T]       C style void			*/
 VARTYPE_NOT_SUPPORTED,	/* VT_HRESULT     [T]       Standard return type	*/
 VARTYPE_NOT_SUPPORTED,	/* VT_PTR         [T]       pointer type			*/
@@ -128,6 +128,12 @@
   SAFEARRAYBOUND *sab;
   LONG allocSize = 0;
 
+  if (!cDims || cDims >= 0x10000) /* 65536 appears to be the limit */
+    return E_INVALIDARG;
+  if (!ppsaOut)
+    return E_POINTER;
+
+
   /* SAFEARRAY + SAFEARRAYBOUND * (cDims -1) ( -1 because there is already one
                                              ( in SAFEARRAY struct */
   allocSize = sizeof(**ppsaOut) + (sizeof(*sab) * (cDims-1));
@@ -137,7 +143,8 @@
         GetProcessHeap(), HEAP_ZERO_MEMORY, allocSize)) == NULL){
     return(E_UNEXPECTED);
   }
-  TRACE("SafeArray: %lu bytes allocated for descriptor.\n", allocSize);
+  (*ppsaOut)->cDims = cDims;
+  TRACE("(%d): %lu bytes allocated for descriptor.\n", cDims, allocSize);
 
   return(S_OK);
 }
@@ -1036,19 +1043,26 @@
   LONG    lLBound;
   HRESULT hRes;
 
-  if (!psa->cDims) return FALSE;
+  if (!psa->cDims) { FIXME("no dims?\n");return FALSE; }
   for(; iter<psa->cDims; iter++) {
     TRACE("coor[%d]=%ld\n", iter, coor[iter]);
-    if((hRes = SafeArrayGetLBound(psa, (iter+1), &lLBound)) != S_OK)
+    if((hRes = SafeArrayGetLBound(psa, (iter+1), &lLBound)) != S_OK) {
+      FIXME("No lbound?\n");
       return FALSE;
-    if((hRes = SafeArrayGetUBound(psa, (iter+1), &lUBound)) != S_OK)
+    }
+    if((hRes = SafeArrayGetUBound(psa, (iter+1), &lUBound)) != S_OK) {
+      FIXME("No ubound?\n");
       return FALSE;
-
-    if(lLBound > lUBound)
+    }
+    if(lLBound > lUBound) {
+      FIXME("lbound larger than ubound?\n");
       return FALSE;
+    }
 
-    if((coor[iter] < lLBound) || (coor[iter] > lUBound))
+    if((coor[iter] < lLBound) || (coor[iter] > lUBound)) {
+      FIXME("coordinate %d not within %d - %d\n",coor[iter], lLBound, lUBound);
       return FALSE;
+    }
   }
   return TRUE;
 }
Index: dlls/oleaut32/tests/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/tests/Makefile.in,v
retrieving revision 1.1
diff -u -u -r1.1 Makefile.in
--- dlls/oleaut32/tests/Makefile.in	9 Aug 2002 01:22:41 -0000	1.1
+++ dlls/oleaut32/tests/Makefile.in	20 Dec 2002 22:22:35 -0000
@@ -6,6 +6,7 @@
 IMPORTS   = oleaut32
 
 CTESTS = \
+	safearray.c \
 	vartest.c
 
 @MAKE_TEST_RULES@
-------------- next part --------------
/*
 * SafeArray test program
 *
 * Copyright 2002 Marcus Meissner
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>
#include <time.h>

#include "wine/test.h"
#include "winbase.h"
#include "winuser.h"
#include "wingdi.h"
#include "winnls.h"
#include "winerror.h"
#include "winnt.h"

#include "wtypes.h"
#include "oleauto.h"

#define VARTYPE_NOT_SUPPORTED 0
static int vttypes[] = {
  /* this is taken from wtypes.h.  Only [S]es are supported by the SafeArray */
VARTYPE_NOT_SUPPORTED,  /* VT_EMPTY    [V]   [P]    nothing			*/
VARTYPE_NOT_SUPPORTED,  /* VT_NULL     [V]   [P]    SQL style Nul	*/
2,                      /* VT_I2       [V][T][P][S] 2 byte signed int */
4,                      /* VT_I4       [V][T][P][S] 4 byte signed int */
4,                      /* VT_R4       [V][T][P][S] 4 byte real	*/
8,                      /* VT_R8       [V][T][P][S] 8 byte real	*/
8,                      /* VT_CY       [V][T][P][S] currency */
8,                      /* VT_DATE     [V][T][P][S] date */
sizeof(BSTR),           /* VT_BSTR     [V][T][P][S] OLE Automation string*/
sizeof(LPDISPATCH),     /* VT_DISPATCH [V][T][P][S] IDispatch *	*/
4,                      /* VT_ERROR    [V][T]   [S] SCODE	*/
2,                      /* VT_BOOL     [V][T][P][S] True=-1, False=0*/
sizeof(VARIANT),        /* VT_VARIANT  [V][T][P][S] VARIANT *	*/
sizeof(LPUNKNOWN),      /* VT_UNKNOWN  [V][T]   [S] IUnknown * */
sizeof(DECIMAL),        /* VT_DECIMAL  [V][T]   [S] 16 byte fixed point	*/
VARTYPE_NOT_SUPPORTED,                         /* no VARTYPE here.....	*/
1,			/* VT_I1          [T]   [S] signed char		*/
1,                      /* VT_UI1      [V][T][P][S] unsigned char	*/
2,			/* VT_UI2         [T][P][S] unsigned short	*/
4,			/* VT_UI4         [T][P][S] unsigned int	*/
VARTYPE_NOT_SUPPORTED,	/* VT_I8          [T][P]    signed 64-bit int			*/
VARTYPE_NOT_SUPPORTED,	/* VT_UI8         [T][P]    unsigned 64-bit int		*/
sizeof(INT),		/* VT_INT         [T]       signed machine int		*/
sizeof(UINT),		/* VT_UINT        [T]       unsigned machine int	*/
VARTYPE_NOT_SUPPORTED,	/* VT_VOID        [T]       C style void			*/
VARTYPE_NOT_SUPPORTED,	/* VT_HRESULT     [T]       Standard return type	*/
VARTYPE_NOT_SUPPORTED,	/* VT_PTR         [T]       pointer type			*/
VARTYPE_NOT_SUPPORTED,	/* VT_SAFEARRAY   [T]       (use VT_ARRAY in VARIANT)*/
VARTYPE_NOT_SUPPORTED,	/* VT_CARRAY      [T]       C style array			*/
VARTYPE_NOT_SUPPORTED,	/* VT_USERDEFINED [T]       user defined type			*/
VARTYPE_NOT_SUPPORTED,	/* VT_LPSTR       [T][P]    null terminated string	*/
VARTYPE_NOT_SUPPORTED,	/* VT_LPWSTR      [T][P]    wide null term string		*/
VARTYPE_NOT_SUPPORTED,	/* VT_FILETIME       [P]    FILETIME			*/
VARTYPE_NOT_SUPPORTED,	/* VT_BLOB           [P]    Length prefixed bytes */
VARTYPE_NOT_SUPPORTED,	/* VT_STREAM         [P]    Name of stream follows		*/
VARTYPE_NOT_SUPPORTED,	/* VT_STORAGE        [P]    Name of storage follows	*/
VARTYPE_NOT_SUPPORTED,	/* VT_STREAMED_OBJECT[P]    Stream contains an object*/
VARTYPE_NOT_SUPPORTED,	/* VT_STORED_OBJECT  [P]    Storage contains object*/
VARTYPE_NOT_SUPPORTED,	/* VT_BLOB_OBJECT    [P]    Blob contains an object*/
VARTYPE_NOT_SUPPORTED,	/* VT_CF             [P]    Clipboard format			*/
VARTYPE_NOT_SUPPORTED,	/* VT_CLSID          [P]    A Class ID			*/
VARTYPE_NOT_SUPPORTED,	/* VT_VECTOR         [P]    simple counted array		*/
VARTYPE_NOT_SUPPORTED,	/* VT_ARRAY    [V]          SAFEARRAY*			*/
VARTYPE_NOT_SUPPORTED 	/* VT_BYREF    [V]          void* for local use	*/
};

START_TEST(safearray)
{
	SAFEARRAY 	*a;
	int 		i;
	HRESULT 	hres;
	SAFEARRAYBOUND	bound;

	hres = SafeArrayAllocDescriptor(0,&a);
	ok(E_INVALIDARG == hres,"SAAD(0) failed with hres %lx",hres);

	hres=SafeArrayAllocDescriptor(1,&a);
	ok(S_OK == hres,"SAAD(1) failed with %lx",hres);

	for (i=1;i<100;i++) {
		hres=SafeArrayAllocDescriptor(i,&a);
		ok(S_OK == hres,"SAAD(%d) failed with %lx\n",i,hres);
		
		ok(a->cDims == i,"a->cDims not initialised?\n");

		hres=SafeArrayDestroyDescriptor(a);
		ok(S_OK == hres,"SADD failed with %lx\n",hres);
	}

	hres=SafeArrayAllocDescriptor(65535,&a);
	ok(S_OK == hres,"SAAD(65535) failed with %lx",hres);

	hres=SafeArrayDestroyDescriptor(a);
	ok(S_OK == hres,"SADD failed with %lx",hres);

	hres=SafeArrayAllocDescriptor(65536,&a);
	ok(E_INVALIDARG == hres,"SAAD(65536) failed with %lx",hres);

	hres=SafeArrayAllocDescriptor(1,NULL);
	ok(E_POINTER == hres,"SAAD(1,NULL) failed with %lx",hres);

	
	bound.cElements	= 1;
	bound.lLbound	= 0;
	a = SafeArrayCreate(-1, 1, &bound);
	ok(NULL == a,"SAC(-1,1,[1,0]) not failed?\n");
	
	for (i=0;i<sizeof(vttypes)/sizeof(vttypes[0]);i++) {
		a = SafeArrayCreate(i, 1, &bound);
		ok(	((a == NULL) && (vttypes[i] == 0)) ||
			((a != NULL) && (vttypes[i] == a->cbElements)),
		"SAC(%d,1,[1,0]), result %d, expected %d\n",i,(a?a->cbElements:0),vttypes[i]
		);
	}
}


More information about the wine-patches mailing list