Piotr Caban : urlmon: Added CopyBindInfo implementation.
Alexandre Julliard
julliard at winehq.org
Thu Mar 8 14:26:24 CST 2012
Module: wine
Branch: master
Commit: 7f0b7c5ce33f8082bd74a5f77469db8447b1e0f1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7f0b7c5ce33f8082bd74a5f77469db8447b1e0f1
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu Mar 8 13:45:12 2012 +0100
urlmon: Added CopyBindInfo implementation.
---
dlls/urlmon/urlmon.spec | 2 +-
dlls/urlmon/urlmon_main.c | 65 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 66 insertions(+), 1 deletions(-)
diff --git a/dlls/urlmon/urlmon.spec b/dlls/urlmon/urlmon.spec
index 575bdc0..72bd21d 100644
--- a/dlls/urlmon/urlmon.spec
+++ b/dlls/urlmon/urlmon.spec
@@ -28,7 +28,7 @@
@ stdcall CoInternetQueryInfo(ptr long long ptr long ptr long)
@ stdcall CoInternetSetFeatureEnabled(long long long)
@ stdcall CompareSecurityIds(ptr long ptr long long)
-@ stub CopyBindInfo
+@ stdcall CopyBindInfo(ptr ptr)
@ stdcall CopyStgMedium(ptr ptr)
@ stdcall CreateAsyncBindCtx(long ptr ptr ptr)
@ stdcall CreateAsyncBindCtxEx(ptr long ptr ptr ptr long)
diff --git a/dlls/urlmon/urlmon_main.c b/dlls/urlmon/urlmon_main.c
index a3d1c10..94c4b44 100644
--- a/dlls/urlmon/urlmon_main.c
+++ b/dlls/urlmon/urlmon_main.c
@@ -533,6 +533,8 @@ HRESULT WINAPI CopyStgMedium(const STGMEDIUM *src, STGMEDIUM *dst)
if(src->u.lpszFileName && !src->pUnkForRelease) {
DWORD size = (strlenW(src->u.lpszFileName)+1)*sizeof(WCHAR);
dst->u.lpszFileName = CoTaskMemAlloc(size);
+ if(!dst->u.lpszFileName)
+ return E_OUTOFMEMORY;
memcpy(dst->u.lpszFileName, src->u.lpszFileName, size);
}
break;
@@ -554,6 +556,69 @@ HRESULT WINAPI CopyStgMedium(const STGMEDIUM *src, STGMEDIUM *dst)
return S_OK;
}
+/***********************************************************************
+ * CopyBindInfo (URLMON.@)
+ */
+HRESULT WINAPI CopyBindInfo(const BINDINFO *pcbiSrc, BINDINFO *pcbiDest)
+{
+ DWORD size;
+ HRESULT hres;
+
+ TRACE("(%p %p)\n", pcbiSrc, pcbiDest);
+
+ if(!pcbiSrc || !pcbiDest)
+ return E_POINTER;
+ if(!pcbiSrc->cbSize || !pcbiDest->cbSize)
+ return E_INVALIDARG;
+
+ size = pcbiDest->cbSize;
+ if(size > pcbiSrc->cbSize) {
+ memcpy(pcbiDest, pcbiSrc, pcbiSrc->cbSize);
+ memset((char*)pcbiDest+pcbiSrc->cbSize, 0, size-pcbiSrc->cbSize);
+ } else {
+ memcpy(pcbiDest, pcbiSrc, size);
+ }
+ pcbiDest->cbSize = size;
+
+ size = FIELD_OFFSET(BINDINFO, szExtraInfo)+sizeof(void*);
+ if(pcbiSrc->cbSize>=size && pcbiDest->cbSize>=size && pcbiSrc->szExtraInfo) {
+ size = (strlenW(pcbiSrc->szExtraInfo)+1)*sizeof(WCHAR);
+ pcbiDest->szExtraInfo = CoTaskMemAlloc(size);
+ if(!pcbiDest->szExtraInfo)
+ return E_OUTOFMEMORY;
+ memcpy(pcbiDest->szExtraInfo, pcbiSrc->szExtraInfo, size);
+ }
+
+ size = FIELD_OFFSET(BINDINFO, stgmedData)+sizeof(STGMEDIUM);
+ if(pcbiSrc->cbSize>=size && pcbiDest->cbSize>=size) {
+ hres = CopyStgMedium(&pcbiSrc->stgmedData, &pcbiDest->stgmedData);
+ if(FAILED(hres)) {
+ CoTaskMemFree(pcbiDest->szExtraInfo);
+ return hres;
+ }
+ }
+
+ size = FIELD_OFFSET(BINDINFO, szCustomVerb)+sizeof(void*);
+ if(pcbiSrc->cbSize>=size && pcbiDest->cbSize>=size && pcbiSrc->szCustomVerb) {
+ size = (strlenW(pcbiSrc->szCustomVerb)+1)*sizeof(WCHAR);
+ pcbiDest->szCustomVerb = CoTaskMemAlloc(size);
+ if(!pcbiDest->szCustomVerb) {
+ CoTaskMemFree(pcbiDest->szExtraInfo);
+ ReleaseStgMedium(&pcbiDest->stgmedData);
+ return E_OUTOFMEMORY;
+ }
+ }
+
+ size = FIELD_OFFSET(BINDINFO, securityAttributes)+sizeof(SECURITY_ATTRIBUTES);
+ if(pcbiDest->cbSize >= size)
+ memset(&pcbiDest->securityAttributes, 0, sizeof(SECURITY_ATTRIBUTES));
+
+ if(pcbiSrc->pUnk)
+ IUnknown_AddRef(pcbiDest->pUnk);
+
+ return S_OK;
+}
+
static BOOL text_richtext_filter(const BYTE *b, DWORD size)
{
return size > 5 && !memcmp(b, "{\\rtf", 5);
More information about the wine-cvs
mailing list