home *** CD-ROM | disk | FTP | other *** search
- // 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
-