windows-nt/Source/XPSP1/NT/multimedia/media/sndrec32/o2base/vwadvhld.cxx
2020-09-26 16:20:57 +08:00

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;
}