Jacek Caban : urlmon: Added CopyStgMedium implementation.
Alexandre Julliard
julliard at winehq.org
Mon Feb 4 08:43:06 CST 2008
Module: wine
Branch: master
Commit: fd0d1d0765297a0b614645f55fdf6d1ca12e2603
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fd0d1d0765297a0b614645f55fdf6d1ca12e2603
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Jan 31 18:09:04 2008 +0100
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 deletions(-)
diff --git a/dlls/urlmon/tests/misc.c b/dlls/urlmon/tests/misc.c
index 001ee9c..1ed7614 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 <wine/test.h>
#include <stdarg.h>
@@ -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 06a56b0..1fa2f94 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 a20772d..ca52143 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 ab59c40..d1da02a 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);")
More information about the wine-cvs
mailing list