On Tue, May 02, 2017 at 06:11:22PM +0800, Wei Xie wrote:
diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c index 441a874..51a67e2 100644 --- a/dlls/ole32/datacache.c +++ b/dlls/ole32/datacache.c @@ -2052,8 +2052,45 @@ static HRESULT WINAPI DataCache_InitCache( IOleCache2* iface, IDataObject* pDataObject) { - FIXME("stub\n"); - return E_NOTIMPL; + HRESULT hr; + FORMATETC fmt; + STGMEDIUM med; + + FIXME("semi-stub\n"); + + hr = IDataObject_GetData(pDataObject, &fmt, &med); + if (FAILED(hr)) + { + return CACHE_E_NOCACHE_UPDATED; + } + + if (!fmt.cfFormat || !fmt.tymed || + (check_valid_clipformat_and_tymed(fmt.cfFormat, fmt.tymed, FALSE) + && TYMED_NULL != med.tymed)) + { + switch(med.tymed) + { + case TYMED_GDI: + { + fmt.cfFormat = CF_BITMAP; + fmt.ptd = NULL; + fmt.dwAspect = DVASPECT_CONTENT; + fmt.lindex = -1; + fmt.tymed = TYMED_GDI; + } + break; + default: + FIXME("Fill formatetc\n"); + } + } + + hr = IOleCache2_SetData(iface, &fmt, &med, FALSE); + if (FAILED(hr)) + { + return CACHE_E_NOCACHE_UPDATED; + } + + return hr; }
This isn't correct. What I think the tests will show you is that it looks something like the pseudo-code: for_each_cached_format( &fmt ) /* some function that returns the fmt of each cache entry */ { IDataObject_GetData(pDataObject, &fmt, &med); IOleCache2_SetData(iface, &fmt, &med); } Of course there needs to be error handling, tests if the cache has already been initialized, etc. However for now I suggest you just concerntrate on getting the tests in, and come back to this and the subsequent patches later on. Huw.