Huw Davies : oleaut32: Split out the SAFEARRAY and BSTR tests so that they can be used in the upcoming VARIANT tests .

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 5 15:24:08 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 747f08c8aebf841001bde3de3a69b0e292ed4be1
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=747f08c8aebf841001bde3de3a69b0e292ed4be1

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue May  2 12:00:30 2006 +0100

oleaut32: Split out the SAFEARRAY and BSTR tests so that they can be used in the upcoming VARIANT tests.

---

 dlls/oleaut32/tests/usrmarshal.c |  186 ++++++++++++++++++++++++++++----------
 1 files changed, 138 insertions(+), 48 deletions(-)

diff --git a/dlls/oleaut32/tests/usrmarshal.c b/dlls/oleaut32/tests/usrmarshal.c
index 5d79315..9f2db8b 100644
--- a/dlls/oleaut32/tests/usrmarshal.c
+++ b/dlls/oleaut32/tests/usrmarshal.c
@@ -32,13 +32,123 @@ #include "wine/test.h"
 #define LPSAFEARRAY_UNMARSHAL_WORKS 0
 #define BSTR_UNMARSHAL_WORKS 0
 
+static inline SF_TYPE get_union_type(SAFEARRAY *psa)
+{
+    VARTYPE vt;
+    HRESULT hr;
+
+    hr = SafeArrayGetVartype(psa, &vt);
+    if (FAILED(hr))
+        return 0;
+
+    if (psa->fFeatures & FADF_HAVEIID)
+        return SF_HAVEIID;
+
+    switch (vt)
+    {
+    case VT_I1:
+    case VT_UI1:      return SF_I1;
+    case VT_BOOL:
+    case VT_I2:
+    case VT_UI2:      return SF_I2;
+    case VT_INT:
+    case VT_UINT:
+    case VT_I4:
+    case VT_UI4:
+    case VT_R4:       return SF_I4;
+    case VT_DATE:
+    case VT_CY:
+    case VT_R8:
+    case VT_I8:
+    case VT_UI8:      return SF_I8;
+    case VT_INT_PTR:
+    case VT_UINT_PTR: return (sizeof(UINT_PTR) == 4 ? SF_I4 : SF_I8);
+    case VT_BSTR:     return SF_BSTR;
+    case VT_DISPATCH: return SF_DISPATCH;
+    case VT_VARIANT:  return SF_VARIANT;
+    case VT_UNKNOWN:  return SF_UNKNOWN;
+    /* Note: Return a non-zero size to indicate vt is valid. The actual size
+     * of a UDT is taken from the result of IRecordInfo_GetSize().
+     */
+    case VT_RECORD:   return SF_RECORD;
+    default:          return SF_ERROR;
+    }
+}
+
+static ULONG get_cell_count(const SAFEARRAY *psa)
+{
+    const SAFEARRAYBOUND* psab = psa->rgsabound;
+    USHORT cCount = psa->cDims;
+    ULONG ulNumCells = 1;
+
+    while (cCount--)
+    {
+         if (!psab->cElements)
+            return 0;
+        ulNumCells *= psab->cElements;
+        psab++;
+    }
+    return ulNumCells;
+}
+
+static void check_safearray(void *buffer, LPSAFEARRAY lpsa)
+{
+    unsigned char *wiresa = buffer;
+    VARTYPE vt;
+    SF_TYPE sftype;
+    ULONG cell_count;
+
+    if(!lpsa)
+    {
+        ok(*(DWORD *)wiresa == FALSE, "wiresa + 0x0 should be FALSE instead of 0x%08lx\n", *(DWORD *)wiresa);
+        return;
+    }
+
+    SafeArrayGetVartype(lpsa, &vt);
+    sftype = get_union_type(lpsa);
+    cell_count = get_cell_count(lpsa);
+
+    ok(*(DWORD *)wiresa == TRUE, "wiresa + 0x0 should be TRUE instead of 0x%08lx\n", *(DWORD *)wiresa);
+    wiresa += sizeof(DWORD);
+    ok(*(DWORD *)wiresa == lpsa->cDims, "wiresa + 0x4 should be lpsa->cDims instead of 0x%08lx\n", *(DWORD *)wiresa);
+    wiresa += sizeof(DWORD);
+    ok(*(WORD *)wiresa == lpsa->cDims, "wiresa + 0x8 should be lpsa->cDims instead of 0x%04x\n", *(WORD *)wiresa);
+    wiresa += sizeof(WORD);
+    ok(*(WORD *)wiresa == lpsa->fFeatures, "wiresa + 0xc should be lpsa->fFeatures instead of 0x%08x\n", *(WORD *)wiresa);
+    wiresa += sizeof(WORD);
+    ok(*(DWORD *)wiresa == lpsa->cbElements, "wiresa + 0x10 should be lpsa->cbElements instead of 0x%08lx\n", *(DWORD *)wiresa);
+    wiresa += sizeof(DWORD);
+    ok(*(WORD *)wiresa == lpsa->cLocks, "wiresa + 0x16 should be lpsa->cLocks instead of 0x%04x\n", *(WORD *)wiresa);
+    wiresa += sizeof(WORD);
+    ok(*(WORD *)wiresa == vt, "wiresa + 0x14 should be %04x instead of 0x%04x\n", vt, *(WORD *)wiresa);
+    wiresa += sizeof(WORD);
+    ok(*(DWORD *)wiresa == sftype, "wiresa + 0x18 should be %08lx instead of 0x%08lx\n", (DWORD)sftype, *(DWORD *)wiresa);
+    wiresa += sizeof(DWORD);
+    ok(*(DWORD *)wiresa == cell_count, "wiresa + 0x1c should be %lu instead of %lu\n", cell_count, *(DWORD *)wiresa);
+    wiresa += sizeof(DWORD);
+    ok(*(DWORD_PTR *)wiresa == (DWORD_PTR)lpsa->pvData, "wirestgm + 0x20 should be lpsa->pvData instead of 0x%08lx\n", *(DWORD_PTR *)wiresa);
+    wiresa += sizeof(DWORD_PTR);
+    if(sftype == SF_HAVEIID)
+    {
+        GUID guid;
+        SafeArrayGetIID(lpsa, &guid);
+        ok(IsEqualGUID(&guid, (GUID*)wiresa), "guid mismatch\n");
+        wiresa += sizeof(GUID);
+    }
+    ok(!memcmp(wiresa, lpsa->rgsabound, sizeof(lpsa->rgsabound[0]) * lpsa->cDims), "bounds mismatch\n");
+    wiresa += sizeof(lpsa->rgsabound[0]) * lpsa->cDims;
+
+    ok(*(DWORD *)wiresa == cell_count, "wiresa + 0x2c should be %lu instead of %lu\n", cell_count, *(DWORD*)wiresa);
+    wiresa += sizeof(DWORD);
+    /* elements are now pointed to by wiresa */
+}
+
 static void test_marshal_LPSAFEARRAY(void)
 {
     unsigned char *buffer;
     unsigned long size;
     LPSAFEARRAY lpsa;
     LPSAFEARRAY lpsa2 = NULL;
-    unsigned char *wiresa;
     SAFEARRAYBOUND sab;
     MIDL_STUB_MESSAGE stubMsg = { 0 };
     USER_MARSHAL_CB umcb = { 0 };
@@ -58,34 +168,8 @@ static void test_marshal_LPSAFEARRAY(voi
     ok(size == 64, "size should be 64 bytes, not %ld\n", size);
     buffer = (unsigned char *)HeapAlloc(GetProcessHeap(), 0, size);
     LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
-    wiresa = buffer;
-    ok(*(DWORD *)wiresa == TRUE, "wiresa + 0x0 should be TRUE instead of 0x%08lx\n", *(DWORD *)wiresa);
-    wiresa += sizeof(DWORD);
-    ok(*(DWORD *)wiresa == lpsa->cDims, "wiresa + 0x4 should be lpsa->cDims instead of 0x%08lx\n", *(DWORD *)wiresa);
-    wiresa += sizeof(DWORD);
-    ok(*(WORD *)wiresa == lpsa->cDims, "wiresa + 0x8 should be lpsa->cDims instead of 0x%04x\n", *(WORD *)wiresa);
-    wiresa += sizeof(WORD);
-    ok(*(WORD *)wiresa == lpsa->fFeatures, "wiresa + 0xc should be lpsa->fFeatures instead of 0x%08x\n", *(WORD *)wiresa);
-    wiresa += sizeof(WORD);
-    ok(*(DWORD *)wiresa == lpsa->cbElements, "wiresa + 0x10 should be lpsa->cbElements instead of 0x%08lx\n", *(DWORD *)wiresa);
-    wiresa += sizeof(DWORD);
-    ok(*(WORD *)wiresa == lpsa->cLocks, "wiresa + 0x16 should be lpsa->cLocks instead of 0x%04x\n", *(WORD *)wiresa);
-    wiresa += sizeof(WORD);
-    ok(*(WORD *)wiresa == VT_I2, "wiresa + 0x14 should be VT_I2 instead of 0x%04x\n", *(WORD *)wiresa);
-    wiresa += sizeof(WORD);
-    ok(*(DWORD *)wiresa == VT_I2, "wiresa + 0x18 should be VT_I2 instead of 0x%08lx\n", *(DWORD *)wiresa);
-    wiresa += sizeof(DWORD);
-    ok(*(DWORD *)wiresa == sab.cElements, "wiresa + 0x1c should be sab.cElements instead of %lu\n", *(DWORD *)wiresa);
-    wiresa += sizeof(DWORD);
-    ok(*(DWORD_PTR *)wiresa == (DWORD_PTR)lpsa->pvData, "wirestgm + 0x20 should be lpsa->pvData instead of 0x%08lx\n", *(DWORD_PTR *)wiresa);
-    wiresa += sizeof(DWORD_PTR);
-    ok(*(DWORD *)wiresa == sab.cElements, "wiresa + 0x24 should be sab.cElements instead of %lu\n", *(DWORD *)wiresa);
-    wiresa += sizeof(DWORD);
-    ok(*(LONG *)wiresa == sab.lLbound, "wiresa + 0x28 should be sab.clLbound instead of %ld\n", *(LONG *)wiresa);
-    wiresa += sizeof(LONG);
-    ok(*(DWORD *)wiresa == sab.cElements, "wiresa + 0x2c should be sab.cElements instead of %lu\n", *(DWORD *)wiresa);
-    wiresa += sizeof(DWORD);
-    /* elements are now pointed to by wiresa */
+
+    check_safearray(buffer, lpsa);
 
     if (LPSAFEARRAY_UNMARSHAL_WORKS)
     {
@@ -103,9 +187,7 @@ static void test_marshal_LPSAFEARRAY(voi
     ok(size == 4, "size should be 4 bytes, not %ld\n", size);
     buffer = (unsigned char *)HeapAlloc(GetProcessHeap(), 0, size);
     LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
-    wiresa = buffer;
-    ok(*(DWORD *)wiresa == FALSE, "wiresa + 0x0 should be FALSE instead of 0x%08lx\n", *(DWORD *)wiresa);
-    wiresa += sizeof(DWORD);
+    check_safearray(buffer, lpsa);
 
     if (LPSAFEARRAY_UNMARSHAL_WORKS)
     {
@@ -116,6 +198,27 @@ static void test_marshal_LPSAFEARRAY(voi
     HeapFree(GetProcessHeap(), 0, buffer);
 }
 
+static void check_bstr(void *buffer, BSTR b)
+{
+    DWORD *wireb = buffer;
+    DWORD len = SysStringLen(b);
+
+    ok(*wireb == len, "wv[0] %08lx\n", *wireb);
+    wireb++;
+    if(len)
+        ok(*wireb == len * 2, "wv[1] %08lx\n", *wireb);
+    else
+        ok(*wireb == 0xffffffff, "wv[1] %08lx\n", *wireb);
+    wireb++;
+    ok(*wireb == len, "wv[2] %08lx\n", *wireb);
+    if(len)
+    {
+        wireb++;
+        ok(!memcmp(wireb, b, len * 2), "strings differ\n");
+    }
+    return;
+}
+
 static void test_marshal_BSTR(void)
 {
     unsigned long size;
@@ -124,7 +227,7 @@ static void test_marshal_BSTR(void)
     unsigned char *buffer;
     BSTR b, b2;
     WCHAR str[] = {'m','a','r','s','h','a','l',' ','t','e','s','t','1',0};
-    DWORD *wireb, len;
+    DWORD len;
 
     umcb.Flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION);
     umcb.pReserve = NULL;
@@ -143,15 +246,7 @@ static void test_marshal_BSTR(void)
 
     buffer = HeapAlloc(GetProcessHeap(), 0, size);
     BSTR_UserMarshal(&umcb.Flags, buffer, &b);
-    wireb = (DWORD*)buffer;
-
-    ok(*wireb == len, "wv[0] %08lx\n", *wireb);
-    wireb++;
-    ok(*wireb == len * 2, "wv[1] %08lx\n", *wireb);
-    wireb++;
-    ok(*wireb == len, "wv[2] %08lx\n", *wireb);
-    wireb++;
-    ok(!memcmp(wireb, str, len * 2), "strings differ\n");
+    check_bstr(buffer, b);
 
     if (BSTR_UNMARSHAL_WORKS)
     {
@@ -171,13 +266,8 @@ static void test_marshal_BSTR(void)
 
     buffer = HeapAlloc(GetProcessHeap(), 0, size);
     BSTR_UserMarshal(&umcb.Flags, buffer, &b);
-    wireb = (DWORD*)buffer;
-    ok(*wireb == 0, "wv[0] %08lx\n", *wireb);
-    wireb++;
-    ok(*wireb == 0xffffffff, "wv[1] %08lx\n", *wireb);
-    wireb++;
-    ok(*wireb == 0, "wv[2] %08lx\n", *wireb);
 
+    check_bstr(buffer, b);
     HeapFree(GetProcessHeap(), 0, buffer);
 
 }




More information about the wine-cvs mailing list