//--------------------------------------------------------------------------- // CursorPosition.h : CVDCursorPosition header file // // Copyright (c) 1996 Microsoft Corporation, All Rights Reserved // Developed by Sheridan Software Systems, Inc. //--------------------------------------------------------------------------- #ifndef __CVDCURSORPOSITION__ #define __CVDCURSORPOSITION__ #include "bookmark.h" class CVDRowsetSource; class CVDCursorPosition : public CVDNotifier { protected: // Construction/Destruction CVDCursorPosition(); virtual ~CVDCursorPosition(); public: static HRESULT Create(IRowPosition * pRowPosition, CVDCursorMain * pCursorMain, CVDCursorPosition ** ppCursorPosition, CVDResourceDLL * pResourceDLL); public: // Access functions CVDCursorMain * GetCursorMain() const {return m_pCursorMain;} CVDRowsetSource * GetRowsetSource() const {return m_pCursorMain;} // Updating ICursor * GetSameRowClone() const {return m_pSameRowClone;} void SetSameRowClone(ICursor * pSameRowClone) {m_pSameRowClone = pSameRowClone;} DWORD GetEditMode() const {return m_dwEditMode;} void SetEditMode(DWORD dwEditMode) {m_dwEditMode = dwEditMode;} // Column updates HRESULT CreateColumnUpdates(); HRESULT ResetColumnUpdates(); void DestroyColumnUpdates(); CVDColumnUpdate * GetColumnUpdate(ULONG ulColumn) const; void SetColumnUpdate(ULONG ulColumn, CVDColumnUpdate * pColumnUpdate); // Positioning/reset functions void PositionToFirstRow(); HRESULT SetCurrentHRow(HROW hRowNew); void SetCurrentRowStatus(WORD wStatus); HRESULT SetAddHRow(HROW hRowNew); HRESULT IsSameRowAsCurrent(HROW hRow, BOOL fCacheIfNotSame); HRESULT IsSameRowAsNew(HROW hRow); HRESULT SetRowPosition(HROW hRow); // adding/editing functions #ifndef VD_DONT_IMPLEMENT_ISTREAM HRESULT UpdateEntryIDStream(CVDRowsetColumn * pColumn, HROW hRow, IStream * pStream); #endif //VD_DONT_IMPLEMENT_ISTREAM void ReleaseSameRowClone(); HROW GetEditRow() const; // bookmarks CVDBookmark m_bmCurrent; // current row's bookmark CVDBookmark m_bmCache; // used to cache bookmark of last non-current CVDBookmark m_bmAddRow; // add row's bookmark protected: // Data members CVDResourceDLL * m_pResourceDLL; CVDCursorMain * m_pCursorMain; // backwards pointer to CVDCursorMain IRowPosition * m_pRowPosition; // row position pointer, used to synchronize current position ICursor * m_pSameRowClone; // same-row clone used in ICursorUpdateARow::GetColumn() calls DWORD m_dwEditMode; // current edit mode CVDColumnUpdate ** m_ppColumnUpdates; // column updates VARIANT_BOOL m_fTempEditMode; // temporary edit mode? (caused by external SetData call) // IRowPositionChange VARIANT_BOOL m_fConnected; // have we added ourselves to the RowPosition's connection point DWORD m_dwAdviseCookie; // connection point identifier VARIANT_BOOL m_fPassivated; // external ref count went to zero VARIANT_BOOL m_fInternalSetRow; // OnRowPositionChange caused by internal call HRESULT ConnectIRowPositionChange(); void DisconnectIRowPositionChange(); void Passivate(); HRESULT SendNotification(DBEVENTPHASE ePhase, DWORD dwEventWhat, ULONG cReasons, CURSOR_DBNOTIFYREASON rgReasons[]); public: void ReleaseCurrentRow(); void ReleaseAddRow(); //=--------------------------------------------------------------------------= // IRowsetNotify methods - IRowsetNotify is actually implemented off of CVDCursorMain // which forwards each method to the CVDCursorPosition objects // in its family // STDMETHOD(OnFieldChange)(IUnknown *pRowset, HROW hRow, ULONG cColumns, ULONG rgColumns[], DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny); STDMETHOD(OnRowChange)(IUnknown *pRowset, ULONG cRows, const HROW rghRows[], DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny); STDMETHOD(OnRowsetChange)(IUnknown *pRowset, DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny); public: //=--------------------------------------------------------------------------= // IUnknown methods // STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut); STDMETHOD_(ULONG, AddRef)(void); STDMETHOD_(ULONG, Release)(void); //=--------------------------------------------------------------------------= // IRowPositionChange method passed up from CVDRowPositionChange implementation // STDMETHOD(OnRowPositionChange)(DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny); private: // the inner, private unknown implementation to give to connection point // container to avoid circular ref count // class CVDRowPositionChange : public IRowPositionChange { public: STDMETHOD(QueryInterface)(REFIID riid, void **ppvObjOut); STDMETHOD_(ULONG, AddRef)(void); STDMETHOD_(ULONG, Release)(void); // constructor is remarkably trivial // CVDRowPositionChange() : m_cRef(0) {} ULONG GetRefCount() const {return m_cRef;} private: CVDCursorPosition *m_pMainUnknown(); ULONG m_cRef; //=--------------------------------------------------------------------------= // IRowPositionChange method // STDMETHOD(OnRowPositionChange)(DBREASON eReason, DBEVENTPHASE ePhase, BOOL fCantDeny); } m_RowPositionChange; friend class CVDRowPositionChange; }; #endif //__CVDCURSORPOSITION__