From fd0d1d0765297a0b614645f55fdf6d1ca12e2603 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 31 Jan 2008 18:09:04 +0100 Subject: [PATCH] urlmon: Added CopyStgMedium implementation. --- dlls/urlmon/tests/misc.c | 33 +++++++++++++++++++++++++++++++++ dlls/urlmon/urlmon.spec | 2 +- dlls/urlmon/urlmon_main.c | 33 +++++++++++++++++++++++++++++++++ include/urlmon.idl | 1 + 4 files changed, 68 insertions(+), 1 deletion(-) diff --git a/dlls/urlmon/tests/misc.c b/dlls/urlmon/tests/misc.c index 001ee9c1837..1ed76146ae0 100644 --- a/dlls/urlmon/tests/misc.c +++ b/dlls/urlmon/tests/misc.c @@ -18,6 +18,7 @@ #define COBJMACROS #define CONST_VTABLE +#define NONAMELESSUNION #include #include @@ -1177,6 +1178,37 @@ static void test_ReleaseBindInfo(void) ok(bi.pUnk == &unk, "bi.pUnk=%p, expected %p\n", bi.pUnk, &unk); } +static void test_CopyStgMedium(void) +{ + STGMEDIUM src, dst; + HRESULT hres; + + memset(&src, 0xf0, sizeof(src)); + memset(&dst, 0xe0, sizeof(dst)); + src.tymed = TYMED_NULL; + src.pUnkForRelease = NULL; + hres = CopyStgMedium(&src, &dst); + ok(hres == S_OK, "CopyStgMedium failed: %08x\n", hres); + ok(dst.tymed == TYMED_NULL, "tymed=%d\n", dst.tymed); + ok(dst.u.hGlobal == (void*)0xf0f0f0f0, "u=%p\n", dst.u.hGlobal); + ok(!dst.pUnkForRelease, "pUnkForRelease=%p, expected NULL\n", dst.pUnkForRelease); + + memset(&dst, 0xe0, sizeof(dst)); + src.tymed = TYMED_ISTREAM; + src.u.pstm = NULL; + src.pUnkForRelease = NULL; + hres = CopyStgMedium(&src, &dst); + ok(hres == S_OK, "CopyStgMedium failed: %08x\n", hres); + ok(dst.tymed == TYMED_ISTREAM, "tymed=%d\n", dst.tymed); + ok(!dst.u.pstm, "pstm=%p\n", dst.u.pstm); + ok(!dst.pUnkForRelease, "pUnkForRelease=%p, expected NULL\n", dst.pUnkForRelease); + + hres = CopyStgMedium(&src, NULL); + ok(hres == E_POINTER, "CopyStgMedium failed: %08x, expected E_POINTER\n", hres); + hres = CopyStgMedium(NULL, &dst); + ok(hres == E_POINTER, "CopyStgMedium failed: %08x, expected E_POINTER\n", hres); +} + static void test_UrlMkGetSessionOption(void) { DWORD encoding, size; @@ -1339,6 +1371,7 @@ START_TEST(misc) test_NameSpace(); test_MimeFilter(); test_ReleaseBindInfo(); + test_CopyStgMedium(); test_UrlMkGetSessionOption(); test_ObtainUserAgentString(); test_MkParseDisplayNameEx(); diff --git a/dlls/urlmon/urlmon.spec b/dlls/urlmon/urlmon.spec index 06a56b068be..1fa2f941c34 100644 --- a/dlls/urlmon/urlmon.spec +++ b/dlls/urlmon/urlmon.spec @@ -21,7 +21,7 @@ @ stdcall CoInternetQueryInfo(ptr long long ptr long ptr long) @ stub CompareSecurityIds @ stub CopyBindInfo -@ stub CopyStgMedium +@ stdcall CopyStgMedium(ptr ptr) @ stdcall CreateAsyncBindCtx(long ptr ptr ptr) @ stdcall CreateAsyncBindCtxEx(ptr long ptr ptr ptr long) @ stdcall CreateFormatEnumerator(long ptr ptr) diff --git a/dlls/urlmon/urlmon_main.c b/dlls/urlmon/urlmon_main.c index a20772da23a..ca52143345e 100644 --- a/dlls/urlmon/urlmon_main.c +++ b/dlls/urlmon/urlmon_main.c @@ -406,6 +406,39 @@ void WINAPI ReleaseBindInfo(BINDINFO* pbindinfo) pbindinfo->cbSize = size; } +/*********************************************************************** + * CopyStgMedium (URLMON.@) + */ +HRESULT WINAPI CopyStgMedium(const STGMEDIUM *src, STGMEDIUM *dst) +{ + TRACE("(%p %p)\n", src, dst); + + if(!src || !dst) + return E_POINTER; + + memcpy(dst, src, sizeof(STGMEDIUM)); + + switch(dst->tymed) { + case TYMED_NULL: + break; + case TYMED_ISTREAM: + if(dst->u.pstm) + IStream_AddRef(dst->u.pstm); + break; + case TYMED_ISTORAGE: + if(dst->u.pstg) + IStorage_AddRef(dst->u.pstg); + break; + default: + FIXME("Unimplemented tymed %d\n", src->tymed); + } + + if(dst->pUnkForRelease) + IUnknown_AddRef(dst->pUnkForRelease); + + return S_OK; +} + static BOOL text_richtext_filter(const BYTE *b, DWORD size) { return size > 5 && !memcmp(b, "{\\rtf", 5); diff --git a/include/urlmon.idl b/include/urlmon.idl index ab59c409385..d1da02a1130 100644 --- a/include/urlmon.idl +++ b/include/urlmon.idl @@ -1279,6 +1279,7 @@ cpp_quote("HRESULT WINAPI ObtainUserAgentString(DWORD,LPSTR,DWORD*);") cpp_quote("HRESULT WINAPI RegisterFormatEnumerator(LPBC,IEnumFORMATETC*,DWORD);") cpp_quote("HRESULT WINAPI RevokeFormatEnumerator(LPBC,IEnumFORMATETC*);") cpp_quote("HRESULT WINAPI RevokeBindStatusCallback(LPBC,IBindStatusCallback*);") +cpp_quote("HRESULT WINAPI CopyStgMedium(const STGMEDIUM*,STGMEDIUM*);") cpp_quote("void WINAPI ReleaseBindInfo(BINDINFO*);") cpp_quote("HRESULT WINAPI UrlMkGetSessionOption(DWORD,LPVOID,DWORD,DWORD*,DWORD);") cpp_quote("HRESULT WINAPI UrlMkSetSessionOption(DWORD,LPVOID,DWORD,DWORD);") -- 2.11.4.GIT