|
|
//+-----------------------------------------------------------------------
//
// 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
|