#include "pch.h"
#include "TCMarshalByValue.h"
TC_OBJECT_EXTERN_IMPL(CTCMarshalByValue)
CTCMarshalByValue::CTCMarshalByValue()
: m_dwEndian(0),
m_dwEndianOriginal(0xFF669900),
m_dwEndianInverted(0x009966FF)
{
}
#if defined(_DEBUG) && defined(CTCMarshalByValue_DEBUG)
HRESULT CTCMarshalByValue::FinalConstruct()
{
_TRACE0("CTCMarshalByValue::FinalConstruct()\n");
return S_OK;
}
void CTCMarshalByValue::FinalRelease()
{
_TRACE0("CTCMarshalByValue::FinalRelease()\n");
}
#endif STDMETHODIMP CTCMarshalByValue::GetUnmarshalClass(REFIID riid, void* pv,
DWORD dwDestContext, void* pvDestContext, DWORD mshlflags, CLSID* pCid)
{
UNUSED(riid);
UNUSED(pv);
UNUSED(dwDestContext);
UNUSED(pvDestContext);
UNUSED(mshlflags);
IPersistStreamPtr spps;
HRESULT hr = GetOuterPersistStream(&spps);
if (SUCCEEDED(hr))
hr = spps->GetClassID(pCid);
return hr;
}
STDMETHODIMP CTCMarshalByValue::GetMarshalSizeMax(REFIID riid, void* pv,
DWORD dwDestContext, void* pvDestContext, DWORD mshlflags, DWORD* pSize)
{
UNUSED(riid);
UNUSED(pv);
UNUSED(dwDestContext);
UNUSED(pvDestContext);
UNUSED(mshlflags);
*pSize = 0;
IPersistStreamPtr pps;
HRESULT hr = GetOuterPersistStream(&pps);
if (SUCCEEDED(hr))
{
ULARGE_INTEGER uli;
if (SUCCEEDED(hr = pps->GetSizeMax(&uli)) || (E_NOTIMPL == hr
&& SUCCEEDED(hr = TCGetPersistStreamSize(pps, &uli))))
*pSize = uli.LowPart + sizeof(m_dwEndian);
}
#if defined(_DEBUG) && defined(CTCMarshalByValue_DEBUG)
_TRACE1("CTCMarshalByValue::GetMarshalSizeMax(): returning 0x%08X\n", *pSize);
#endif
return hr;
}
STDMETHODIMP CTCMarshalByValue::MarshalInterface(IStream* pStm, REFIID riid,
void* pv, DWORD dwDestContext, void* pvDestContext, DWORD mshlflags)
{
UNUSED(riid);
UNUSED(pv);
UNUSED(dwDestContext);
UNUSED(pvDestContext);
UNUSED(mshlflags);
DWORD dwEndian = m_dwEndianOriginal;
HRESULT hr = pStm->Write(&dwEndian, sizeof(dwEndian), NULL);
if (SUCCEEDED(hr))
{
IPersistStreamPtr pps;
if (SUCCEEDED(hr = GetOuterPersistStream(&pps)))
hr = pps->Save(pStm, FALSE);
}
return hr;
}
STDMETHODIMP CTCMarshalByValue::UnmarshalInterface(IStream* pStm,
REFIID riid, void** ppv)
{
CLock lock(this);
HRESULT hr = pStm->Read(&m_dwEndian, sizeof(m_dwEndian), NULL);
if (SUCCEEDED(hr))
{
lock.Unlock();
IPersistStreamPtr pps;
if (SUCCEEDED(hr = GetOuterPersistStream(&pps)))
if (SUCCEEDED(hr = pps->Load(pStm)))
hr = pps->QueryInterface(riid, ppv);
}
return hr;
}
STDMETHODIMP CTCMarshalByValue::ReleaseMarshalData(IStream* pStm)
{
return S_OK;
}
STDMETHODIMP CTCMarshalByValue::DisconnectObject(DWORD dwReserved)
{
return S_OK;
}