urlmon: Implement TYMED_HGLOBAL case for CopyStgMedium
Nikolay Sivov
nsivov at codeweavers.com
Mon May 21 04:07:38 CDT 2012
Implement TYMED_HGLOBAL case for CopyStgMedium
-------------- next part --------------
>From 89323a116bad9fd76d180e64e776c14091e17aae Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sat, 19 May 2012 02:06:06 +0400
Subject: [PATCH 1/8] Implement TYMED_HGLOBAL case for CopyStgMedium
---
dlls/urlmon/tests/misc.c | 33 ++++++++++++++++++++++++++++++++-
dlls/urlmon/urlmon_main.c | 15 +++++++++++++++
2 files changed, 47 insertions(+), 1 deletions(-)
diff --git a/dlls/urlmon/tests/misc.c b/dlls/urlmon/tests/misc.c
index 6af98f3..fb20509 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 0cb72dd..f2abe13 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);
}
--
1.5.6.5
More information about the wine-patches
mailing list