[PATCH 4/4] ole32/tests: Add tests for loading from presentation streams to data cache.

Sergio Gómez Del Real sdelreal at codeweavers.com
Tue Mar 27 11:40:01 CDT 2018


Signed-off-by: Sergio Gómez Del Real <sdelreal at codeweavers.com>
---
 dlls/ole32/datacache.c  |  10 +--
 dlls/ole32/tests/ole2.c | 159 ++++++++++++++++++++++++++++++++++++++++++------
 2 files changed, 144 insertions(+), 25 deletions(-)

diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c
index 5a56eb76b5..5bf57035d3 100644
--- a/dlls/ole32/datacache.c
+++ b/dlls/ole32/datacache.c
@@ -1318,7 +1318,7 @@ static inline DWORD tymed_from_cf( DWORD cf )
  * automatic entry is re-assigned a new connection id, and moved to
  * the end of the list.
  */
-static HRESULT create_automatic_entry(DataCache *cache, const CLSID *clsid)
+static HRESULT create_automatic_entry(DataCache *cache, const CLSID *clsid, BOOL entry_was_destroyed)
 {
     static const struct data
     {
@@ -1335,7 +1335,7 @@ static HRESULT create_automatic_entry(DataCache *cache, const CLSID *clsid)
     struct list *head;
     DataCacheEntry *entry;
 
-    if (IsEqualCLSID( &cache->clsid, clsid )) return S_OK;
+    if (IsEqualCLSID( &cache->clsid, clsid ) && !entry_was_destroyed) return S_OK;
 
     /* move and reassign any pre-existing automatic entry */
     if ((head = list_head( &cache->cache_list )))
@@ -1740,7 +1740,7 @@ static HRESULT WINAPI DataCache_InitNew(
     IStorage_AddRef(This->presentationStorage);
     This->dirty = TRUE;
     ReadClassStg( pStg, &clsid );
-    hr = create_automatic_entry( This, &clsid );
+    hr = create_automatic_entry( This, &clsid, FALSE );
     if (FAILED(hr))
     {
         IStorage_Release( pStg );
@@ -1853,7 +1853,7 @@ static HRESULT WINAPI DataCache_Load( IPersistStorage *iface, IStorage *stg )
         DataCacheEntry_Destroy( This, entry );
 
     ReadClassStg( stg, &clsid );
-    hr = create_automatic_entry( This, &clsid );
+    hr = create_automatic_entry( This, &clsid, TRUE );
     if (FAILED( hr )) return hr;
 
     This->clsid = clsid;
@@ -3013,7 +3013,7 @@ static DataCache* DataCache_Construct(
   newObject->dirty = FALSE;
   newObject->running_object = NULL;
 
-  create_automatic_entry( newObject, clsid );
+  create_automatic_entry( newObject, clsid, FALSE );
   newObject->clsid = *clsid;
 
   return newObject;
diff --git a/dlls/ole32/tests/ole2.c b/dlls/ole32/tests/ole2.c
index 3bd4acce92..8aad62c1ce 100644
--- a/dlls/ole32/tests/ole2.c
+++ b/dlls/ole32/tests/ole2.c
@@ -4078,6 +4078,69 @@ static void check_storage_contents(IStorage *stg, const struct storage_def *stg_
     }
 }
 
+static void check_medium_contents(const STGMEDIUM *stgmed_def, STGMEDIUM *stgmed_ld, FORMATETC *fmt)
+{
+    BYTE *data_def, *data_ld;
+    int i;
+    int data_size = 0, data_size_def, data_size_ld;
+
+    if (fmt->cfFormat == CF_METAFILEPICT)
+    {
+        METAFILEPICT *mfpict_def = GlobalLock(U(stgmed_def)->hMetaFilePict);
+        METAFILEPICT *mfpict_ld = GlobalLock(U(stgmed_ld)->hMetaFilePict);
+
+        data_size_def = GetMetaFileBitsEx(mfpict_def->hMF, 0, NULL);
+        data_size_ld = GetMetaFileBitsEx(mfpict_ld->hMF, 0, NULL);
+        ok(data_size_def == data_size_ld, "Sizes differ. Is %d; should be %d\n", data_size_ld, data_size_def);
+        if (data_size_def == data_size_ld)
+        {
+            data_def = HeapAlloc(GetProcessHeap(), 0, data_size_def);
+            data_ld = HeapAlloc(GetProcessHeap(), 0, data_size_ld);
+            GetMetaFileBitsEx(mfpict_def->hMF, data_size_def, data_def);
+            GetMetaFileBitsEx(mfpict_ld->hMF, data_size_ld, data_ld);
+            data_size = data_size_def;
+        }
+    }
+    else if (fmt->cfFormat == CF_ENHMETAFILE)
+    {
+        data_size_def = GetEnhMetaFileBits(stgmed_def->hEnhMetaFile, 0, NULL);
+        data_size_ld = GetEnhMetaFileBits(stgmed_ld->hEnhMetaFile, 0, NULL);
+        ok(data_size_def == data_size_ld, "Sizes differ. Is %d; should be %d\n", data_size_ld, data_size_def);
+        if (data_size_def == data_size_ld)
+        {
+            data_def = HeapAlloc(GetProcessHeap(), 0, data_size_def);
+            data_ld = HeapAlloc(GetProcessHeap(), 0, data_size_ld);
+            GetEnhMetaFileBits(stgmed_def->hEnhMetaFile, data_size_def, data_def);
+            GetEnhMetaFileBits(stgmed_ld->hEnhMetaFile, data_size_ld, data_ld);
+            data_size = data_size_def;
+        }
+    }
+    else if (fmt->cfFormat == CF_DIB)
+    {
+        data_def = GlobalLock(stgmed_def->hGlobal);
+        data_ld = GlobalLock(stgmed_ld->hGlobal);
+
+        data_size = sizeof(dib);
+    }
+
+    for (i = 0; i < data_size; i++)
+    {
+        ok(*data_def == *data_ld, "Data expected and data read does not coincide\n");
+        if (*data_def != *data_ld) break;
+    }
+
+    if (fmt->cfFormat == CF_DIB)
+    {
+        GlobalUnlock(stgmed_def->hGlobal);
+        GlobalUnlock(stgmed_ld->hGlobal);
+    }
+    else if (fmt->cfFormat == CF_METAFILEPICT)
+    {
+        GlobalUnlock(U(stgmed_def)->hMetaFilePict);
+        GlobalUnlock(U(stgmed_ld)->hMetaFilePict);
+    }
+}
+
 static IStorage *create_storage_from_def(const struct storage_def *stg_def)
 {
     HRESULT hr;
@@ -4250,6 +4313,7 @@ static void test_data_cache_save_data(void)
     IStorage *doc;
     IOleCache2 *cache;
     IPersistStorage *persist;
+    IDataObject *odata;
     int enumerated_streams, matched_streams, i;
     DWORD dummy;
     struct tests_data_cache
@@ -4258,6 +4322,7 @@ static void test_data_cache_save_data(void)
         int num_fmts, num_set;
         const CLSID *clsid;
         struct storage_def stg_def;
+        STGMEDIUM stgmed_def[MAX_FMTS];
     };
 
     static struct tests_data_cache *pdata, data[] =
@@ -4274,8 +4339,9 @@ static void test_data_cache_save_data(void)
                 &CLSID_WineTestOld, 4, { { "\2OlePres000", CF_DIB, DVASPECT_CONTENT, 0, NULL, 0 },
                                          { "\2OlePres001", CF_METAFILEPICT, DVASPECT_CONTENT, 0, NULL, 0 },
                                          { "\2OlePres002", CF_ENHMETAFILE, DVASPECT_CONTENT, 0, NULL, 0 },
-                                         { "\2OlePres003", 0, DVASPECT_DOCPRINT, 0, NULL, 0 } }
-            }
+                                         { "\2OlePres003", 0, DVASPECT_DOCPRINT, 0, NULL, 0 } },
+            },
+            { { 0 } }
         },
         /* without setting data */
         {
@@ -4288,8 +4354,9 @@ static void test_data_cache_save_data(void)
             {
                 &CLSID_WineTestOld, 3, { { "\2OlePres000", CF_DIB, DVASPECT_CONTENT, 0, NULL, 0 },
                                          { "\2OlePres001", CF_METAFILEPICT, DVASPECT_CONTENT, 0, NULL, 0 },
-                                         { "\2OlePres002", CF_ENHMETAFILE, DVASPECT_CONTENT, 0, NULL, 0 } }
-            }
+                                         { "\2OlePres002", CF_ENHMETAFILE, DVASPECT_CONTENT, 0, NULL, 0 } },
+            },
+            { { 0 } }
         },
         /* static picture clsids */
         {
@@ -4298,8 +4365,9 @@ static void test_data_cache_save_data(void)
             },
             1, 1, &CLSID_Picture_Dib,
             {
-                &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
-            }
+                &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } },
+            },
+            { { 0 } }
         },
         {
             {
@@ -4307,8 +4375,9 @@ static void test_data_cache_save_data(void)
             },
             1, 1, &CLSID_Picture_Metafile,
             {
-                &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
-            }
+                &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } },
+            },
+            { { 0 } }
         },
         {
             {
@@ -4316,8 +4385,9 @@ static void test_data_cache_save_data(void)
             },
             1, 1, &CLSID_Picture_EnhMetafile,
             {
-                &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
-            }
+                &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } },
+            },
+            { { 0 } }
         },
         /* static picture clsids without setting any data */
         {
@@ -4326,8 +4396,9 @@ static void test_data_cache_save_data(void)
             },
             1, 0, &CLSID_Picture_Dib,
             {
-                &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
-            }
+                &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } },
+            },
+            { { 0 } }
         },
         {
             {
@@ -4335,8 +4406,9 @@ static void test_data_cache_save_data(void)
             },
             1, 0, &CLSID_Picture_Metafile,
             {
-                &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
-            }
+                &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } },
+            },
+            { { 0 } }
         },
         {
             {
@@ -4344,8 +4416,9 @@ static void test_data_cache_save_data(void)
             },
             1, 0, &CLSID_Picture_EnhMetafile,
             {
-                &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } }
-            }
+                &CLSID_WineTestOld, 1, { { "CONTENTS", -1, 0, 0, NULL, 0 } },
+            },
+            { { 0 } }
         },
         {
             {
@@ -4366,9 +4439,9 @@ static void test_data_cache_save_data(void)
             ok(SUCCEEDED(hr), "unexpected %#x\n", hr);
             if (i < pdata->num_set)
             {
-                get_stgmedium(pdata->fmts[i].cfFormat, &stgmed);
-                get_stgdef(&pdata->stg_def, pdata->fmts[i].cfFormat, &stgmed, i);
-                hr = IOleCache2_SetData(cache, &pdata->fmts[i], &stgmed, TRUE);
+                get_stgmedium(pdata->fmts[i].cfFormat, &pdata->stgmed_def[i]);
+                get_stgdef(&pdata->stg_def, pdata->fmts[i].cfFormat, &pdata->stgmed_def[i], i);
+                hr = IOleCache2_SetData(cache, &pdata->fmts[i], &pdata->stgmed_def[i], FALSE);
                 ok(hr == S_OK, "unexpected %#x\n", hr);
             }
         }
@@ -4399,12 +4472,58 @@ static void test_data_cache_save_data(void)
         ok(enumerated_streams == pdata->stg_def.stream_count, "created %d != def streams %d\n",
            enumerated_streams, pdata->stg_def.stream_count);
 
+        IPersistStorage_Release(persist);
+        IOleCache2_Release(cache);
+
+        /* now test _Load/_GetData using the storage we used for _Save */
+        hr = CreateDataCache(NULL, pdata->clsid, &IID_IOleCache2, (void **)&cache);
+        ok(hr == S_OK, "unexpected %#x\n", hr);
+        hr = IOleCache2_QueryInterface(cache, &IID_IPersistStorage, (void **)&persist);
+        ok(hr == S_OK, "unexpected %#x\n", hr);
+        for (i = 0; i < pdata->num_fmts; i++)
+        {
+            hr = IOleCache2_Cache(cache, &pdata->fmts[i], 0, &dummy);
+            ok(SUCCEEDED(hr), "unexpected %#x\n", hr);
+        }
+
+        if (IsEqualCLSID(pdata->clsid, &CLSID_Picture_Dib))
+        {
+            hr = IStorage_SetClass(doc, &CLSID_Picture_Dib);
+            ok(hr == S_OK, "unexpected %#x\n", hr);
+        }
+        else if (IsEqualCLSID(pdata->clsid, &CLSID_Picture_Metafile))
+        {
+            hr = IStorage_SetClass(doc, &CLSID_Picture_Metafile);
+            ok(hr == S_OK, "unexpected %#x\n", hr);
+        }
+        else if (IsEqualCLSID(pdata->clsid, &CLSID_Picture_EnhMetafile))
+        {
+            hr = IStorage_SetClass(doc, &CLSID_Picture_EnhMetafile);
+            ok(hr == S_OK, "unexpected %#x\n", hr);
+        }
+        trace("IPersistStorage_Load\n");
+        hr = IPersistStorage_Load(persist, doc);
+        ok(hr == S_OK, "unexpected %#x\n", hr);
+
+        hr = IOleCache2_QueryInterface(cache, &IID_IDataObject, (void **)&odata);
+        ok(hr == S_OK, "unexpected %#x\n", hr);
         for (i = 0; i < pdata->num_set; i++)
-            HeapFree(GetProcessHeap(), 0, (void *)pdata->stg_def.stream[i].data);
+        {
+            hr = IDataObject_GetData(odata, &pdata->fmts[i], &stgmed);
+            ok(hr == S_OK, "unexpected %#x\n", hr);
 
+            check_medium_contents(&pdata->stgmed_def[i], &stgmed, &pdata->fmts[i]);
+            ReleaseStgMedium(&stgmed);
+            ReleaseStgMedium(&pdata->stgmed_def[i]);
+        }
+
+        IDataObject_Release(odata);
         IPersistStorage_Release(persist);
         IStorage_Release(doc);
         IOleCache2_Release(cache);
+        for (i = 0; i < pdata->num_set; i++)
+            HeapFree(GetProcessHeap(), 0, (void *)pdata->stg_def.stream[i].data);
+
     }
 }
 
-- 
2.14.1




More information about the wine-devel mailing list