From 6c4bdf3bdf95718db25ccf67d16ee0e7bdf1a55d Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Sat, 19 May 2012 02:06:06 +0400 Subject: [PATCH] urlmon: Implement TYMED_HGLOBAL case for CopyStgMedium. --- dlls/urlmon/tests/misc.c | 33 ++++++++++++++++++++++++++++++++- dlls/urlmon/urlmon_main.c | 15 +++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/dlls/urlmon/tests/misc.c b/dlls/urlmon/tests/misc.c index 6af98f38ab2..fb2050909c5 100644 --- a/dlls/urlmon/tests/misc.c +++ b/dlls/urlmon/tests/misc.c @@ -1219,8 +1219,10 @@ static void test_ReleaseBindInfo(void) static void test_CopyStgMedium(void) { STGMEDIUM src, dst; - HGLOBAL empty; + HGLOBAL empty, hg; + char *ptr1, *ptr2; HRESULT hres; + int size; static WCHAR fileW[] = {'f','i','l','e',0}; @@ -1257,6 +1259,35 @@ static void test_CopyStgMedium(void) ok(!dst.pUnkForRelease, "pUnkForRelease=%p, expected NULL\n", dst.pUnkForRelease); ReleaseStgMedium(&dst); + /* TYMED_HGLOBAL */ + hg = GlobalAlloc(GMEM_MOVEABLE, 10); + ptr1 = GlobalLock(hg); + memset(ptr1, 0xfa, 10); + memset(&dst, 0xe0, sizeof(dst)); + src.tymed = TYMED_HGLOBAL; + src.u.hGlobal = hg; + hres = pCopyStgMedium(&src, &dst); + ok(hres == S_OK, "CopyStgMedium failed: %08x\n", hres); + ok(dst.tymed == TYMED_HGLOBAL, "tymed=%d\n", dst.tymed); + ok(dst.u.hGlobal != hg, "got %p, %p\n", dst.u.hGlobal, hg); + size = GlobalSize(dst.u.hGlobal); + ok(size == 10, "got size %d\n", size); + /* compare contents */ + ptr2 = GlobalLock(dst.u.hGlobal); + ok(!memcmp(ptr1, ptr2, 10), "got wrong data\n"); + GlobalUnlock(ptr2); + GlobalUnlock(ptr1); + ok(GlobalFlags(dst.u.hGlobal) == 0, "got 0x%08x\n", GlobalFlags(dst.u.hGlobal)); + GlobalFree(hg); + ReleaseStgMedium(&dst); + + memset(&dst, 0xe0, sizeof(dst)); + src.tymed = TYMED_HGLOBAL; + src.u.hGlobal = NULL; + hres = pCopyStgMedium(&src, &dst); + ok(hres == S_OK, "CopyStgMedium failed: %08x\n", hres); + ok(dst.u.hGlobal == NULL, "got %p\n", dst.u.hGlobal); + hres = pCopyStgMedium(&src, NULL); ok(hres == E_POINTER, "CopyStgMedium failed: %08x, expected E_POINTER\n", hres); hres = pCopyStgMedium(NULL, &dst); diff --git a/dlls/urlmon/urlmon_main.c b/dlls/urlmon/urlmon_main.c index 0cb72ddae2e..f2abe137609 100644 --- a/dlls/urlmon/urlmon_main.c +++ b/dlls/urlmon/urlmon_main.c @@ -544,6 +544,21 @@ HRESULT WINAPI CopyStgMedium(const STGMEDIUM *src, STGMEDIUM *dst) if(dst->u.pstg) IStorage_AddRef(dst->u.pstg); break; + case TYMED_HGLOBAL: + if(dst->u.hGlobal) { + SIZE_T size = GlobalSize(src->u.hGlobal); + char *src_ptr, *dst_ptr; + + dst->u.hGlobal = GlobalAlloc(GMEM_FIXED, size); + if(!dst->u.hGlobal) + return E_OUTOFMEMORY; + dst_ptr = GlobalLock(dst->u.hGlobal); + src_ptr = GlobalLock(src->u.hGlobal); + memcpy(dst_ptr, src_ptr, size); + GlobalUnlock(src_ptr); + GlobalUnlock(dst_ptr); + } + break; default: FIXME("Unimplemented tymed %d\n", src->tymed); } -- 2.11.4.GIT