Signed-off-by: Sergio Gómez Del Real sdelreal@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); + } }