ole32: Implement the SetData function for the data cache.
This commit is contained in:
parent
25d7d95035
commit
46f70207b2
|
@ -515,6 +515,59 @@ static HRESULT DataCacheEntry_LoadData(DataCacheEntry *This)
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* helper for copying STGMEDIUM of type bitmap, MF, EMF or HGLOBAL.
|
||||||
|
* does no checking of whether src_stgm has a supported tymed, so this should be
|
||||||
|
* done in the caller */
|
||||||
|
static HRESULT copy_stg_medium(CLIPFORMAT cf, STGMEDIUM *dest_stgm,
|
||||||
|
const STGMEDIUM *src_stgm)
|
||||||
|
{
|
||||||
|
if (src_stgm->tymed == TYMED_MFPICT)
|
||||||
|
{
|
||||||
|
const METAFILEPICT *src_mfpict = GlobalLock(src_stgm->u.hMetaFilePict);
|
||||||
|
METAFILEPICT *dest_mfpict;
|
||||||
|
|
||||||
|
if (!src_mfpict)
|
||||||
|
return DV_E_STGMEDIUM;
|
||||||
|
dest_stgm->u.hMetaFilePict = GlobalAlloc(GMEM_MOVEABLE, sizeof(METAFILEPICT));
|
||||||
|
dest_mfpict = GlobalLock(dest_stgm->u.hMetaFilePict);
|
||||||
|
if (!dest_mfpict)
|
||||||
|
{
|
||||||
|
GlobalUnlock(src_stgm->u.hMetaFilePict);
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
}
|
||||||
|
*dest_mfpict = *src_mfpict;
|
||||||
|
dest_mfpict->hMF = CopyMetaFileW(src_mfpict->hMF, NULL);
|
||||||
|
GlobalUnlock(src_stgm->u.hMetaFilePict);
|
||||||
|
GlobalUnlock(dest_stgm->u.hMetaFilePict);
|
||||||
|
}
|
||||||
|
else if (src_stgm->tymed != TYMED_NULL)
|
||||||
|
{
|
||||||
|
dest_stgm->u.hGlobal = OleDuplicateData(src_stgm->u.hGlobal, cf,
|
||||||
|
GMEM_MOVEABLE);
|
||||||
|
if (!dest_stgm->u.hGlobal)
|
||||||
|
return E_OUTOFMEMORY;
|
||||||
|
}
|
||||||
|
dest_stgm->tymed = src_stgm->tymed;
|
||||||
|
dest_stgm->pUnkForRelease = src_stgm->pUnkForRelease;
|
||||||
|
if (dest_stgm->pUnkForRelease)
|
||||||
|
IUnknown_AddRef(dest_stgm->pUnkForRelease);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT DataCacheEntry_SetData(DataCacheEntry *This,
|
||||||
|
STGMEDIUM *stgmedium, BOOL fRelease)
|
||||||
|
{
|
||||||
|
ReleaseStgMedium(&This->stgmedium);
|
||||||
|
if (fRelease)
|
||||||
|
{
|
||||||
|
This->stgmedium = *stgmedium;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return copy_stg_medium(This->fmtetc.cfFormat,
|
||||||
|
&This->stgmedium, stgmedium);
|
||||||
|
}
|
||||||
|
|
||||||
/*********************************************************
|
/*********************************************************
|
||||||
* Method implementation for the non delegating IUnknown
|
* Method implementation for the non delegating IUnknown
|
||||||
* part of the DataCache class.
|
* part of the DataCache class.
|
||||||
|
@ -1706,8 +1759,25 @@ static HRESULT WINAPI DataCache_IOleCache2_SetData(
|
||||||
STGMEDIUM* pmedium,
|
STGMEDIUM* pmedium,
|
||||||
BOOL fRelease)
|
BOOL fRelease)
|
||||||
{
|
{
|
||||||
FIXME("stub\n");
|
DataCache *This = impl_from_IOleCache2(iface);
|
||||||
return E_NOTIMPL;
|
DataCacheEntry *cache_entry;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
TRACE("(%p, %p, %s)\n", pformatetc, pmedium, fRelease ? "TRUE" : "FALSE");
|
||||||
|
|
||||||
|
cache_entry = DataCache_GetEntryForFormatEtc(This, pformatetc);
|
||||||
|
if (cache_entry)
|
||||||
|
{
|
||||||
|
hr = DataCacheEntry_SetData(cache_entry, pmedium, fRelease);
|
||||||
|
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
DataCache_FireOnViewChange(This, cache_entry->fmtetc.dwAspect,
|
||||||
|
cache_entry->fmtetc.lindex);
|
||||||
|
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OLE_E_BLANK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI DataCache_UpdateCache(
|
static HRESULT WINAPI DataCache_UpdateCache(
|
||||||
|
|
Loading…
Reference in New Issue