198 lines
5.3 KiB
C++
198 lines
5.3 KiB
C++
//+---------------------------------------------------------------------
|
|
//
|
|
// File: vwadvhld.cxx
|
|
//
|
|
// Contents: Miscellaneous OLE helper routines
|
|
//
|
|
//------------------------------------------------------------------------
|
|
|
|
#include "headers.hxx"
|
|
#pragma hdrstop
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ViewAdviseHolder::ViewAdviseHolder, protected
|
|
//
|
|
// Synopsis: Constructor for ViewAdviseHolder class
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
ViewAdviseHolder::ViewAdviseHolder()
|
|
{
|
|
_refs = 1;
|
|
_pAdvSink = NULL;
|
|
_dwAdviseAspects = 0;
|
|
_dwAdviseFlags = 0;
|
|
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ViewAdviseHolder::~ViewAdviseHolder, protected
|
|
//
|
|
// Synopsis: Destructor for ViewAdviseHolder class
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
ViewAdviseHolder::~ViewAdviseHolder()
|
|
{
|
|
if (_pAdvSink != NULL)
|
|
_pAdvSink->Release();
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ViewAdviseHolder::QueryInterface, public
|
|
//
|
|
// Synopsis: Method of IUnknown interface
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
STDMETHODIMP
|
|
ViewAdviseHolder::QueryInterface(REFIID riid, LPVOID FAR* ppvObj)
|
|
{
|
|
if (IsEqualIID(riid,IID_IUnknown))
|
|
{
|
|
*ppvObj = this;
|
|
AddRef();
|
|
return NOERROR;
|
|
}
|
|
DOUT(TEXT("ViewAdviseHolder::QueryInterface E_NOINTERFACE\r\n"));
|
|
*ppvObj = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ViewAdviseHolder:AddRef, public
|
|
//
|
|
// Synopsis: Method of IUnknown interface
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
ViewAdviseHolder::AddRef(void)
|
|
{
|
|
return _refs++;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ViewAdviseHolder::Release, public
|
|
//
|
|
// Synopsis: Method of IUnknown interface
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
ViewAdviseHolder::Release(void)
|
|
{
|
|
if (--_refs == 0)
|
|
delete this;
|
|
return (_refs);
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ViewAdviseHolder::SetAdvise, public
|
|
//
|
|
// Synopsis: Places an advise in the advise holder
|
|
//
|
|
// Arguments: The arguments are the same as to IViewObject::SetAdvise
|
|
//
|
|
// Notes: IViewObject objects using this advise holder delegate
|
|
// their IViewObject::SetAdvise methods to this method.
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
STDMETHODIMP
|
|
ViewAdviseHolder::SetAdvise(DWORD aspects, DWORD advf, LPADVISESINK pAdvSink)
|
|
{
|
|
if (_pAdvSink != NULL)
|
|
_pAdvSink->Release();
|
|
|
|
_pAdvSink = pAdvSink;
|
|
|
|
if (_pAdvSink != NULL)
|
|
_pAdvSink->AddRef();
|
|
|
|
_dwAdviseAspects = aspects;
|
|
_dwAdviseFlags = advf;
|
|
return NOERROR;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ViewAdviseHolder::GetAdvise, public
|
|
//
|
|
// Synopsis: Reports on an advise in the advise holder
|
|
//
|
|
// Arguments: The arguments are the same as to IViewObject::GetAdvise
|
|
//
|
|
// Notes: IViewObject objects using this advise holder delegate
|
|
// their IViewObject::GetAdvise methods to this method.
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
STDMETHODIMP
|
|
ViewAdviseHolder::GetAdvise(DWORD FAR* pAspects,
|
|
DWORD FAR* pAdvf,
|
|
LPADVISESINK FAR* ppAdvSink)
|
|
{
|
|
*ppAdvSink = _pAdvSink;
|
|
*pAspects = _dwAdviseAspects;
|
|
*pAdvf = _dwAdviseFlags;
|
|
return NOERROR;
|
|
// review: is this the right return code if no advise has been set?
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: ViewAdviseHolder::SendOnViewChange, public
|
|
//
|
|
// Synopsis: Sends an OnViewChange notification to the registered advise.
|
|
//
|
|
// Arguments: [dwAspect] -- the display aspect that has changed
|
|
//
|
|
// Notes: The client IViewObject should call this method whenever
|
|
// its view has changed.
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
void ViewAdviseHolder::SendOnViewChange(DWORD dwAspect)
|
|
{
|
|
if (_pAdvSink != NULL && (dwAspect&_dwAdviseAspects) != 0)
|
|
_pAdvSink->OnViewChange(dwAspect, -1);
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Function: CreateViewAdviseHolder
|
|
//
|
|
// Synopsis: Creates a ViewAdviseHolder object
|
|
//
|
|
// Arguments: [ppViewHolder] -- place where the view holder is returned
|
|
//
|
|
// Returns: Success if the advise holder was created
|
|
//
|
|
// Notes: This function is directly analogous to the OLE provided
|
|
// CreateDataAdviseHolder
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CreateViewAdviseHolder(LPVIEWADVISEHOLDER FAR* ppViewHolder)
|
|
{
|
|
//LPVIEWADVISEHOLDER pViewAdvHolder = new (NullOnFail) ViewAdviseHolder;
|
|
LPVIEWADVISEHOLDER pViewAdvHolder = new ViewAdviseHolder;
|
|
*ppViewHolder = pViewAdvHolder;
|
|
|
|
if (pViewAdvHolder == NULL)
|
|
{
|
|
DOUT(TEXT("o2base/vwadvhld/CreateViewAdviseHolder failed\r\n"));
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
else
|
|
return NOERROR;
|
|
}
|