Rob Shearman : oleaut32: Make BSTR and VARIANT marshalling for typelibs use the user marshalling functions .

Alexandre Julliard julliard at winehq.org
Mon Nov 16 11:43:53 CST 2009


Module: wine
Branch: master
Commit: 9cffed2c75cd3b4af6ab937be5948e82e671a756
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9cffed2c75cd3b4af6ab937be5948e82e671a756

Author: Rob Shearman <robertshearman at gmail.com>
Date:   Sun Nov 15 17:13:21 2009 +0000

oleaut32: Make BSTR and VARIANT marshalling for typelibs use the user marshalling functions.

Remove now redundant cases in serialize_param and deserialize_param.

---

 dlls/oleaut32/tmarshal.c |  201 +++++++++-------------------------------------
 1 files changed, 40 insertions(+), 161 deletions(-)

diff --git a/dlls/oleaut32/tmarshal.c b/dlls/oleaut32/tmarshal.c
index 0e9d7eb..9f10981 100644
--- a/dlls/oleaut32/tmarshal.c
+++ b/dlls/oleaut32/tmarshal.c
@@ -615,8 +615,6 @@ serialize_param(
         vartype = VT_SAFEARRAY;
 
     switch (vartype) {
-    case VT_EMPTY: /* nothing. empty variant for instance */
-	return S_OK;
     case VT_I8:
     case VT_UI8:
     case VT_R8:
@@ -652,56 +650,23 @@ serialize_param(
 	if (writeit)
 	    hres = xbuf_add(buf,(LPBYTE)arg,sizeof(DWORD));
 	return hres;
-    case VT_I4|VT_BYREF:
-	hres = S_OK;
-	if (debugout) TRACE_(olerelay)("&0x%x\n",*arg);
-	if (writeit)
-	    hres = xbuf_add(buf,(LPBYTE)(DWORD*)*arg,sizeof(DWORD));
-	/* do not dealloc at this time */
-	return hres;
     case VT_VARIANT: {
-	TYPEDESC	tdesc2;
-	VARIANT		*vt = (VARIANT*)arg;
-	DWORD		vttype = V_VT(vt);
-
-	if (debugout) TRACE_(olerelay)("Vt(%s%s)(",debugstr_vt(vttype),debugstr_vf(vttype));
-	tdesc2.vt = vttype;
-	if (writeit) {
-	    hres = xbuf_add(buf,(LPBYTE)&vttype,sizeof(vttype));
-	    if (hres) return hres;
-	}
-	/* need to recurse since we need to free the stuff */
-	hres = serialize_param(tinfo,writeit,debugout,dealloc,&tdesc2,(DWORD*)&(V_I4(vt)),buf);
-	if (debugout) TRACE_(olerelay)(")");
-	return hres;
-    }
-    case VT_BSTR|VT_BYREF: {
-	if (debugout) TRACE_(olerelay)("[byref]'%s'", *(BSTR*)*arg ? relaystr(*((BSTR*)*arg)) : "<bstr NULL>");
-        if (writeit) {
-            /* ptr to ptr to magic widestring, basically */
-            BSTR *bstr = (BSTR *) *arg;
-            DWORD len;
-            if (!*bstr) {
-                /* -1 means "null string" which is equivalent to empty string */
-                len = -1;     
-                hres = xbuf_add(buf, (LPBYTE)&len,sizeof(DWORD));
-		if (hres) return hres;
-            } else {
-		len = *((DWORD*)*bstr-1)/sizeof(WCHAR);
-		hres = xbuf_add(buf,(LPBYTE)&len,sizeof(DWORD));
-		if (hres) return hres;
-		hres = xbuf_add(buf,(LPBYTE)*bstr,len * sizeof(WCHAR));
-		if (hres) return hres;
-            }
+        if (debugout) TRACE_(olerelay)("Vt(%s%s)(",debugstr_vt(V_VT((VARIANT *)arg)),debugstr_vf(V_VT((VARIANT *)arg)));
+        if (writeit)
+        {
+            ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION);
+            ULONG size = VARIANT_UserSize(&flags, buf->curoff, (VARIANT *)arg);
+            xbuf_resize(buf, size);
+            VARIANT_UserMarshal(&flags, buf->base + buf->curoff, (VARIANT *)arg);
+            buf->curoff = size;
         }
-
-        if (dealloc && arg) {
-            BSTR *str = *((BSTR **)arg);
-            SysFreeString(*str);
+        if (dealloc)
+        {
+            ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION);
+            VARIANT_UserFree(&flags, (VARIANT *)arg);
         }
         return S_OK;
     }
-    
     case VT_BSTR: {
 	if (debugout) {
 	    if (*arg)
@@ -709,25 +674,20 @@ serialize_param(
 	    else
 		    TRACE_(olerelay)("<bstr NULL>");
 	}
-	if (writeit) {
-            BSTR bstr = (BSTR)*arg;
-            DWORD len;
-	    if (!bstr) {
-		len = -1;
-		hres = xbuf_add(buf,(LPBYTE)&len,sizeof(DWORD));
-		if (hres) return hres;
-	    } else {
-		len = *((DWORD*)bstr-1)/sizeof(WCHAR);
-		hres = xbuf_add(buf,(LPBYTE)&len,sizeof(DWORD));
-		if (hres) return hres;
-		hres = xbuf_add(buf,(LPBYTE)bstr,len * sizeof(WCHAR));
-		if (hres) return hres;
-	    }
-	}
-
-	if (dealloc && arg)
-	    SysFreeString((BSTR)*arg);
-	return S_OK;
+        if (writeit)
+        {
+            ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION);
+            ULONG size = BSTR_UserSize(&flags, buf->curoff, (BSTR *)arg);
+            xbuf_resize(buf, size);
+            BSTR_UserMarshal(&flags, buf->base + buf->curoff, (BSTR *)arg);
+            buf->curoff = size;
+        }
+        if (dealloc)
+        {
+            ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION);
+            BSTR_UserFree(&flags, (BSTR *)arg);
+        }
+        return S_OK;
     }
     case VT_PTR: {
 	DWORD cookie;
@@ -941,34 +901,15 @@ deserialize_param(
 
     while (1) {
 	switch (vartype) {
-	case VT_EMPTY:
-	    if (debugout) TRACE_(olerelay)("<empty>\n");
-	    return S_OK;
-	case VT_NULL:
-	    if (debugout) TRACE_(olerelay)("<null>\n");
-	    return S_OK;
 	case VT_VARIANT: {
-	    VARIANT	*vt = (VARIANT*)arg;
-
-	    if (readit) {
-		DWORD	vttype;
-		TYPEDESC	tdesc2;
-		hres = xbuf_get(buf,(LPBYTE)&vttype,sizeof(vttype));
-		if (hres) {
-		    FIXME("vt type not read?\n");
-		    return hres;
-		}
-		memset(&tdesc2,0,sizeof(tdesc2));
-		tdesc2.vt = vttype;
-		V_VT(vt)  = vttype;
-	        if (debugout) TRACE_(olerelay)("Vt(%s%s)(",debugstr_vt(vttype),debugstr_vf(vttype));
-		hres = deserialize_param(tinfo, readit, debugout, alloc, &tdesc2, (DWORD*)&(V_I4(vt)), buf);
-		TRACE_(olerelay)(")");
-		return hres;
-	    } else {
-		VariantInit(vt);
-		return S_OK;
+	    if (readit)
+	    {
+		ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION);
+		unsigned char *buffer;
+		buffer = VARIANT_UserUnmarshal(&flags, buf->base + buf->curoff, (VARIANT *)arg);
+		buf->curoff = buffer - buf->base;
 	    }
+	    return S_OK;
 	}
         case VT_I8:
         case VT_UI8:
@@ -1013,76 +954,14 @@ deserialize_param(
 	    }
 	    if (debugout) TRACE_(olerelay)("%02x",*arg & 0xff);
 	    return hres;
-        case VT_I4|VT_BYREF:
-	    hres = S_OK;
-	    if (alloc)
-		*arg = (DWORD)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DWORD));
-	    if (readit) {
-		hres = xbuf_get(buf,(LPBYTE)*arg,sizeof(DWORD));
-		if (hres) ERR("Failed to read integer 4 byte\n");
-	    }
-	    if (debugout) TRACE_(olerelay)("&0x%x",*(DWORD*)*arg);
-	    return hres;
-	case VT_BSTR|VT_BYREF: {
-	    BSTR **bstr = (BSTR **)arg;
-	    WCHAR	*str;
-	    DWORD	len;
-
-	    if (readit) {
-		hres = xbuf_get(buf,(LPBYTE)&len,sizeof(DWORD));
-		if (hres) {
-		    ERR("failed to read bstr klen\n");
-		    return hres;
-		}
-		if (len == -1) {
-                    *bstr = CoTaskMemAlloc(sizeof(BSTR *));
-		    **bstr = NULL;
-		    if (debugout) TRACE_(olerelay)("<bstr NULL>");
-		} else {
-		    str  = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(len+1)*sizeof(WCHAR));
-		    hres = xbuf_get(buf,(LPBYTE)str,len*sizeof(WCHAR));
-		    if (hres) {
-			ERR("Failed to read BSTR.\n");
-			HeapFree(GetProcessHeap(),0,str);
-			return hres;
-		    }
-                    *bstr = CoTaskMemAlloc(sizeof(BSTR *));
-		    **bstr = SysAllocStringLen(str,len);
-		    if (debugout) TRACE_(olerelay)("%s",relaystr(str));
-		    HeapFree(GetProcessHeap(),0,str);
-		}
-	    } else {
-	        *bstr = NULL;
-	    }
-	    return S_OK;
-	}
 	case VT_BSTR: {
-	    WCHAR	*str;
-	    DWORD	len;
-
-	    if (readit) {
-		hres = xbuf_get(buf,(LPBYTE)&len,sizeof(DWORD));
-		if (hres) {
-		    ERR("failed to read bstr klen\n");
-		    return hres;
-		}
-		if (len == -1) {
-		    *arg = 0;
-		    if (debugout) TRACE_(olerelay)("<bstr NULL>");
-		} else {
-		    str  = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(len+1)*sizeof(WCHAR));
-		    hres = xbuf_get(buf,(LPBYTE)str,len*sizeof(WCHAR));
-		    if (hres) {
-			ERR("Failed to read BSTR.\n");
-			HeapFree(GetProcessHeap(),0,str);
-			return hres;
-		    }
-		    *arg = (DWORD)SysAllocStringLen(str,len);
-		    if (debugout) TRACE_(olerelay)("%s",relaystr(str));
-		    HeapFree(GetProcessHeap(),0,str);
-		}
-	    } else {
-	        *arg = 0;
+	    if (readit)
+	    {
+		ULONG flags = MAKELONG(MSHCTX_DIFFERENTMACHINE, NDR_LOCAL_DATA_REPRESENTATION);
+		unsigned char *buffer;
+		buffer = BSTR_UserUnmarshal(&flags, buf->base + buf->curoff, (BSTR *)arg);
+		buf->curoff = buffer - buf->base;
+		if (debugout) TRACE_(olerelay)("%s",relaystr(*(BSTR *)arg));
 	    }
 	    return S_OK;
 	}




More information about the wine-cvs mailing list