[PATCH 04/10] ole32: Add support for parsing the 'CONTENTS' stream.
Huw Davies
huw at codeweavers.com
Wed Mar 25 03:37:36 CDT 2015
---
dlls/ole32/datacache.c | 32 +++++++++++++++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)
diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c
index 53defc1..f791f80 100644
--- a/dlls/ole32/datacache.c
+++ b/dlls/ole32/datacache.c
@@ -92,6 +92,7 @@ enum stream_type
{
no_stream,
pres_stream,
+ contents_stream
};
typedef struct DataCacheEntry
@@ -1293,6 +1294,26 @@ static HRESULT parse_pres_streams( DataCache *This, IStorage *stg )
return S_OK;
}
+static const FORMATETC static_dib_fmt = { CF_DIB, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
+
+static HRESULT parse_contents_stream( DataCache *This, IStorage *stg, IStream *stm )
+{
+ HRESULT hr;
+ STATSTG stat;
+ const FORMATETC *fmt;
+
+ hr = IStorage_Stat( stg, &stat, STATFLAG_NONAME );
+ if (FAILED( hr )) return hr;
+
+ if (IsEqualCLSID( &stat.clsid, &CLSID_Picture_Dib ))
+ fmt = &static_dib_fmt;
+ else
+ return E_FAIL;
+
+ return add_cache_entry( This, fmt, stm, contents_stream );
+}
+
+static const WCHAR CONTENTS[] = {'C','O','N','T','E','N','T','S',0};
/************************************************************************
* DataCache_Load (IPersistStorage)
@@ -1306,12 +1327,21 @@ static HRESULT WINAPI DataCache_Load( IPersistStorage *iface, IStorage *pStg )
{
DataCache *This = impl_from_IPersistStorage(iface);
HRESULT hr;
+ IStream *stm;
TRACE("(%p, %p)\n", iface, pStg);
IPersistStorage_HandsOffStorage( iface );
- hr = parse_pres_streams( This, pStg );
+ hr = IStorage_OpenStream( pStg, CONTENTS, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE,
+ 0, &stm );
+ if (SUCCEEDED( hr ))
+ {
+ hr = parse_contents_stream( This, pStg, stm );
+ IStream_Release( stm );
+ }
+ else
+ hr = parse_pres_streams( This, pStg );
if (SUCCEEDED( hr ))
{
--
1.8.0
More information about the wine-patches
mailing list