ole32: A presentation cache for DVASPECT_ICON must have format CF_METAFILEPICT.

Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
oldstable
Huw Davies 2017-10-31 13:23:30 +00:00 committed by Alexandre Julliard
parent 8d0a53e60d
commit 12718fe021
2 changed files with 36 additions and 9 deletions

View File

@ -322,19 +322,23 @@ static DataCacheEntry *DataCache_GetEntryForFormatEtc(DataCache *This, const FOR
/* checks that the clipformat and tymed are valid and returns an error if they
* aren't and CACHE_S_NOTSUPPORTED if they are valid, but can't be rendered by
* DataCache_Draw */
static HRESULT check_valid_clipformat_and_tymed(CLIPFORMAT cfFormat, DWORD tymed)
static HRESULT check_valid_formatetc( const FORMATETC *fmt )
{
if (!cfFormat || !tymed ||
(cfFormat == CF_METAFILEPICT && tymed == TYMED_MFPICT) ||
(cfFormat == CF_BITMAP && tymed == TYMED_GDI) ||
(cfFormat == CF_DIB && tymed == TYMED_HGLOBAL) ||
(cfFormat == CF_ENHMETAFILE && tymed == TYMED_ENHMF))
/* DVASPECT_ICON must be CF_METAFILEPICT */
if (fmt->dwAspect == DVASPECT_ICON && fmt->cfFormat != CF_METAFILEPICT)
return DV_E_FORMATETC;
if (!fmt->cfFormat || !fmt->tymed ||
(fmt->cfFormat == CF_METAFILEPICT && fmt->tymed == TYMED_MFPICT) ||
(fmt->cfFormat == CF_BITMAP && fmt->tymed == TYMED_GDI) ||
(fmt->cfFormat == CF_DIB && fmt->tymed == TYMED_HGLOBAL) ||
(fmt->cfFormat == CF_ENHMETAFILE && fmt->tymed == TYMED_ENHMF))
return S_OK;
else if (tymed == TYMED_HGLOBAL)
else if (fmt->tymed == TYMED_HGLOBAL)
return CACHE_S_FORMATETC_NOTSUPPORTED;
else
{
WARN("invalid clipformat/tymed combination: %d/%d\n", cfFormat, tymed);
WARN("invalid clipformat/tymed combination: %d/%d\n", fmt->cfFormat, fmt->tymed);
return DV_E_TYMED;
}
}
@ -368,7 +372,7 @@ static HRESULT DataCache_CreateEntry(DataCache *This, const FORMATETC *formatetc
DWORD id = automatic ? 1 : This->last_cache_id;
DataCacheEntry *entry;
hr = check_valid_clipformat_and_tymed(formatetc->cfFormat, formatetc->tymed);
hr = check_valid_formatetc( formatetc );
if (FAILED(hr))
return hr;
if (hr == CACHE_S_FORMATETC_NOTSUPPORTED)

View File

@ -2309,6 +2309,29 @@ static void test_data_cache_cache(void)
hr = IOleCache2_Uncache( cache, view_caching[0].dwConnection );
ok( hr == S_OK, "got %08x\n", hr );
/* Only able to set cfFormat == CF_METAFILEPICT (or == 0, see above) for DVASPECT_ICON */
fmt.dwAspect = DVASPECT_ICON;
fmt.cfFormat = CF_DIB;
fmt.tymed = TYMED_HGLOBAL;
hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
ok( hr == DV_E_FORMATETC, "got %08x\n", hr );
fmt.cfFormat = CF_BITMAP;
fmt.tymed = TYMED_GDI;
hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
ok( hr == DV_E_FORMATETC, "got %08x\n", hr );
fmt.cfFormat = CF_ENHMETAFILE;
fmt.tymed = TYMED_ENHMF;
hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
ok( hr == DV_E_FORMATETC, "got %08x\n", hr );
fmt.cfFormat = CF_METAFILEPICT;
fmt.tymed = TYMED_MFPICT;
hr = IOleCache2_Cache( cache, &fmt, 0, &conn );
ok( hr == S_OK, "got %08x\n", hr );
/* uncache everything */
hr = IOleCache2_Uncache( cache, conn );
ok( hr == S_OK, "got %08x\n", hr );
IDataObject_Release( data );
IOleCache2_Release( cache );
}