On Fri, Apr 06, 2018 at 08:54:38AM -0500, Sergio Gómez Del Real wrote:
Signed-off-by: Sergio Gómez Del Real sdelreal@codeweavers.com
dlls/ole32/datacache.c | 106 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 82 insertions(+), 24 deletions(-)
diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c index 325a98b33b..b51cf02708 100644 --- a/dlls/ole32/datacache.c +++ b/dlls/ole32/datacache.c @@ -704,6 +728,60 @@ fail:
}
+static HRESULT load_emf( DataCacheEntry *cache_entry, IStream *stm ) +{
- HRESULT hr;
- if (cache_entry->load_stream_num != STREAM_NUMBER_CONTENTS)
- {
STGMEDIUM stgmed;hr = load_mf_pict( cache_entry, stm );if (SUCCEEDED( hr )){hr = synthesize_emf( cache_entry->stgmedium.u.hMetaFilePict, &stgmed );ReleaseStgMedium( &cache_entry->stgmedium );}if (SUCCEEDED( hr ))cache_entry->stgmedium = stgmed;- }
- else
- {
STATSTG stat;BYTE *data;ULONG read, size_bits;hr = IStream_Stat( stm, &stat, STATFLAG_NONAME );if (SUCCEEDED( hr )){data = HeapAlloc( GetProcessHeap(), 0, stat.cbSize.u.LowPart );if (!data) return E_OUTOFMEMORY;hr = IStream_Read( stm, data, stat.cbSize.u.LowPart, &read );if (hr != S_OK){HeapFree( GetProcessHeap(), 0, data );return E_FAIL;
In general, you should propagate errors, so you should return hr here.
}if (read <= sizeof(DWORD) + sizeof(ENHMETAHEADER)){HeapFree( GetProcessHeap(), 0, data );return E_FAIL;}size_bits = read - sizeof(DWORD) - sizeof(ENHMETAHEADER);cache_entry->stgmedium.u.hEnhMetaFile = SetEnhMetaFileBits( size_bits, data + (read - size_bits) );cache_entry->stgmedium.tymed = TYMED_ENHMF;cache_entry->stgmedium.pUnkForRelease = NULL;HeapFree( GetProcessHeap(), 0, data );}- }
- return hr;
+}
/************************************************************************
- DataCacheEntry_LoadData
@@ -736,6 +814,10 @@ static HRESULT DataCacheEntry_LoadData(DataCacheEntry *cache_entry, IStorage *st hr = load_dib( cache_entry, stm ); break;
- case CF_ENHMETAFILE:
hr = load_emf( cache_entry, stm );break;- default: FIXME( "Unimplemented clip format %x\n", cache_entry->fmtetc.cfFormat ); hr = E_NOTIMPL;
@@ -1118,30 +1200,6 @@ static HRESULT synthesize_bitmap( HGLOBAL dib, STGMEDIUM *med ) return hr; }
-static HRESULT synthesize_emf( HMETAFILEPICT data, STGMEDIUM *med ) -{
- METAFILEPICT *pict;
- HRESULT hr = E_FAIL;
- UINT size;
- void *bits;
- if (!(pict = GlobalLock( data ))) return hr;
- size = GetMetaFileBitsEx( pict->hMF, 0, NULL );
- if ((bits = HeapAlloc( GetProcessHeap(), 0, size )))
- {
GetMetaFileBitsEx( pict->hMF, size, bits );med->u.hEnhMetaFile = SetWinMetaFileBits( size, bits, NULL, pict );HeapFree( GetProcessHeap(), 0, bits );med->tymed = TYMED_ENHMF;med->pUnkForRelease = NULL;hr = S_OK;- }
- GlobalUnlock( data );
- return hr;
-}
static HRESULT DataCacheEntry_SetData(DataCacheEntry *cache_entry, const FORMATETC *formatetc, STGMEDIUM *stgmedium, -- 2.14.1