Commit 2c57189a authored by Robert Shearman's avatar Robert Shearman Committed by Alexandre Julliard

ole32: Implement table-strong marshaling and ReleaseMarshalData for the free-threaded marshaler.

parent f9b5280d
......@@ -262,7 +262,7 @@ FTMarshalImpl_UnmarshalInterface (LPMARSHAL iface, IStream * pStm, REFIID riid,
if (hres != S_OK) return STG_E_READFAULT;
hres = IUnknown_QueryInterface(object, riid, ppv);
if (!(mshlflags & MSHLFLAGS_TABLEWEAK))
if (!(mshlflags & (MSHLFLAGS_TABLEWEAK|MSHLFLAGS_TABLESTRONG)))
IUnknown_Release(object);
return hres;
}
......@@ -270,13 +270,49 @@ FTMarshalImpl_UnmarshalInterface (LPMARSHAL iface, IStream * pStm, REFIID riid,
static HRESULT WINAPI FTMarshalImpl_ReleaseMarshalData (LPMARSHAL iface, IStream * pStm)
{
FIXME ("(), stub!\n");
return S_OK;
DWORD mshlflags;
HRESULT hres;
TRACE ("(%p)\n", pStm);
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, &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;
IUnknown_Release(object);
return S_OK;
}
}
static HRESULT WINAPI FTMarshalImpl_DisconnectObject (LPMARSHAL iface, DWORD dwReserved)
{
FIXME ("(), stub!\n");
TRACE ("()\n");
/* nothing to do */
return S_OK;
}
......
......@@ -1718,7 +1718,7 @@ static void test_freethreadedmarshaler(void)
IUnknown_Release(pProxy);
todo_wine ok_more_than_one_lock();
ok_more_than_one_lock();
IStream_Seek(pStream, llZero, STREAM_SEEK_SET, NULL);
hr = IMarshal_ReleaseMarshalData(pFTMarshal, pStream);
......@@ -1767,7 +1767,7 @@ static void test_freethreadedmarshaler(void)
hr = IMarshal_ReleaseMarshalData(pFTMarshal, pStream);
ok_ole_success(hr, IMarshal_ReleaseMarshalData);
todo_wine ok_no_locks();
ok_no_locks();
/* doesn't enforce marshaling rules here and allows us to unmarshal the
* interface, even though it was freed above */
......@@ -1775,7 +1775,7 @@ static void test_freethreadedmarshaler(void)
hr = IMarshal_UnmarshalInterface(pFTMarshal, pStream, &IID_IUnknown, (void **)&pProxy);
ok_ole_success(hr, IMarshal_UnmarshalInterface);
todo_wine ok_no_locks();
ok_no_locks();
IStream_Release(pStream);
IMarshal_Release(pFTMarshal);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment