|
|
//---------------------------------------------------------------------------
// CursorMain.h : CVDCursorMain header file
//
// Copyright (c) 1996 Microsoft Corporation, All Rights Reserved
// Developed by Sheridan Software Systems, Inc.
//---------------------------------------------------------------------------
#ifndef __CVDCURSORMAIN__
#define __CVDCURSORMAIN__
class CVDBookmark; class CVDCursorPosition;
class CVDCursorMain : public CVDRowsetSource
{ protected: // Construction/Destruction
CVDCursorMain(LCID lcid); virtual ~CVDCursorMain();
protected: static HRESULT Create(IRowPosition * pRowPosition, IRowset * pRowset, ICursor ** ppCursor, LCID lcid); public: static HRESULT Create(IRowset * pRowset, ICursor ** ppCursor, LCID lcid); static HRESULT Create(IRowPosition * pRowPosition, ICursor ** ppCursor, LCID lcid);
protected: // Rowset columns
HRESULT CreateMetaColumns(); void InitOptionalMetadata(ULONG cColumns); void DestroyMetaColumns();
HRESULT CreateColumns(); void DestroyColumns();
public: // Access functions
ULONG GetMetaColumnsCount() const {return s_ulMetaColumns;} CVDRowsetColumn * InternalGetMetaColumns() const {return s_rgMetaColumns;}
ULONG GetColumnsCount() const {return m_ulColumns;} CVDRowsetColumn * InternalGetColumns() const {return m_rgColumns;}
HACCESSOR GetBookmarkAccessor() const {return m_hAccessorBM;} ULONG GetMaxBookmarkLen() const {return m_cbMaxBookmark;}
BOOL IsColumnsRowsetSupported() const {return m_fColumnsRowsetSupported;}
void SetInternalInsertRow(BOOL fInternalInsertRow) {m_fInternalInsertRow = fInternalInsertRow;} void SetInternalDeleteRows(BOOL fInternalDeleteRows) {m_fInternalDeleteRows = fInternalDeleteRows;} void SetInternalSetData(BOOL fInternalSetData) {m_fInternalSetData = fInternalSetData;} BOOL IsSameRowAsNew(HROW hrow); ULONG AddedRows(void);
protected: // Rowset columns
static DWORD s_dwMetaRefCount; // reference count for meta-columns
static ULONG s_ulMetaColumns; // number of meta-columns for IColumnsInfo
static CVDRowsetColumn * s_rgMetaColumns; // pointer to an array of meta-column objects
ULONG m_ulColumns; // number of rowset columns
CVDRowsetColumn * m_rgColumns; // pointer to an array of column objects
// IRowsetNotify
VARIANT_BOOL m_fConnected; // have we added ourselves to the Rowset's connection point
DWORD m_dwAdviseCookie; // connection point identifier
HRESULT ConnectIRowsetNotify(); void DisconnectIRowsetNotify();
void Passivate();
// Other
ULONG m_cbMaxBookmark; // sizeof maximum bookmark
HACCESSOR m_hAccessorBM; // hAccessor for the bookmark column
CVDResourceDLL m_resourceDLL; // keeps track of resource DLL
// booleans
WORD m_fWeAddedMetaRef : 1; // we added a reference count to meta-columns
WORD m_fPassivated : 1; // external ref count went to zero
WORD m_fColumnsRowsetSupported : 1; // does rowset expose IColumnsRowset
WORD m_fInternalInsertRow : 1; // row insert caused by internal call
WORD m_fInternalDeleteRows : 1; // row delete caused by internal call
WORD m_fInternalSetData : 1; // set column caused by internal call
// rowset properties
WORD m_fLiteralBookmarks : 1; WORD m_fOrderedBookmarks : 1; WORD m_fBookmarkSkipped : 1;
public: //=--------------------------------------------------------------------------=
// IUnknown methods
//
STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut); STDMETHOD_(ULONG, AddRef)(void); STDMETHOD_(ULONG, Release)(void); //=--------------------------------------------------------------------------=
// IRowsetNotify methods passed up from CVDRowsetNotify implementation
//
STDMETHOD(OnFieldChange)(IRowset *pRowset, HROW hRow, ULONG cColumns, ULONG rgColumns[], DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny); STDMETHOD(OnRowChange)(IRowset *pRowset, ULONG cRows, const HROW rghRows[], DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny); STDMETHOD(OnRowsetChange)(IRowset *pRowset, DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny);
private: // the inner, private unknown implementation to give to connection point
// container to avoid circular ref count
//
class CVDRowsetNotify : public IRowsetNotify { public: STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut); STDMETHOD_(ULONG, AddRef)(void); STDMETHOD_(ULONG, Release)(void);
// constructor is remarkably trivial
//
CVDRowsetNotify() : m_cRef(0) {}
ULONG GetRefCount() const {return m_cRef;}
private: CVDCursorMain *m_pMainUnknown(); ULONG m_cRef; //=--------------------------------------------------------------------------=
// IRowsetNotify methods
//
STDMETHOD(OnFieldChange)(IRowset *pRowset, HROW hRow, ULONG cColumns, ULONG rgColumns[], DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny); STDMETHOD(OnRowChange)(IRowset *pRowset, ULONG cRows, const HROW rghRows[], DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny); STDMETHOD(OnRowsetChange)(IRowset *pRowset, DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny);
} m_RowsetNotify;
friend class CVDRowsetNotify;
};
#endif //__CVDCURSORMAIN__
|