Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

225 lines
4.6 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1993 - 1993.
//
// File: cmarshal.cxx
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 12-27-93 ErikGav Commented
//
//----------------------------------------------------------------------------
#include <ole2int.h>
#include "cbasemon.hxx"
#include "ccompmon.hxx"
#include "mnk.h"
CMarshalImplPStream::CMarshalImplPStream( LPPERSISTSTREAM pPS )
{
GET_A5();
m_pPS = pPS;
}
STDMETHODIMP CMarshalImplPStream::QueryInterface (THIS_
REFIID riid, LPVOID FAR* ppvObj)
{
M_PROLOG(this);
*ppvObj = NULL;
VDATEIID (riid);
VDATEPTROUT (ppvObj, LPVOID);
return m_pPS->QueryInterface(riid, ppvObj);
}
STDMETHODIMP_(ULONG) CMarshalImplPStream::AddRef (THIS)
{
M_PROLOG(this);
return m_pPS->AddRef();
}
STDMETHODIMP_(ULONG) CMarshalImplPStream::Release (THIS)
{
M_PROLOG(this);
return m_pPS->Release();
}
// *** IMarshal methods ***
STDMETHODIMP CMarshalImplPStream::GetUnmarshalClass(REFIID riid, LPVOID pv,
DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags, CLSID FAR* pCid)
{
M_PROLOG(this);
VDATEIID (riid);
VDATEPTROUT (pCid, CLSID);
return m_pPS->GetClassID(pCid);
}
STDMETHODIMP CMarshalImplPStream::GetMarshalSizeMax (REFIID riid, LPVOID pv,
DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags, DWORD FAR* pSize)
{
ULARGE_INTEGER ularge_integer;
M_PROLOG(this);
VDATEIID (riid);
VDATEPTROUT (pSize, DWORD);
LPMONIKER pmk;
HRESULT hres;
hres = m_pPS->QueryInterface(IID_IMoniker, (LPVOID FAR*)&pmk);
if (hres == NOERROR)
{
CCompositeMoniker *pmkComp = IsCompositeMoniker(pmk);
if (pmkComp)
{
DWORD size ;
hres = CoGetMarshalSizeMax(pSize, riid, pmkComp->m_pmkLeft,
dwDestContext, pvDestContext, mshlflags) ;
if (hres != NOERROR)
{
goto errRet ;
}
hres = CoGetMarshalSizeMax(&size, riid, pmkComp->m_pmkRight,
dwDestContext, pvDestContext, mshlflags) ;
if (hres != NOERROR)
{
goto errRet ;
}
*pSize += size + sizeof(CLSID);
goto errRet;
}
else
{
hres = m_pPS->GetSizeMax( &ularge_integer );
if (hres == NOERROR)
*pSize = ularge_integer.LowPart;
}
}
else
hres = ResultFromScode(E_FAIL);
errRet:
if (pmk) pmk->Release();
return hres;
}
STDMETHODIMP CMarshalImplPStream::MarshalInterface (IStream FAR* pStm, REFIID riid,
void FAR* pv, DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags)
{
M_PROLOG(this);
VDATEIFACE (pStm);
VDATEIID (riid);
LPMONIKER pmk;
CCompositeMoniker FAR* pmkComp;
HRESULT hres;
hres = m_pPS->QueryInterface(IID_IMoniker, (LPVOID FAR*)&pmk);
if (hres == NOERROR)
{
if ((pmkComp = IsCompositeMoniker(pmk)) != NULL)
{
// special code for the composite moniker case
hres = CoMarshalInterface(pStm, riid, pmkComp->m_pmkLeft, dwDestContext,
pvDestContext, mshlflags);
if (hres != NOERROR) goto errRet;
hres = CoMarshalInterface(pStm, riid, pmkComp->m_pmkRight, dwDestContext,
pvDestContext, mshlflags);
if (hres != NOERROR) goto errRet;
}
else
hres = m_pPS->Save(pStm, FALSE);
}
else
hres = ResultFromScode(E_FAIL);
errRet:
if (pmk) pmk->Release();
return hres;
}
STDMETHODIMP CMarshalImplPStream::UnmarshalInterface (IStream FAR* pStm,
REFIID riid, void FAR* FAR* ppv)
{
M_PROLOG(this);
VDATEPTROUT (ppv, LPVOID);
*ppv = NULL;
VDATEIFACE (pStm);
VDATEIID (riid);
HRESULT hresult;
LPMONIKER pmk = NULL;
CCompositeMoniker FAR* pmkComp;
hresult = m_pPS->QueryInterface(IID_IMoniker, (LPVOID FAR*)&pmk);
if (hresult == NOERROR)
{
if ((pmkComp = IsCompositeMoniker(pmk)) != NULL)
{
// special code for the composite moniker case
hresult = CoUnmarshalInterface(pStm, IID_IMoniker,
(LPVOID FAR*)&(pmkComp->m_pmkLeft));
if (hresult != NOERROR) goto errRet;
hresult = CoUnmarshalInterface(pStm, IID_IMoniker,
(LPVOID FAR*)&(pmkComp->m_pmkRight));
if (hresult != NOERROR) goto errRet;
}
else
{
hresult = m_pPS->Load(pStm);
}
}
else
hresult = ResultFromScode(E_FAIL);
if (hresult == NOERROR)
{
hresult = m_pPS->QueryInterface(riid, ppv);
}
errRet:
if (pmk)
pmk->Release();
return hresult;
}
STDMETHODIMP CMarshalImplPStream::ReleaseMarshalData (IStream FAR* pStm)
{
M_PROLOG(this);
return NOERROR;
}
STDMETHODIMP CMarshalImplPStream::DisconnectObject (DWORD dwReserved)
{
M_PROLOG(this);
return NOERROR;
}