windows-nt/Source/XPSP1/NT/shell/cpls/appwzdui/event.cpp
2020-09-26 16:20:57 +08:00

283 lines
6.4 KiB
C++

//+-----------------------------------------------------------------------
//
// event.cpp: Implementation of the CEventBroker class.
// This class translates internal ADC/OSP events into
// appropriate notifications for the external world.
//
//------------------------------------------------------------------------
#include "priv.h"
// Do not build this file if on Win9X or NT4
#ifndef DOWNLEVEL_PLATFORM
#include "event.h"
//#include "dump.h"
// constructor
CEventBroker::CEventBroker(LPWSTR pszQualifier) : _cRef(1)
{
ASSERT(NULL == _pospl);
ASSERT(NULL == _pdsl);
TraceAddRef(CEventBroker, _cRef);
_cbstrQualifier = SysAllocString(pszQualifier);
}
// destructor
CEventBroker::~CEventBroker()
{
TraceMsg(TF_OBJLIFE, "(EventBroker) destroying");
SetDataSourceListener(NULL);
SetOSPListener(NULL);
if (_cbstrQualifier)
SysFreeString(_cbstrQualifier);
}
/*--------------------------------------------------------------------
Purpose: IUnknown::QueryInterface
*/
STDMETHODIMP CEventBroker::QueryInterface(REFIID riid, LPVOID * ppvObj)
{
static const QITAB qit[] = {
QITABENT(CEventBroker, IARPEvent),
{ 0 },
};
return QISearch(this, (LPCQITAB)qit, riid, ppvObj);
}
STDMETHODIMP_(ULONG) CEventBroker::AddRef()
{
++_cRef;
TraceAddRef(CEventBroker, _cRef);
return _cRef;
}
STDMETHODIMP_(ULONG) CEventBroker::Release()
{
ASSERT(_cRef > 0);
_cRef--;
TraceRelease(CEventBroker, _cRef);
if (_cRef > 0)
return _cRef;
delete this;
return 0;
}
/*-------------------------------------------------------------------------
Purpose: IARPEvent::SetDataSourceListener
Sets the Data Source listener.
If pdsl is NULL, no notifcations are sent.
*/
STDMETHODIMP CEventBroker::SetDataSourceListener(DataSourceListener * pdsl)
{
// If we've changed/reset the data source listener, make sure we don't
// think we've fired dataMemberChanged on it yet.
ATOMICRELEASE(_pdsl);
_pdsl = pdsl;
if (_pdsl)
_pdsl->AddRef();
return S_OK;
}
/*-------------------------------------------------------------------------
Purpose: IARPEvent::SetOSPListener
Sets the OSP listener.
If pospl is NULL, no notifications are sent.
*/
STDMETHODIMP CEventBroker::SetOSPListener(OLEDBSimpleProviderListener *pospl)
{
ATOMICRELEASE(_pospl);
_pospl = pospl;
if (_pospl)
_pospl->AddRef();
return S_OK;
}
/*-------------------------------------------------------------------------
Purpose: IARPEvent::IsOSPListener
Returns S_OK if the given listener is the current OSP listener.
*/
STDMETHODIMP CEventBroker::IsOSPListener(OLEDBSimpleProviderListener *pospl)
{
return (pospl == _pospl) ? S_OK : S_FALSE;
}
/*-------------------------------------------------------------------------
Purpose: IARPEvent::RowChanged
Fired when the OSP updated some fields in a row.
*/
STDMETHODIMP CEventBroker::RowChanged(DBROWCOUNT iRow)
{
ASSERT(iRow >= 0);
if (_pospl)
{
TraceMsg(TF_DSO, "(CEventBroker) rowChanged %d", iRow);
_pospl->cellChanged(iRow, -1);
}
return S_OK;
}
/*-------------------------------------------------------------------------
Purpose: IARPEvent::AboutToDeleteRows
Fired when the OSP is going to delete some rows.
*/
STDMETHODIMP CEventBroker::AboutToDeleteRows(DBROWCOUNT iRowStart, DBROWCOUNT cRows)
{
ASSERT(iRowStart >= 0);
ASSERT(cRows > 0);
if (_pospl)
{
TraceMsg(TF_DSO, "(CEventBroker) AboutToDeleteRows(%d, %d)", iRowStart, cRows);
_pospl->aboutToDeleteRows(iRowStart, cRows);
}
return S_OK;
}
/*-------------------------------------------------------------------------
Purpose: IARPEvent::DeletedRows
Fired when the OSP has deleted some rows.
*/
STDMETHODIMP CEventBroker::DeletedRows(DBROWCOUNT iRowStart, DBROWCOUNT cRows)
{
ASSERT(iRowStart >= 0);
ASSERT(cRows > 0);
if (_pospl)
{
TraceMsg(TF_DSO, "(CEventBroker) DeletedRows(%d, %d)", iRowStart, cRows);
_pospl->deletedRows(iRowStart, cRows);
}
return S_OK;
}
/*-------------------------------------------------------------------------
Purpose: IARPEvent::RowsAvailable
Fired when the OSP has enumerated some rows.
*/
STDMETHODIMP CEventBroker::RowsAvailable(DBROWCOUNT iRowStart, DBROWCOUNT cRows)
{
ASSERT(iRowStart >= 0);
ASSERT(cRows > 0);
if (_pospl)
{
TraceMsg(TF_DSO, "(CEventBroker) RowsAvailable(%d, %d)", iRowStart, cRows);
_pospl->rowsAvailable(iRowStart, cRows);
}
return S_OK;
}
/*-------------------------------------------------------------------------
Purpose: IARPEvent::LoadCompleted
Fired when the OSP has finished enumerating its data.
*/
STDMETHODIMP CEventBroker::LoadCompleted(void)
{
if (_pospl)
{
TraceMsg(TF_DSO, "(CEventBroker) LoadCompleted");
_pospl->transferComplete(OSPXFER_COMPLETE);
}
return S_OK;
}
/*-------------------------------------------------------------------------
Purpose: IARPEvent::LoadAborted
Fired when the OSP has aborted its enumeration.
*/
STDMETHODIMP CEventBroker::LoadAborted(void)
{
// Right now, any error results in not returning an SP object,
// therefore we should not fire transfer complete.
if (_pospl)
{
TraceMsg(TF_DSO, "(CEventBroker) LoadAborted");
_pospl->transferComplete(OSPXFER_ABORT);
}
return S_OK;
}
/*-------------------------------------------------------------------------
Purpose: IARPEvent::DataSetChanged
Fired when the OSP's data set has changed (resorted, refiltered, etc.)
*/
STDMETHODIMP CEventBroker::DataSetChanged(void)
{
if (_pdsl)
{
TraceMsg(TF_DSO, "(CEventBroker) DataSetChanged");
_pdsl->dataMemberChanged(_cbstrQualifier);
}
return S_OK;
}
/*----------------------------------------------------------
Purpose: Create-instance function for CARPEvent
*/
HRESULT CARPEvent_CreateInstance(REFIID riid, LPVOID * ppvObj, LPWSTR pszQualifier)
{
HRESULT hres = E_OUTOFMEMORY;
*ppvObj = NULL;
CEventBroker * pObj = new CEventBroker(pszQualifier);
if (pObj)
{
hres = pObj->QueryInterface(riid, ppvObj);
pObj->Release();
}
return hres;
}
#endif //DOWNLEVEL_PLATFORM