Robert Shearman : ole32:
Implement GetUnmarshalClass for the free-threaded marshaler and
Alexandre Julliard
julliard at wine.codeweavers.com
Thu May 25 04:16:17 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 386fcbb5f789be359e983097f86d571df28669ea
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=386fcbb5f789be359e983097f86d571df28669ea
Author: Robert Shearman <rob at codeweavers.com>
Date: Wed May 24 23:02:26 2006 +0100
ole32: Implement GetUnmarshalClass for the free-threaded marshaler and
remove unnecessary unmarshaling code for the standard-marshal case -
this is handled by CoUnmarshalInterface and CoReleaseMarshalData.
---
dlls/ole32/ftmarshal.c | 99 +++++++++++++++++-------------------------------
1 files changed, 36 insertions(+), 63 deletions(-)
diff --git a/dlls/ole32/ftmarshal.c b/dlls/ole32/ftmarshal.c
index 5255f60..a0befee 100644
--- a/dlls/ole32/ftmarshal.c
+++ b/dlls/ole32/ftmarshal.c
@@ -38,6 +38,8 @@ #include "compobj_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(ole);
+const CLSID CLSID_InProcFreeMarshaler = { 0x33A, 0, 0, {0xC0, 0, 0, 0, 0, 0, 0, 0x46} };
+
typedef struct _FTMarshalImpl {
const IUnknownVtbl *lpVtbl;
LONG ref;
@@ -138,7 +140,12 @@ static HRESULT WINAPI
FTMarshalImpl_GetUnmarshalClass (LPMARSHAL iface, REFIID riid, void *pv, DWORD dwDestContext,
void *pvDestContext, DWORD mshlflags, CLSID * pCid)
{
- FIXME ("(), stub!\n");
+ TRACE("(%s, %p, 0x%lx, %p, 0x%lx, %p)\n", debugstr_guid(riid), pv,
+ dwDestContext, pvDestContext, mshlflags, pCid);
+ if (dwDestContext == MSHCTX_INPROC || dwDestContext == MSHCTX_CROSSCTX)
+ memcpy(pCid, &CLSID_InProcFreeMarshaler, sizeof(CLSID_InProcFreeMarshaler));
+ else
+ memcpy(pCid, &CLSID_DfMarshal, sizeof(CLSID_InProcFreeMarshaler));
return S_OK;
}
@@ -175,7 +182,6 @@ FTMarshalImpl_MarshalInterface (LPMARSHA
IMarshal *pMarshal = NULL;
HRESULT hres;
- DWORD magic = 0x57dfd54d /* MEOW */;
TRACE("(%p, %s, %p, 0x%lx, %p, 0x%lx)\n", pStm, debugstr_guid(riid), pv,
dwDestContext, pvDestContext, mshlflags);
@@ -210,13 +216,6 @@ FTMarshalImpl_MarshalInterface (LPMARSHA
return S_OK;
}
- /* FIXME: this isn't exactly corret. it looks like the standard marshaler
- * for native writes all of the OBJREF data into the stream, so we should
- * really rely on it to write this constant for us. however, we need a
- * constant to differentiate the outofproc data from the inproc data */
- hres = IStream_Write (pStm, &magic, sizeof (magic), NULL);
- if (hres != S_OK) return STG_E_MEDIUMFULL;
-
/* use the standard marshaler to handle all other cases */
CoGetStandardMarshal (riid, pv, dwDestContext, pvDestContext, mshlflags, &pMarshal);
hres = IMarshal_MarshalInterface (pMarshal, pStm, riid, pv, dwDestContext, pvDestContext, mshlflags);
@@ -228,6 +227,9 @@ static HRESULT WINAPI
FTMarshalImpl_UnmarshalInterface (LPMARSHAL iface, IStream * pStm, REFIID riid, void **ppv)
{
DWORD mshlflags;
+ IUnknown *object;
+ DWORD constant;
+ GUID unknown_guid;
HRESULT hres;
TRACE ("(%p, %s, %p)\n", pStm, debugstr_guid(riid), ppv);
@@ -235,42 +237,29 @@ FTMarshalImpl_UnmarshalInterface (LPMARS
hres = IStream_Read (pStm, &mshlflags, sizeof (mshlflags), NULL);
if (hres != S_OK) return STG_E_READFAULT;
- if (mshlflags == 0x57dfd54d /* MEOW */) {
- IMarshal *pMarshal;
-
- hres = CoCreateInstance (&CLSID_DfMarshal, NULL, CLSCTX_INPROC, &IID_IMarshal, (void **)&pMarshal);
- if (FAILED(hres)) return hres;
-
- hres = IMarshal_UnmarshalInterface (pMarshal, pStm, riid, ppv);
- IMarshal_Release (pMarshal);
- return hres;
- }
- else {
- IUnknown *object;
- DWORD constant;
- GUID unknown_guid;
-
- hres = IStream_Read (pStm, &object, sizeof (object), NULL);
- if (hres != S_OK) return STG_E_READFAULT;
+ hres = IStream_Read (pStm, &object, sizeof (object), NULL);
+ if (hres != S_OK) return STG_E_READFAULT;
- hres = IStream_Read (pStm, &constant, sizeof (constant), NULL);
- if (hres != S_OK) return STG_E_READFAULT;
- if (constant != 0)
- FIXME("constant is 0x%lx instead of 0\n", constant);
+ hres = IStream_Read (pStm, &constant, sizeof (constant), NULL);
+ if (hres != S_OK) return STG_E_READFAULT;
+ if (constant != 0)
+ FIXME("constant is 0x%lx instead of 0\n", constant);
- hres = IStream_Read (pStm, &unknown_guid, sizeof (unknown_guid), NULL);
- if (hres != S_OK) return STG_E_READFAULT;
+ hres = IStream_Read (pStm, &unknown_guid, sizeof (unknown_guid), NULL);
+ if (hres != S_OK) return STG_E_READFAULT;
- hres = IUnknown_QueryInterface(object, riid, ppv);
- if (!(mshlflags & (MSHLFLAGS_TABLEWEAK|MSHLFLAGS_TABLESTRONG)))
- IUnknown_Release(object);
- return hres;
- }
+ hres = IUnknown_QueryInterface(object, riid, ppv);
+ if (!(mshlflags & (MSHLFLAGS_TABLEWEAK|MSHLFLAGS_TABLESTRONG)))
+ IUnknown_Release(object);
+ return hres;
}
static HRESULT WINAPI FTMarshalImpl_ReleaseMarshalData (LPMARSHAL iface, IStream * pStm)
{
DWORD mshlflags;
+ IUnknown *object;
+ DWORD constant;
+ GUID unknown_guid;
HRESULT hres;
TRACE ("(%p)\n", pStm);
@@ -278,35 +267,19 @@ static HRESULT WINAPI FTMarshalImpl_Rele
hres = IStream_Read (pStm, &mshlflags, sizeof (mshlflags), NULL);
if (hres != S_OK) return STG_E_READFAULT;
- if (mshlflags == 0x57dfd54d /* MEOW */) {
- IMarshal *pMarshal;
-
- hres = CoCreateInstance (&CLSID_DfMarshal, NULL, CLSCTX_INPROC, &IID_IMarshal, (void **)&pMarshal);
- if (FAILED(hres)) return hres;
-
- hres = IMarshal_ReleaseMarshalData (pMarshal, pStm);
- IMarshal_Release (pMarshal);
- return hres;
- }
- else {
- IUnknown *object;
- DWORD constant;
- GUID unknown_guid;
-
- hres = IStream_Read (pStm, &object, sizeof (object), NULL);
- if (hres != S_OK) return STG_E_READFAULT;
+ hres = IStream_Read (pStm, &object, sizeof (object), NULL);
+ if (hres != S_OK) return STG_E_READFAULT;
- hres = IStream_Read (pStm, &constant, sizeof (constant), NULL);
- if (hres != S_OK) return STG_E_READFAULT;
- if (constant != 0)
- FIXME("constant is 0x%lx instead of 0\n", constant);
+ hres = IStream_Read (pStm, &constant, sizeof (constant), NULL);
+ if (hres != S_OK) return STG_E_READFAULT;
+ if (constant != 0)
+ FIXME("constant is 0x%lx instead of 0\n", constant);
- hres = IStream_Read (pStm, &unknown_guid, sizeof (unknown_guid), NULL);
- if (hres != S_OK) return STG_E_READFAULT;
+ hres = IStream_Read (pStm, &unknown_guid, sizeof (unknown_guid), NULL);
+ if (hres != S_OK) return STG_E_READFAULT;
- IUnknown_Release(object);
- return S_OK;
- }
+ IUnknown_Release(object);
+ return S_OK;
}
static HRESULT WINAPI FTMarshalImpl_DisconnectObject (LPMARSHAL iface, DWORD dwReserved)
More information about the wine-cvs
mailing list