151 lines
4.5 KiB
C++
151 lines
4.5 KiB
C++
|
#include "privcpp.h"
|
||
|
|
||
|
|
||
|
CPackage_IAdviseSink::CPackage_IAdviseSink(CPackage *pPackage) :
|
||
|
_pPackage(pPackage)
|
||
|
{
|
||
|
ASSERT(_cRef == 0);
|
||
|
}
|
||
|
|
||
|
CPackage_IAdviseSink::~CPackage_IAdviseSink()
|
||
|
{
|
||
|
DebugMsg(DM_TRACE,"CPackage_IAdviseSink destroyed with ref count %d",_cRef);
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////
|
||
|
//
|
||
|
// IUnknown Methods...
|
||
|
//
|
||
|
HRESULT CPackage_IAdviseSink::QueryInterface(REFIID iid, void ** ppv)
|
||
|
{
|
||
|
return _pPackage->QueryInterface(iid,ppv);
|
||
|
}
|
||
|
|
||
|
ULONG CPackage_IAdviseSink::AddRef(void)
|
||
|
{
|
||
|
_cRef++; // interface ref count for debugging
|
||
|
return _pPackage->AddRef();
|
||
|
}
|
||
|
|
||
|
ULONG CPackage_IAdviseSink::Release(void)
|
||
|
{
|
||
|
_cRef--; // interface ref count for debugging
|
||
|
return _pPackage->Release();
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////
|
||
|
//
|
||
|
// IAdviseSink Methods...
|
||
|
//
|
||
|
|
||
|
void CPackage_IAdviseSink::OnDataChange(LPFORMATETC, LPSTGMEDIUM)
|
||
|
{
|
||
|
// NOTE: currently, we never set up a data advise connection with
|
||
|
// anyone, but if we ever do, we'll want to set our dirty flag
|
||
|
// when we get a datachange notificaiton.
|
||
|
|
||
|
DebugMsg(DM_TRACE, "pack as - OnDataChange() called.");
|
||
|
// when we get a data change notification, set our dirty flag
|
||
|
_pPackage->_fIsDirty = TRUE;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
void CPackage_IAdviseSink::OnViewChange(DWORD, LONG)
|
||
|
{
|
||
|
DebugMsg(DM_TRACE, "pack as - OnViewChange() called.");
|
||
|
//
|
||
|
// there's nothing to do here....we don't care about view changes.
|
||
|
// we are always viewed as an icon and that can't be changed by the server
|
||
|
// which is run when the contents are activated. the icon can
|
||
|
// only be changed through the edit package verb
|
||
|
//
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
void CPackage_IAdviseSink::OnRename(LPMONIKER)
|
||
|
{
|
||
|
DebugMsg(DM_TRACE, "pack as - OnRename() called.");
|
||
|
//
|
||
|
// once again, nothing to do here...if the user for some unknown reason
|
||
|
// tries to save the packaged file by a different name when he's done
|
||
|
// editing the contents then we'll just give not receive those changes.
|
||
|
// why would anyone want to rename a temporary file, anyway?
|
||
|
//
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
void CPackage_IAdviseSink::OnSave(void)
|
||
|
{
|
||
|
DebugMsg(DM_TRACE, "pack as - OnSave() called.");
|
||
|
|
||
|
// if the contents have been saved, then our storage is out of date,
|
||
|
// so set our dirty flag, then the container can choose to save us or not
|
||
|
_pPackage->_fIsDirty = TRUE;
|
||
|
|
||
|
// NOTE: even though Word sends us OnSave, it doesn't actually save
|
||
|
// the file. Getting IPersistFile here and calling Save
|
||
|
// fails with RPC_E_CANTCALLOUT_INASYNCCALL. W2K didn't pick
|
||
|
// up Word's save either...
|
||
|
|
||
|
// we just notifiy our own container that we've been saved and it
|
||
|
// can do whatever it wants to.
|
||
|
if (_pPackage->_pIOleAdviseHolder)
|
||
|
_pPackage->_pIOleAdviseHolder->SendOnSave();
|
||
|
}
|
||
|
|
||
|
void CPackage_IAdviseSink::OnClose(void)
|
||
|
{
|
||
|
DebugMsg(DM_TRACE, "pack as - OnClose() called.");
|
||
|
|
||
|
switch(_pPackage->_panetype)
|
||
|
{
|
||
|
case PEMBED:
|
||
|
// get rid of advsiory connnection
|
||
|
_pPackage->_pEmbed->poo->Unadvise(_pPackage->_dwCookie);
|
||
|
_pPackage->_pEmbed->poo->Release();
|
||
|
_pPackage->_pEmbed->poo = NULL;
|
||
|
|
||
|
// this updates the size of the packaged file in our _pPackage->_pEmbed
|
||
|
if (FAILED(_pPackage->EmbedInitFromFile(_pPackage->_pEmbed->pszTempName, FALSE)))
|
||
|
{
|
||
|
ShellMessageBox(g_hinst,
|
||
|
NULL,
|
||
|
MAKEINTRESOURCE(IDS_UPDATE_ERROR),
|
||
|
MAKEINTRESOURCE(IDS_APP_TITLE),
|
||
|
MB_TASKMODAL | MB_ICONERROR | MB_OK);
|
||
|
}
|
||
|
|
||
|
if (FAILED(_pPackage->_pIOleClientSite->SaveObject()))
|
||
|
{
|
||
|
ShellMessageBox(g_hinst,
|
||
|
NULL,
|
||
|
MAKEINTRESOURCE(IDS_UPDATE_ERROR),
|
||
|
MAKEINTRESOURCE(IDS_APP_TITLE),
|
||
|
MB_TASKMODAL | MB_ICONERROR | MB_OK);
|
||
|
}
|
||
|
|
||
|
if (_pPackage->_pIOleAdviseHolder)
|
||
|
_pPackage->_pIOleAdviseHolder->SendOnSave();
|
||
|
|
||
|
if (!_pPackage->_fNoIOleClientSiteCalls)
|
||
|
_pPackage->_pIOleClientSite->OnShowWindow(FALSE);
|
||
|
|
||
|
// we just notify out own container that we've been closed and let
|
||
|
// it do whatever it wants to.
|
||
|
if (_pPackage->_pIOleAdviseHolder)
|
||
|
_pPackage->_pIOleAdviseHolder->SendOnClose();
|
||
|
|
||
|
break;
|
||
|
|
||
|
case CMDLINK:
|
||
|
// there shouldn't be anything to do here, since a CMDLINK is always
|
||
|
// executed using ShellExecute and never through OLE, so who would be
|
||
|
// setting up an advisory connection with the package?
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|