mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
4.4 KiB
162 lines
4.4 KiB
//+------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1997 - 1998.
|
|
//
|
|
// File: abortwid.cxx
|
|
//
|
|
// Contents: Tracks aborted wids that are not refiled
|
|
//
|
|
// Classes: CAbortedWids
|
|
//
|
|
// History: 24-Feb-97 SitaramR Created
|
|
//
|
|
// Notes: The data structure is a sequential array of aborted
|
|
// wids. In push filtering, the number of aborted wids
|
|
// should be small and hence the choice of sequential
|
|
// array.
|
|
//
|
|
//-------------------------------------------------------------------
|
|
|
|
#include <pch.cxx>
|
|
#pragma hdrstop
|
|
|
|
#include "abortwid.hxx"
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CAbortedWids::CAbortedWids
|
|
//
|
|
// Synopsis: Constructor
|
|
//
|
|
// History: 24-Feb-97 SitaramR Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CAbortedWids::CAbortedWids()
|
|
: _aAbortedWids( 0 )
|
|
{
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CAbortedWids::NoFailLokAddWid
|
|
//
|
|
// Synopsis: Adds wid to the aborted list
|
|
//
|
|
// Arguments: [wid] -- Workid to be added
|
|
// [usn] -- USN of the notification
|
|
//
|
|
// History: 24-Feb-1997 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
void CAbortedWids::NoFailLokAddWid( WORKID wid, USN usn )
|
|
{
|
|
Win4Assert( wid != widInvalid );
|
|
Win4Assert( usn > 0 );
|
|
|
|
// Space for the wid was pre-allocated in Reserve(), since we can't
|
|
// afford to take an exception here.
|
|
|
|
Win4Assert( _aAbortedWids.Count() < _aAbortedWids.Size() );
|
|
|
|
CAbortedWidEntry widEntry( wid, usn );
|
|
|
|
_aAbortedWids.Add( widEntry, _aAbortedWids.Count() );
|
|
} //NoFailLokAddWid
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CAbortedWids::LokRemoveWid
|
|
//
|
|
// Synopsis: Adds wid to the aborted list
|
|
//
|
|
// Arguments: [wid] -- Workid to be added
|
|
// [usn] -- USN of the notification
|
|
//
|
|
// History: 24-Feb-1997 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
void CAbortedWids::LokRemoveWid( WORKID wid, USN usn )
|
|
{
|
|
Win4Assert( wid != widInvalid );
|
|
Win4Assert( usn > 0 );
|
|
|
|
unsigned count = _aAbortedWids.Count();
|
|
|
|
for ( unsigned i=0; i<_aAbortedWids.Count(); i++ )
|
|
{
|
|
if ( _aAbortedWids.Get(i)._wid == wid &&
|
|
_aAbortedWids.Get(i)._usn == usn )
|
|
{
|
|
_aAbortedWids.Remove(i);
|
|
break;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Check that the wid was found in the array. We
|
|
// are using count, instead of _aAbortedWids.Count()
|
|
// because the latter will decrease after the Remove().
|
|
//
|
|
Win4Assert( i < count );
|
|
} //LokRemoveWid
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CAbortedWids::LokIsWidAborted
|
|
//
|
|
// Synopsis: Adds wid to the aborted list
|
|
//
|
|
// Arguments: [wid] -- Workid to be added
|
|
// [usn] -- USN of the notification
|
|
//
|
|
// History: 24-Feb-1997 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
BOOL CAbortedWids::LokIsWidAborted( WORKID wid, USN usn )
|
|
{
|
|
Win4Assert( wid != widInvalid );
|
|
|
|
//
|
|
// Can be called in pull filtering where usn's can be zero, hence
|
|
// no assertion on value of usn
|
|
//
|
|
|
|
CAbortedWidEntry widEntry( wid, usn );
|
|
|
|
for ( unsigned i=0; i<_aAbortedWids.Count(); i++ )
|
|
{
|
|
if ( _aAbortedWids.Get(i)._wid == wid &&
|
|
_aAbortedWids.Get(i)._usn == usn )
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
} //LokIsWidAborted
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CAbortedWids::LokReserve
|
|
//
|
|
// Synopsis: Reserve space for potentially aborted wids.
|
|
//
|
|
// Arguments: [cWids] -- # of slots to reserve now for failure later
|
|
//
|
|
// History: 27-April-1998 dlee Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
void CAbortedWids::LokReserve( unsigned cWids )
|
|
{
|
|
unsigned cPossible = _aAbortedWids.Count() + cWids;
|
|
|
|
if ( _aAbortedWids.Size() < cPossible )
|
|
_aAbortedWids.SetSize( cPossible );
|
|
} //LokReserve
|
|
|