From: Dmitry Timoshkov Subject: [2/2] oleaut32: Implement a better stub for IPicture::SaveAsFile. Message-Id: <20151124172738.2706e5a8.dmitry@baikal.ru> Date: Tue, 24 Nov 2015 17:27:38 +0800 Based on OLEPictureImpl_Save implementation. For bug 8532. Signed-off-by: Dmitry Timoshkov --- dlls/oleaut32/olepicture.c | 93 ++++++++++++++++++++++++++++++++++------ dlls/oleaut32/tests/olepicture.c | 9 ---- 2 files changed, 80 insertions(+), 22 deletions(-) diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c index 5ce83e0..8acd64d 100644 --- a/dlls/oleaut32/olepicture.c +++ b/dlls/oleaut32/olepicture.c @@ -834,19 +834,6 @@ static HRESULT WINAPI OLEPictureImpl_PictureChanged(IPicture *iface) } /************************************************************************ - * OLEPictureImpl_SaveAsFile - */ -static HRESULT WINAPI OLEPictureImpl_SaveAsFile(IPicture *iface, - IStream *pstream, - BOOL SaveMemCopy, - LONG *pcbSize) -{ - OLEPictureImpl *This = impl_from_IPicture(iface); - FIXME("(%p)->(%p, %d, %p), hacked stub.\n", This, pstream, SaveMemCopy, pcbSize); - return IStream_Write(pstream,This->data,This->datalen,(ULONG*)pcbSize); -} - -/************************************************************************ * OLEPictureImpl_get_Attributes */ static HRESULT WINAPI OLEPictureImpl_get_Attributes(IPicture *iface, @@ -1859,6 +1846,86 @@ static HRESULT WINAPI OLEPictureImpl_GetSizeMax( return E_NOTIMPL; } +/************************************************************************ + * OLEPictureImpl_SaveAsFile + */ +static HRESULT WINAPI OLEPictureImpl_SaveAsFile(IPicture *iface, + IStream *stream, BOOL mem_copy, LONG *size) +{ + OLEPictureImpl *This = impl_from_IPicture(iface); + IPersistStream *pstream; + void *data; + unsigned data_size; + ULONG written; + HRESULT hr; + + FIXME("(%p)->(%p,%d,%p): semi-stub\n", This, stream, mem_copy, size); + + switch (This->desc.picType) + { + case PICTYPE_NONE: + return S_OK; + + case PICTYPE_ICON: + if (!mem_copy) return E_FAIL; + + if (This->bIsDirty || !This->data) + { + if (!serializeIcon(This->desc.u.icon.hicon, &data, &data_size)) + return E_FAIL; + HeapFree(GetProcessHeap(), 0, This->data); + This->data = data; + This->datalen = data_size; + } + hr = IStream_Write(stream, This->data, This->datalen, &written); + if (hr == S_OK && size) *size = written; + return hr; + + case PICTYPE_BITMAP: + if (!mem_copy) return E_FAIL; + + if (This->bIsDirty || !This->data) + { + switch (This->keepOrigFormat ? This->loadtime_format : BITMAP_FORMAT_BMP) + { + case BITMAP_FORMAT_BMP: + if (!serializeBMP(This->desc.u.bmp.hbitmap, &data, &data_size)) + return E_FAIL; + break; + case BITMAP_FORMAT_JPEG: + FIXME("BITMAP_FORMAT_JPEG is not implemented\n"); + return E_NOTIMPL; + case BITMAP_FORMAT_GIF: + FIXME("BITMAP_FORMAT_GIF is not implemented\n"); + return E_NOTIMPL; + case BITMAP_FORMAT_PNG: + FIXME("BITMAP_FORMAT_PNG is not implemented\n"); + return E_NOTIMPL; + default: + FIXME("PICTYPE_BITMAP/%#x is not implemented\n", This->loadtime_format); + return E_NOTIMPL; + } + + HeapFree(GetProcessHeap(), 0, This->data); + This->data = data; + This->datalen = data_size; + } + hr = IStream_Write(stream, This->data, This->datalen, &written); + if (hr == S_OK && size) *size = written; + return hr; + + case PICTYPE_METAFILE: + FIXME("PICTYPE_METAFILE is not implemented\n"); + return E_NOTIMPL; + case PICTYPE_ENHMETAFILE: + FIXME("ENHMETAFILE is not implemented\n"); + return E_NOTIMPL; + default: + FIXME("%#x is not implemented\n", This->desc.picType); + break; + } + return E_NOTIMPL; +} /************************************************************************ * IDispatch diff --git a/dlls/oleaut32/tests/olepicture.c b/dlls/oleaut32/tests/olepicture.c index 0903298..0c69cbd 100644 --- a/dlls/oleaut32/tests/olepicture.c +++ b/dlls/oleaut32/tests/olepicture.c @@ -1079,18 +1079,14 @@ static void test_load_save_bmp(void) size = -1; hr = IPicture_SaveAsFile(pic, dst_stream, TRUE, &size); ok(hr == S_OK, "IPicture_SaveasFile error %#x\n", hr); -todo_wine ok(size == 66, "expected 66, got %d\n", size); mem = GlobalLock(hmem); -todo_wine ok(!memcmp(&mem[0], "BM", 2), "got wrong bmp header %04x\n", mem[0]); GlobalUnlock(hmem); size = -1; hr = IPicture_SaveAsFile(pic, dst_stream, FALSE, &size); -todo_wine ok(hr == E_FAIL, "expected E_FAIL, got %#x\n", hr); -todo_wine ok(size == -1, "expected -1, got %d\n", size); offset.QuadPart = 0; @@ -1157,15 +1153,12 @@ static void test_load_save_icon(void) todo_wine ok(size == 766, "expected 766, got %d\n", size); mem = GlobalLock(hmem); -todo_wine ok(mem[0] == 0x00010000, "got wrong icon header %04x\n", mem[0]); GlobalUnlock(hmem); size = -1; hr = IPicture_SaveAsFile(pic, dst_stream, FALSE, &size); -todo_wine ok(hr == E_FAIL, "expected E_FAIL, got %#x\n", hr); -todo_wine ok(size == -1, "expected -1, got %d\n", size); offset.QuadPart = 0; @@ -1231,13 +1224,11 @@ static void test_load_save_empty_picture(void) size = -1; hr = IPicture_SaveAsFile(pic, dst_stream, TRUE, &size); ok(hr == S_OK, "IPicture_SaveasFile error %#x\n", hr); -todo_wine ok(size == -1, "expected -1, got %d\n", size); size = -1; hr = IPicture_SaveAsFile(pic, dst_stream, FALSE, &size); ok(hr == S_OK, "IPicture_SaveasFile error %#x\n", hr); -todo_wine ok(size == -1, "expected -1, got %d\n", size); hr = IPicture_QueryInterface(pic, &IID_IPersistStream, (void **)&src_stream); -- 2.6.3