522 lines
16 KiB
C++
522 lines
16 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
||
|
//
|
||
|
// File: dfunmfct.cxx
|
||
|
//
|
||
|
// Contents: Implementation of CDocfileUnmarshalFactory
|
||
|
//
|
||
|
// History: 25-Jan-93 DrewB Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include <exphead.cxx>
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include <dfunmfct.hxx>
|
||
|
#include <marshl.hxx>
|
||
|
#include <logfile.hxx>
|
||
|
#include <expdf.hxx>
|
||
|
#include <expst.hxx>
|
||
|
#if WIN32 >= 300
|
||
|
#include <omarshal.hxx>
|
||
|
#endif
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CDocfileUnmarshalFactory::new, public
|
||
|
//
|
||
|
// Synopsis: Overloaded allocator
|
||
|
//
|
||
|
// Returns: Memory block for CDocfileUnmarshalFactory instance
|
||
|
//
|
||
|
// History: 25-Jun-93 AlexT Created
|
||
|
//
|
||
|
// Notes: We only need one instance of CDocfileUnmarshalFactory.
|
||
|
// We use a static memory block for that instance (so we
|
||
|
// can share it). We don't use a static object because
|
||
|
// we want to avoid the static construction call when this
|
||
|
// library is loaded.
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
BYTE abCDocfileUnmarshalFactory[sizeof(CDocfileUnmarshalFactory)];
|
||
|
|
||
|
inline void *CDocfileUnmarshalFactory::operator new(size_t size)
|
||
|
{
|
||
|
olAssert(size == sizeof(CDocfileUnmarshalFactory) &&
|
||
|
aMsg("Class size mismatch"));
|
||
|
|
||
|
return(abCDocfileUnmarshalFactory);
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CDocfileUnmarshalFactory::delete, public
|
||
|
//
|
||
|
// Synopsis: Overloaded deallocator
|
||
|
//
|
||
|
// History: 25-Jun-93 AlexT Created
|
||
|
//
|
||
|
// Notes: Should never be called
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
void CDocfileUnmarshalFactory::operator delete(void *pv)
|
||
|
{
|
||
|
olAssert(!aMsg("CDocfileUnmarshalFactory::operator delete called!"));
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: DllGetClassObject, public
|
||
|
//
|
||
|
// Synopsis: Returns class factory objects for CLSID_DfMarshal
|
||
|
//
|
||
|
// Arguments: [clsid] - Class ID of object to get
|
||
|
// [riid] - IID of interface to get
|
||
|
// [ppv] - Object return
|
||
|
//
|
||
|
// Returns: Appropriate status code
|
||
|
//
|
||
|
// Modifies: [ppv]
|
||
|
//
|
||
|
// History: 26-Jan-93 DrewB Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
#ifdef WIN32
|
||
|
HRESULT Storage32DllGetClassObject(REFCLSID clsid, REFIID riid, void **ppv)
|
||
|
#else
|
||
|
STDAPI DllGetClassObject(REFCLSID clsid, REFIID riid, void FAR* FAR* ppv)
|
||
|
#endif // WIN32
|
||
|
{
|
||
|
SCODE sc;
|
||
|
|
||
|
olDebugOut((DEB_TRACE, "In DllGetClassObject(clsid, riid, %p)\n", ppv));
|
||
|
TRY
|
||
|
{
|
||
|
olChk(ValidatePtrBuffer(ppv));
|
||
|
*ppv = NULL;
|
||
|
olChk(ValidateIid(riid));
|
||
|
#if WIN32 >= 300
|
||
|
if (IsEqualCLSID(clsid, CLSID_NtHandleMarshal))
|
||
|
{
|
||
|
if (!IsEqualIID(riid, IID_IUnknown) &&
|
||
|
!IsEqualIID(riid, IID_IClassFactory))
|
||
|
olErr(EH_Err, E_NOINTERFACE);
|
||
|
*ppv = (IClassFactory *) &sCNtHandleUnmarshalFactory;
|
||
|
}
|
||
|
else
|
||
|
#endif
|
||
|
if (IsEqualCLSID(clsid, CLSID_DfMarshal))
|
||
|
{
|
||
|
if (!IsEqualIID(riid, IID_IUnknown) &&
|
||
|
!IsEqualIID(riid, IID_IClassFactory))
|
||
|
olErr(EH_Err, E_NOINTERFACE);
|
||
|
// Multiple inits don't hurt
|
||
|
*ppv = (IClassFactory *)new CDocfileUnmarshalFactory;
|
||
|
olAssert(*ppv != NULL && aMsg("new CDocfileUnmarshalFactory failed!"));
|
||
|
}
|
||
|
else
|
||
|
olErr(EH_Err, STG_E_INVALIDPARAMETER);
|
||
|
}
|
||
|
CATCH(CException, e)
|
||
|
{
|
||
|
sc = e.GetErrorCode();
|
||
|
}
|
||
|
END_CATCH
|
||
|
olDebugOut((DEB_TRACE, "Out DllGetClassObject => %p\n", *ppv));
|
||
|
EH_Err:
|
||
|
return ResultFromScode(sc);
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CDocfileUnmarshalFactory::AddRef, public
|
||
|
//
|
||
|
// Synopsis: Increments the ref count
|
||
|
//
|
||
|
// Returns: Appropriate status code
|
||
|
//
|
||
|
// History: 25-Jan-93 DrewB Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
STDMETHODIMP_(ULONG) CDocfileUnmarshalFactory::AddRef(void)
|
||
|
{
|
||
|
LONG lRet;
|
||
|
|
||
|
olLog(("%p::In CDocfileUnmarshalFactory::AddRef()\n", this));
|
||
|
olDebugOut((DEB_TRACE, "In CDocfileUnmarshalFactory::AddRef:%p()\n",
|
||
|
this));
|
||
|
lRet = _AddRef();
|
||
|
olDebugOut((DEB_TRACE, "Out CDocfileUnmarshalFactory::AddRef => %ld\n",
|
||
|
lRet));
|
||
|
olLog(("%p::Out CDocfileUnmarshalFactory::AddRef(). ret == %ld\n",
|
||
|
this, lRet));
|
||
|
return lRet;
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CDocfileUnmarshalFactory::Release, public
|
||
|
//
|
||
|
// Synopsis: Releases resources
|
||
|
//
|
||
|
// Returns: Appropriate status code
|
||
|
//
|
||
|
// History: 25-Jan-93 DrewB Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
STDMETHODIMP_(ULONG) CDocfileUnmarshalFactory::Release(void)
|
||
|
{
|
||
|
LONG lRet;
|
||
|
|
||
|
olLog(("%p::In CDocfileUnmarshalFactory::Release()\n", this));
|
||
|
olDebugOut((DEB_TRACE, "In CDocfileUnmarshalFactory::Release:%p()\n",
|
||
|
this));
|
||
|
lRet = 0;
|
||
|
olDebugOut((DEB_TRACE, "Out CDocfileUnmarshalFactory::Release => %ld\n",
|
||
|
lRet));
|
||
|
olLog(("%p::Out CDocfileUnmarshalFactory::Release(). ret == %ld\n",
|
||
|
this, lRet));
|
||
|
return lRet;
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CDocfileUnmarshalFactory::QueryInterface, public
|
||
|
//
|
||
|
// Synopsis: Returns an object for the requested interface
|
||
|
//
|
||
|
// Arguments: [iid] - Interface ID
|
||
|
// [ppv] - Object return
|
||
|
//
|
||
|
// Returns: Appropriate status code
|
||
|
//
|
||
|
// Modifies: [ppv]
|
||
|
//
|
||
|
// History: 25-Jan-93 DrewB Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
STDMETHODIMP CDocfileUnmarshalFactory::QueryInterface(REFIID riid,
|
||
|
void **ppv)
|
||
|
{
|
||
|
SCODE sc;
|
||
|
|
||
|
olLog(("%p::In CDocfileUnmarshalFactory::QueryInterface(riid, %p)\n",
|
||
|
this, ppv));
|
||
|
olDebugOut((DEB_TRACE, "In CDocfileUnmarshalFactory::QueryInterface:%p("
|
||
|
"riid, %p)\n", this, ppv));
|
||
|
TRY
|
||
|
{
|
||
|
olChk(Validate());
|
||
|
olChk(ValidateOutPtrBuffer(ppv));
|
||
|
*ppv = NULL;
|
||
|
olChk(ValidateIid(riid));
|
||
|
if (IsEqualIID(riid, IID_IClassFactory) ||
|
||
|
IsEqualIID(riid, IID_IUnknown))
|
||
|
{
|
||
|
_AddRef();
|
||
|
*ppv = (IClassFactory *)this;
|
||
|
}
|
||
|
else if (IsEqualIID(riid, IID_IMarshal))
|
||
|
{
|
||
|
_AddRef();
|
||
|
*ppv = (IMarshal *)this;
|
||
|
}
|
||
|
else
|
||
|
olErr(EH_Err, E_NOINTERFACE);
|
||
|
}
|
||
|
CATCH(CException, e)
|
||
|
{
|
||
|
sc = e.GetErrorCode();
|
||
|
}
|
||
|
END_CATCH
|
||
|
olDebugOut((DEB_TRACE, "Out CDocfileUnmarshalFactory::QueryInterface => "
|
||
|
"%p\n", *ppv));
|
||
|
EH_Err:
|
||
|
olLog(("%p::Out CDocfileUnmarshalFactory::QueryInterface(). "
|
||
|
"*ppv == %p, ret == 0x%lX\n", this, *ppv, sc));
|
||
|
return ResultFromScode(sc);
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CDocfileUnmarshalFactory::GetUnmarshalClass, public
|
||
|
//
|
||
|
// Synopsis: Returns the class ID
|
||
|
//
|
||
|
// Arguments: [riid] - IID of object
|
||
|
// [pv] - Unreferenced
|
||
|
// [dwDestContext] - Unreferenced
|
||
|
// [pvDestContext] - Unreferenced
|
||
|
// [mshlflags] - Unreferenced
|
||
|
// [pcid] - CLSID return
|
||
|
//
|
||
|
// Returns: Appropriate status code
|
||
|
//
|
||
|
// Modifies: [pcid]
|
||
|
//
|
||
|
// History: 25-Jan-93 DrewB Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
STDMETHODIMP CDocfileUnmarshalFactory::GetUnmarshalClass(REFIID riid,
|
||
|
void *pv,
|
||
|
DWORD dwDestContext,
|
||
|
LPVOID pvDestContext,
|
||
|
DWORD mshlflags,
|
||
|
LPCLSID pcid)
|
||
|
{
|
||
|
olLog(("%p::INVALID CALL TO CDocfileUnmarshalFactory::GetUnmarshalClass("
|
||
|
"riid, %p, %lu, %p, %lu, %p)\n", this, pv, dwDestContext,
|
||
|
pvDestContext, mshlflags, pcid));
|
||
|
return ResultFromScode(STG_E_INVALIDFUNCTION);
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CDocfileUnmarshalFactory::GetMarshalSizeMax, public
|
||
|
//
|
||
|
// Synopsis: Returns the size needed for the marshal buffer
|
||
|
//
|
||
|
// Arguments: [iid] - IID of object being marshaled
|
||
|
// [pv] - Unreferenced
|
||
|
// [dwDestContext] - Unreferenced
|
||
|
// [pvDestContext] - Unreferenced
|
||
|
// [mshlflags] - Unreferenced
|
||
|
// [pcbSize] - Size return
|
||
|
//
|
||
|
// Returns: Appropriate status code
|
||
|
//
|
||
|
// Modifies: [pcbSize]
|
||
|
//
|
||
|
// History: 25-Jan-93 DrewB Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
STDMETHODIMP CDocfileUnmarshalFactory::GetMarshalSizeMax(REFIID iid,
|
||
|
void *pv,
|
||
|
DWORD dwDestContext,
|
||
|
LPVOID pvDestContext,
|
||
|
DWORD mshlflags,
|
||
|
LPDWORD pcbSize)
|
||
|
{
|
||
|
olLog(("%p::INVALID CALL TO CDocfileUnmarshalFactory::GetMarshalSizeMax("
|
||
|
"riid, %p, %lu, %p, %lu, %p)\n",
|
||
|
this, pv, dwDestContext, pvDestContext, mshlflags, pcbSize));
|
||
|
return ResultFromScode(STG_E_INVALIDFUNCTION);
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CDocfileUnmarshalFactory::MarshalInterface, public
|
||
|
//
|
||
|
// Synopsis: Marshals a given object
|
||
|
//
|
||
|
// Arguments: [pstStm] - Stream to write marshal data into
|
||
|
// [iid] - Interface to marshal
|
||
|
// [pv] - Unreferenced
|
||
|
// [dwDestContext] - Unreferenced
|
||
|
// [pvDestContext] - Unreferenced
|
||
|
// [mshlflags] - Unreferenced
|
||
|
//
|
||
|
// Returns: Appropriate status code
|
||
|
//
|
||
|
// History: 25-Jan-93 DrewB Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
STDMETHODIMP CDocfileUnmarshalFactory::MarshalInterface(IStream *pstStm,
|
||
|
REFIID iid,
|
||
|
void *pv,
|
||
|
DWORD dwDestContext,
|
||
|
LPVOID pvDestContext,
|
||
|
DWORD mshlflags)
|
||
|
{
|
||
|
olLog(("%p::INVALID CALL TO CDocfileUnmarshalFactory::MarshalInterface("
|
||
|
"%p, riid, %p, %lu, %p, %lu). Context == %lX\n",
|
||
|
this, pstStm, pv, dwDestContext, pvDestContext, mshlflags,
|
||
|
(ULONG)GetCurrentContextId()));
|
||
|
return ResultFromScode(STG_E_INVALIDFUNCTION);
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CDocfileUnmarshalFactory::UnmarshalInterface, public
|
||
|
//
|
||
|
// Synopsis: Calls through to DfUnmarshalInterface
|
||
|
//
|
||
|
// Arguments: [pstStm] - Marshal stream
|
||
|
// [riid] - IID of object to unmarshal
|
||
|
// [ppv] - Object return
|
||
|
//
|
||
|
// Returns: Appropriate status code
|
||
|
//
|
||
|
// Modifies: [ppv]
|
||
|
//
|
||
|
// History: 25-Jan-93 DrewB Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
STDMETHODIMP CDocfileUnmarshalFactory::UnmarshalInterface(IStream *pstStm,
|
||
|
REFIID iid,
|
||
|
void **ppv)
|
||
|
{
|
||
|
return DfUnMarshalInterface(pstStm, iid, TRUE, ppv);
|
||
|
}
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CDocfileUnmarshalFactory::ReleaseMarshalData, public
|
||
|
//
|
||
|
// Synopsis: Non-functional
|
||
|
//
|
||
|
// Arguments: [pstStm] -
|
||
|
//
|
||
|
// Returns: Appropriate status code
|
||
|
//
|
||
|
// History: 18-Sep-92 DrewB Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
#ifdef WIN32
|
||
|
STDMETHODIMP CDocfileUnmarshalFactory::ReleaseMarshalData(IStream *pstStm)
|
||
|
{
|
||
|
SCODE sc;
|
||
|
IID iid;
|
||
|
DWORD mshlflags;
|
||
|
|
||
|
olLog(("%p::In CDocfileUnmarshalFactory::ReleaseMarshalData(%p)\n",
|
||
|
this, pstStm));
|
||
|
|
||
|
olChk(SkipStdMarshal(pstStm, &iid, &mshlflags));
|
||
|
if (IsEqualIID(iid, IID_ILockBytes))
|
||
|
{
|
||
|
sc = CFileStream::StaticReleaseMarshalData(pstStm, mshlflags);
|
||
|
}
|
||
|
else if (IsEqualIID(iid, IID_IStorage))
|
||
|
{
|
||
|
sc = CExposedDocFile::StaticReleaseMarshalData(pstStm, mshlflags);
|
||
|
}
|
||
|
else if (IsEqualIID(iid, IID_IStream))
|
||
|
{
|
||
|
sc = CExposedStream::StaticReleaseMarshalData(pstStm, mshlflags);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
sc = E_NOINTERFACE;
|
||
|
}
|
||
|
|
||
|
olLog(("%p::Out CDocfileUnmarshalFactory::ReleaseMarshalData, sc == %lX\n",
|
||
|
this, sc));
|
||
|
EH_Err:
|
||
|
return ResultFromScode(sc);
|
||
|
}
|
||
|
#else
|
||
|
STDMETHODIMP CDocfileUnmarshalFactory::ReleaseMarshalData(IStream *pstStm)
|
||
|
{
|
||
|
olLog(("%p::Stb CDocfileUnmarshalFactory::ReleaseMarshalData(%p)\n",
|
||
|
this, pstStm));
|
||
|
return NOERROR;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
//+--------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CDocfileUnmarshalFactory::DisconnectObject, public
|
||
|
//
|
||
|
// Synopsis: Non-functional
|
||
|
//
|
||
|
// Arguments: [dwRevserved] -
|
||
|
//
|
||
|
// Returns: Appropriate status code
|
||
|
//
|
||
|
// History: 18-Sep-92 DrewB Created
|
||
|
//
|
||
|
//---------------------------------------------------------------
|
||
|
|
||
|
STDMETHODIMP CDocfileUnmarshalFactory::DisconnectObject(DWORD dwReserved)
|
||
|
{
|
||
|
olLog(("%p::Stb CDocfileUnmarshalFactory::DisconnectObject(%lu)\n",
|
||
|
this, dwReserved));
|
||
|
return NOERROR;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CDocfileUnmarshalFactory::CreateInstance, public
|
||
|
//
|
||
|
// Synopsis: Creates an instance of the docfile IMarshal unmarshaller
|
||
|
//
|
||
|
// Arguments: [pUnkOuter] -
|
||
|
// [riid] - IID of object to create
|
||
|
// [ppv] - Object return
|
||
|
//
|
||
|
// Returns: Appropriate status code
|
||
|
//
|
||
|
// Modifies: [ppv]
|
||
|
//
|
||
|
// History: 25-Jan-93 DrewB Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
STDMETHODIMP CDocfileUnmarshalFactory::CreateInstance(IUnknown *pUnkOuter,
|
||
|
REFIID riid,
|
||
|
LPVOID *ppv)
|
||
|
{
|
||
|
SCODE sc;
|
||
|
|
||
|
olLog(("%p::In CDocfileUnmarshalFactory::CreateInstance(%p, riid, %p)\n",
|
||
|
this, pUnkOuter, ppv));
|
||
|
olDebugOut((DEB_TRACE, "In CDocfileUnmarshalFactory::CreateInstance:%p("
|
||
|
"%p, riid, %p)\n", this, pUnkOuter, ppv));
|
||
|
TRY
|
||
|
{
|
||
|
olChk(Validate());
|
||
|
olChk(ValidatePtrBuffer(ppv));
|
||
|
*ppv = NULL;
|
||
|
olChk(ValidateIid(riid));
|
||
|
if (pUnkOuter != NULL || !IsEqualIID(riid, IID_IMarshal))
|
||
|
olErr(EH_Err, STG_E_INVALIDPARAMETER);
|
||
|
_AddRef();
|
||
|
*ppv = (IMarshal *)this;
|
||
|
}
|
||
|
CATCH(CException, e)
|
||
|
{
|
||
|
sc = e.GetErrorCode();
|
||
|
}
|
||
|
END_CATCH
|
||
|
olDebugOut((DEB_TRACE, "Out CDocfileUnmarshalFactory::CreateInstance => "
|
||
|
"%p\n", ppv));
|
||
|
EH_Err:
|
||
|
olLog(("%p::Out CDocfileUnmarshalFactory::CreateInstance(). "
|
||
|
"*ppv == %p, ret == 0x%lX\n", this, *ppv, sc));
|
||
|
return ResultFromScode(sc);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CDocfileUnmarshalFactory::LockServer, public
|
||
|
//
|
||
|
// Synopsis: Non-functional
|
||
|
//
|
||
|
// Arguments: [fLock] -
|
||
|
//
|
||
|
// Returns: Appropriate status code
|
||
|
//
|
||
|
// History: 25-Jan-93 DrewB Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
STDMETHODIMP CDocfileUnmarshalFactory::LockServer(BOOL fLock)
|
||
|
{
|
||
|
olLog(("%p::Stb CDocfileUnmarshalFactory::LockServer(%d)\n",
|
||
|
this, fLock));
|
||
|
return NOERROR;
|
||
|
}
|