home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
vc98
/
mfc
/
src
/
ctlpstg.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-16
|
6KB
|
217 lines
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#ifdef AFXCTL_PROP_SEG
#pragma code_seg(AFXCTL_PROP_SEG)
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
/////////////////////////////////////////////////////////////////////////////
// COleControl::XPersistStorage
STDMETHODIMP_(ULONG) COleControl::XPersistStorage::AddRef()
{
METHOD_PROLOGUE_EX_(COleControl, PersistStorage)
return (ULONG)pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) COleControl::XPersistStorage::Release()
{
METHOD_PROLOGUE_EX_(COleControl, PersistStorage)
return (ULONG)pThis->ExternalRelease();
}
STDMETHODIMP COleControl::XPersistStorage::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleControl, PersistStorage)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}
STDMETHODIMP COleControl::XPersistStorage::GetClassID(LPCLSID lpClassID)
{
METHOD_PROLOGUE_EX_(COleControl, PersistStorage)
return pThis->GetClassID(lpClassID);
}
STDMETHODIMP COleControl::XPersistStorage::IsDirty()
{
// Return S_OK if modified, and S_FALSE otherwise.
METHOD_PROLOGUE_EX_(COleControl, PersistStorage)
if (pThis->m_pDefIPersistStorage == NULL)
pThis->m_pDefIPersistStorage =
(LPPERSISTSTORAGE)pThis->QueryDefHandler(IID_IPersistStorage);
BOOL bDefModified = (pThis->m_pDefIPersistStorage->IsDirty() == S_OK);
return (bDefModified || pThis->m_bModified) ? S_OK : S_FALSE;
}
STDMETHODIMP COleControl::XPersistStorage::InitNew(LPSTORAGE pStg)
{
METHOD_PROLOGUE_EX(COleControl, PersistStorage)
if (pThis->m_pDefIPersistStorage == NULL)
pThis->m_pDefIPersistStorage =
(LPPERSISTSTORAGE)pThis->QueryDefHandler(IID_IPersistStorage);
pThis->m_pDefIPersistStorage->InitNew(pStg);
// Delegate to OnResetState.
pThis->OnResetState();
// Unless IOleObject::SetClientSite is called after this, we can
// count on ambient properties being available while loading.
pThis->m_bCountOnAmbients = TRUE;
// Properties have been initialized
pThis->m_bInitialized = TRUE;
// Uncache cached ambient properties
_afxAmbientCache->Cache(NULL);
return S_OK;
}
STDMETHODIMP COleControl::XPersistStorage::Load(LPSTORAGE pStg)
{
ASSERT(pStg != NULL);
METHOD_PROLOGUE_EX(COleControl, PersistStorage)
CLIPFORMAT cf;
HRESULT hr;
CLSID fmtid;
hr = ::ReadFmtUserTypeStg(pStg, &cf, NULL);
if (SUCCEEDED(hr) && _AfxOleMatchPropsetClipFormat(cf, &fmtid))
{
// Load the property set data
FORMATETC formatEtc;
STGMEDIUM stgMedium;
formatEtc.cfFormat = cf;
formatEtc.ptd = NULL;
formatEtc.dwAspect = DVASPECT_CONTENT;
formatEtc.lindex = -1;
formatEtc.tymed = TYMED_ISTORAGE;
stgMedium.tymed = TYMED_ISTORAGE;
stgMedium.pstg = pStg;
stgMedium.pUnkForRelease = NULL;
hr = pThis->SetPropsetData(&formatEtc, &stgMedium, fmtid) ?
S_OK : E_FAIL;
}
else
{
// Open the "Contents" stream of the supplied storage object, and
// then delegate to same implementation as IPersistStreamInit::Load.
LPSTREAM pStm = NULL;
hr = pStg->OpenStream(OLESTR("Contents"), NULL,
STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &pStm);
ASSERT(FAILED(hr) || pStm != NULL);
if (pStm != NULL)
{
// Delegate to LoadState.
hr = pThis->LoadState(pStm);
pStm->Release();
}
}
if (pThis->m_pDefIPersistStorage == NULL)
pThis->m_pDefIPersistStorage =
(LPPERSISTSTORAGE)pThis->QueryDefHandler(IID_IPersistStorage);
// Delegate to default handler (for cache).
pThis->m_pDefIPersistStorage->Load(pStg);
return hr;
}
STDMETHODIMP COleControl::XPersistStorage::Save(LPSTORAGE pStg,
BOOL fSameAsLoad)
{
METHOD_PROLOGUE_EX(COleControl, PersistStorage)
ASSERT(pStg != NULL);
// Create a "Contents" stream on the supplied storage object, and
// then delegate to the implementation of IPersistStreamInit::Save.
// Don't bother saving if destination is up-to-date.
if (fSameAsLoad && (IsDirty() != S_OK))
return S_OK;
LPSTREAM pStm = NULL;
HRESULT hr = pStg->CreateStream(OLESTR("Contents"),
STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &pStm);
ASSERT(FAILED(hr) || pStm != NULL);
if (pStm != NULL)
{
// Delegate to SaveState.
hr = pThis->SaveState(pStm);
// Bookkeeping: Clear the dirty flag, if storage is same.
if (fSameAsLoad)
pThis->m_bModified = FALSE;
pStm->Release();
}
if (pThis->m_pDefIPersistStorage == NULL)
pThis->m_pDefIPersistStorage =
(LPPERSISTSTORAGE)pThis->QueryDefHandler(IID_IPersistStorage);
// Delegate to default handler (for cache).
pThis->m_pDefIPersistStorage->Save(pStg, fSameAsLoad);
return hr;
}
STDMETHODIMP COleControl::XPersistStorage::SaveCompleted(LPSTORAGE pStgSaved)
{
METHOD_PROLOGUE_EX_(COleControl, PersistStorage)
if (pThis->m_pDefIPersistStorage == NULL)
pThis->m_pDefIPersistStorage =
(LPPERSISTSTORAGE)pThis->QueryDefHandler(IID_IPersistStorage);
if (pStgSaved != NULL)
pThis->m_bModified = FALSE;
return pThis->m_pDefIPersistStorage->SaveCompleted(pStgSaved);
}
STDMETHODIMP COleControl::XPersistStorage::HandsOffStorage()
{
METHOD_PROLOGUE_EX_(COleControl, PersistStorage)
if (pThis->m_pDefIPersistStorage == NULL)
pThis->m_pDefIPersistStorage =
(LPPERSISTSTORAGE)pThis->QueryDefHandler(IID_IPersistStorage);
return pThis->m_pDefIPersistStorage->HandsOffStorage();
}
/////////////////////////////////////////////////////////////////////////////
// Force any extra compiler-generated code into AFX_INIT_SEG
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif