windows-nt/Source/XPSP1/NT/inetsrv/query/apps/srch/watch.cxx
2020-09-26 16:20:57 +08:00

211 lines
5.9 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 2000.
//
// File: watch.cxx
//
// Contents:
//
// History: 15 Aug 1996 DLee Created
//
//--------------------------------------------------------------------------
#include "pch.cxx"
#pragma hdrstop
//#define USE_WATCH_REGIONS // last tried 10/7/96
//
// CWatchQuery
//
CWatchQuery::CWatchQuery (CSearchQuery* pClient, IRowsetScroll* pRowset)
: _pClient (pClient),
_pContainer (0),
_pNotifyWatch (0),
_pPoint (0),
_pRowsetWatch (0),
_hRegion (0),
_fEverGotARowsChanged(FALSE),
_wnLast( 0 )
{
if (!pRowset)
THROW (CException(E_FAIL));
_pNotifyWatch = new CRowsetNotifyWatch( pClient->_hwndNotify );
SCODE sc = pRowset->QueryInterface( IID_IConnectionPointContainer,
(void **) &_pContainer );
if (SUCCEEDED(sc))
{
sc = _pContainer->FindConnectionPoint( IID_IRowsetWatchNotify,
&_pPoint );
if (SUCCEEDED(sc))
{
sc = _pPoint->Advise( (IUnknown *) _pNotifyWatch,
&_dwAdviseID );
if (SUCCEEDED(sc))
{
sc = pRowset->QueryInterface( IID_IRowsetWatchRegion,
(void**) &_pRowsetWatch );
}
}
}
#ifdef USE_WATCH_REGIONS
if (_pRowsetWatch)
{
sc = _pRowsetWatch->CreateWatchRegion (DBWATCHMODE_MOVE, &_hRegion);
}
#endif
_mode = DBWATCHMODE_MOVE;
} //CWatchNotify
CWatchQuery::~CWatchQuery ()
{
srchDebugOut(( DEB_ITRACE,
"~CWatchQuery, ever got a rc: %d, _wnLast: %d\n",
_fEverGotARowsChanged, _wnLast ));
if (_pPoint)
{
_pPoint->Unadvise(_dwAdviseID);
_pPoint->Release();
}
if (_pContainer)
_pContainer->Release();
if (_pRowsetWatch)
_pRowsetWatch->Release();
if (_pNotifyWatch)
_pNotifyWatch->Release();
} //~CWatchQuery
void CWatchQuery::Notify (HWND hwndList, DBWATCHNOTIFY changeType)
{
// don't post more notifications while we're busy
_pNotifyWatch->HoldNotifications( TRUE );
_wnLast = changeType;
switch (changeType)
{
case DBWATCHNOTIFY_QUERYDONE:
_pClient->Quiesce(TRUE);
srchDebugOut(( DEB_ITRACE, "CWatchQuery::Notify - Query DONE\n"));
break;
case DBWATCHNOTIFY_QUERYREEXECUTED:
_pClient->Quiesce(FALSE);
break;
case DBWATCHNOTIFY_ROWSCHANGED:
RowsChanged (hwndList);
break;
default :
Win4Assert( !"unexpected notification!" );
break;
}
} //Notify
void CWatchQuery::NotifyComplete()
{
_pNotifyWatch->HoldNotifications( FALSE );
} //NotifyComplete
void CWatchQuery::RowsChanged (HWND hwnd)
{
DBCOUNTITEM cChanges = 0;
DBROWWATCHCHANGE* aChange = 0;
_fEverGotARowsChanged = TRUE;
SCODE sc = _pRowsetWatch->Refresh( &cChanges, &aChange );
Win4Assert ((sc == STATUS_UNEXPECTED_NETWORK_ERROR ||
sc == DB_S_TOOMANYCHANGES || sc == E_FAIL)
&& cChanges == 0);
if ( sc == STATUS_UNEXPECTED_NETWORK_ERROR )
sc = DB_S_TOOMANYCHANGES;
if (sc == DB_S_TOOMANYCHANGES)
{
_pClient->CreateScript (&cChanges, &aChange);
}
srchDebugOut(( DEB_ITRACE, "CWatchQuery::RowsChanged Changes = %d\n", cChanges));
if (cChanges != 0)
{
ExecuteScript (hwnd, (ULONG) cChanges, aChange);
CoTaskMemFree (aChange);
}
} //RowsChanged
void CWatchQuery::ExecuteScript (HWND hwndList, ULONG cChanges, DBROWWATCHCHANGE* aScript)
{
for (ULONG i = 0; i < cChanges; i++)
{
switch (aScript[i].eChangeKind)
{
case DBROWCHANGEKIND_INSERT:
_pClient->InsertRowAfter((int) aScript[i].iRow, aScript[i].hRow);
SendMessage (hwndList, wmInsertItem, 0, aScript[i].iRow );
srchDebugOut(( DEB_ITRACE, "CWatchQuery::ExecuteScript - Row INS: %d\n", aScript[i].iRow));
break;
case DBROWCHANGEKIND_DELETE:
_pClient->DeleteRow ((int) aScript[i].iRow);
SendMessage (hwndList, wmDeleteItem, 0, aScript[i].iRow );
srchDebugOut(( DEB_ITRACE, "CWatchQuery::ExecuteScript - Row DEL: %d\n", aScript[i].iRow));
break;
case DBROWCHANGEKIND_UPDATE:
_pClient->UpdateRow ((int) aScript[i].iRow, aScript[i].hRow);
SendMessage (hwndList, wmUpdateItem, 0, aScript[i].iRow );
srchDebugOut(( DEB_ITRACE, "CWatchQuery::ExecuteScript - Row UPD\n"));
break;
case DBROWCHANGEKIND_COUNT:
_pClient->UpdateCount ((int) aScript[i].iRow);
srchDebugOut(( DEB_ITRACE, "CWatchQuery::ExecuteScript - Row CNT\n"));
default:
Win4Assert (!"unknown change kind");
}
}
} //ExecuteScript
void CWatchQuery::Extend (HWATCHREGION hRegion)
{
#ifdef USE_WATCH_REGIONS
if ((_mode & DBWATCHMODE_EXTEND) == 0)
{
_mode |= DBWATCHMODE_EXTEND;
_mode &= ~DBWATCHMODE_MOVE;
_pRowsetWatch->ChangeWatchMode ( hRegion, _mode);
}
#endif
}
void CWatchQuery::Move (HWATCHREGION hRegion)
{
#ifdef USE_WATCH_REGIONS
if ((_mode & DBWATCHMODE_MOVE) == 0)
{
_mode |= DBWATCHMODE_MOVE;
_mode &= ~DBWATCHMODE_EXTEND;
_pRowsetWatch->ChangeWatchMode ( hRegion, _mode);
}
#endif
}
void CWatchQuery::Shrink (HWATCHREGION hRegion, CBookMark& bmk, ULONG cRows)
{
#ifdef USE_WATCH_REGIONS
_pRowsetWatch->ShrinkWatchRegion (hRegion,
0, // no chapter
bmk.cbBmk, bmk.abBmk,
cRows //_mode
);
#endif
}