Windows2003-3790/inetcore/urlmon/trans/urlmarsh.cxx
2020-09-30 16:53:55 +02:00

407 lines
11 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: urlmarsh.cxx
//
// Contents: CUrlMarshal methods implementations
// to support custom marshaling
//
// Classes:
//
// Functions:
//
// History: 1-19-96 JohannP (Johann Posch) Created
//
//----------------------------------------------------------------------------
#include <trans.h>
#include "urlmk.hxx"
PerfDbgTag(tagCUrlMarsh, "Urlmon", "Log CUrlMon Marshalling", DEB_URLMON);
//+---------------------------------------------------------------------------
//
// Method: CUrlMon::CanMarshalIID
//
// Synopsis: Checks whether this object supports marshalling this IID.
//
// Arguments: [riid] --
//
// Returns:
//
// History: 1-19-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
inline BOOL CUrlMon::CanMarshalIID(REFIID riid)
{
DEBUG_ENTER((DBG_MONIKER,
Bool,
"CUrlMon::CanMarshalIID",
"this=%#x, %#x",
this, &riid
));
// keep this in sync with the QueryInterface
BOOL fRet = (BOOL) (riid == IID_IMoniker);
DEBUG_LEAVE(fRet);
return fRet;
}
//+---------------------------------------------------------------------------
//
// Method: CUrlMon::ValidateMarshalParams
//
// Synopsis: Validates the standard set parameters that are passed into most
// of the IMarshal methods
//
// Arguments: [riid] --
// [pvInterface] --
// [dwDestContext] --
// [pvDestContext] --
// [mshlflags] --
//
// Returns:
//
// History: 1-19-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
HRESULT CUrlMon::ValidateMarshalParams(REFIID riid,void *pvInterface,
DWORD dwDestContext,void *pvDestContext,DWORD mshlflags)
{
DEBUG_ENTER((DBG_MONIKER,
Hresult,
"CUrlMon::ValidateMarshalParams",
"this=%#x, %#x, %#x, %#x, %#x, %#x",
this, &riid, pvInterface, dwDestContext, pvDestContext, mshlflags
));
PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::ValidateMarshalParams");
HRESULT hr = NOERROR;
if (CanMarshalIID(riid))
{
UrlMkAssert((dwDestContext == MSHCTX_INPROC || dwDestContext == MSHCTX_LOCAL || dwDestContext == MSHCTX_NOSHAREDMEM));
UrlMkAssert((mshlflags == MSHLFLAGS_NORMAL || mshlflags == MSHLFLAGS_TABLESTRONG));
if ( (dwDestContext != MSHCTX_INPROC && dwDestContext != MSHCTX_LOCAL && dwDestContext != MSHCTX_NOSHAREDMEM)
|| (mshlflags != MSHLFLAGS_NORMAL && mshlflags != MSHLFLAGS_TABLESTRONG))
{
hr = E_INVALIDARG;
}
}
else
{
hr = E_NOINTERFACE;
}
PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::ValidateMarshalParams (hr:%lx)", hr);
DEBUG_LEAVE(hr);
return hr;
}
//+---------------------------------------------------------------------------
//
// IMarshal methods
//
//+---------------------------------------------------------------------------
//
// Method: CUrlMon::GetUnmarshalClass
//
// Synopsis:
//
// Arguments: [riid] --
// [pvInterface] --
// [dwDestContext] --
// [pvDestContext] --
// [mshlflags] --
// [pCid] --
//
// Returns:
//
// History: 1-19-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP CUrlMon::GetUnmarshalClass(REFIID riid,void *pvInterface,
DWORD dwDestContext,void *pvDestContext,DWORD mshlflags,CLSID *pCid)
{
DEBUG_ENTER((DBG_MONIKER,
Hresult,
"CUrlMon::IMarshal::GetUnmarshalClass",
"this=%#x, %#x, %#x, %#x, %#x, %#x, %#x",
this, &riid, pvInterface, dwDestContext, pvDestContext, mshlflags, pCid
));
HRESULT hr;
PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::GetUnmarshalClass");
hr = ValidateMarshalParams(riid, pvInterface, dwDestContext,pvDestContext, mshlflags);
if (hr == NOERROR)
{
*pCid = (CLSID) CLSID_StdURLMoniker;
}
PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::GetUnmarshalClass (hr:%lx)", hr);
DEBUG_LEAVE(hr);
return hr;
}
//+---------------------------------------------------------------------------
//
// Method: CUrlMon::GetMarshalSizeMax
//
// Synopsis:
//
// Arguments: [void] --
// [pvInterface] --
// [dwDestContext] --
// [pvDestContext] --
// [mshlflags] --
// [pSize] --
//
// Returns:
//
// History: 1-19-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP CUrlMon::GetMarshalSizeMax(REFIID riid,void *pvInterface,
DWORD dwDestContext,void *pvDestContext,DWORD mshlflags,DWORD *pSize)
{
DEBUG_ENTER((DBG_MONIKER,
Hresult,
"CUrlMon::IMarshal::GetMarshalSizeMax",
"this=%#x, %#x, %#x, %#x, %#x, %#x, %#x",
this, &riid, pvInterface, dwDestContext, pvDestContext, mshlflags, pSize
));
HRESULT hr;
PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::GetMarshalSizeMax");
if (pSize == NULL)
{
hr = E_INVALIDARG;
}
else
{
hr = ValidateMarshalParams(riid, pvInterface, dwDestContext,pvDestContext, mshlflags);
if (hr == NOERROR)
{
// size of url + extra info
*pSize = (wcslen(_pwzUrl) + 1) * sizeof(WCHAR) + sizeof(ULONG);
// Note: add state info
}
}
PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::GetMarshalSizeMax (hr:%lx)", hr);
DEBUG_LEAVE(hr);
return hr;
}
//+---------------------------------------------------------------------------
//
// Method: CUrlMon::MarshalInterface
//
// Synopsis:
//
// Arguments: [REFIID] --
// [riid] --
// [DWORD] --
// [void] --
// [DWORD] --
// [mshlflags] --
//
// Returns:
//
// History: 1-19-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP CUrlMon::MarshalInterface(IStream *pistm,REFIID riid,
void *pvInterface,DWORD dwDestContext,
void *pvDestContext,DWORD mshlflags)
{
DEBUG_ENTER((DBG_MONIKER,
Hresult,
"CUrlMon::IMarshal::MarshalInterface",
"this=%#x, %#x, %#x, %#x, %#x, %#x, %#x",
this, pistm, &riid, pvInterface, dwDestContext, pvDestContext, mshlflags
));
HRESULT hr;
PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::MarshalInterface");
hr = ValidateMarshalParams(riid, pvInterface, dwDestContext,pvDestContext, mshlflags);
if (hr == NOERROR)
{
hr = Save(pistm, FALSE);
}
PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::MarshalInterface (hr:%lx)", hr);
DEBUG_LEAVE(hr);
return hr;
}
//+---------------------------------------------------------------------------
//
// Method: CUrlMon::UnmarshalInterface
//
// Synopsis: Unmarshals an Urlmon interface out of a stream
//
// Arguments: [REFIID] --
// [void] --
// [ppvObj] --
//
// Returns:
//
// History: 1-19-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP CUrlMon::UnmarshalInterface(IStream *pistm,REFIID riid,void ** ppvObj)
{
DEBUG_ENTER((DBG_MONIKER,
Hresult,
"CUrlMon::IMarshal::UnmarshalInterface",
"this=%#x, %#x, %#x, %#x",
this, pistm, &riid, ppvObj
));
HRESULT hr = NOERROR;
PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::UnmarshalInterface");
if (ppvObj == NULL)
{
hr = E_INVALIDARG;
}
else if (! CanMarshalIID(riid))
{
*ppvObj = NULL;
hr = E_NOINTERFACE;
}
else
{
*ppvObj = NULL;
hr = Load(pistm);
// call QI to get the requested interface
if (hr == NOERROR)
{
hr = QueryInterface(riid, ppvObj);
}
}
PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::UnmarshalInterface (hr:%lx)", hr);
DEBUG_LEAVE(hr);
return hr;
}
STDMETHODIMP CUrlMon::ReleaseMarshalData(IStream *pStm)
{
DEBUG_ENTER((DBG_MONIKER,
Hresult,
"CUrlMon::IMarshal::ReleaseMarshalData",
"this=%#x, %#x",
this, pStm
));
PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::ReleaseMarshalData");
PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::ReleaseMarshalData (hr:%lx)", NOERROR);
DEBUG_LEAVE(NOERROR);
return NOERROR;
}
STDMETHODIMP CUrlMon::DisconnectObject(DWORD dwReserved)
{
DEBUG_ENTER((DBG_MONIKER,
Hresult,
"CUrlMon::IMarshal::DisconnectObject",
"this=%#x, %#x",
this, dwReserved
));
PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::DisconnectObject");
PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::DisconnectObject (hr:%lx)", NOERROR);
DEBUG_LEAVE(NOERROR);
return NOERROR;
}
//+---------------------------------------------------------------------------
//
// Method: CUrlMon::GetComparisonData
//
// Synopsis:
//
// Arguments: [pbData] --
// [cbMax] --
// [pcbData] --
//
// Returns:
//
// History: 1-22-96 JohannP (Johann Posch) Created
//
// Notes:
//
//----------------------------------------------------------------------------
STDMETHODIMP CUrlMon::GetComparisonData(byte *pbData, ULONG cbMax, ULONG *pcbData)
{
DEBUG_ENTER((DBG_MONIKER,
Hresult,
"CUrlMon::IROTData::GetComparisonData",
"this=%#x, %#x, %#x, %#x",
this, pbData, cbMax, pcbData
));
PerfDbgLog(tagCUrlMarsh, this, "+CUrlMon::GetComparisonData");
HRESULT hr = NOERROR;
if (pbData == NULL || pcbData == NULL)
{
hr = E_INVALIDARG;
}
else
{
UrlMkAssert((_pwzUrl != NULL));
*pcbData = (wcslen(_pwzUrl) + 1) * sizeof(WCHAR);
if (*pcbData > cbMax)
{
hr = E_FAIL;
}
else
{
wcscpy((WCHAR*)pbData,_pwzUrl);
}
}
PerfDbgLog1(tagCUrlMarsh, this, "-CUrlMon::GetComparisonData (hr:%lx)", hr);
DEBUG_LEAVE(NOERROR);
return NOERROR;
}