windows-nt/Source/XPSP1/NT/inetsrv/query/qutil/h/catstate.hxx

367 lines
10 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 2000.
//
// File: CatState.hxx
//
// Contents: Catalog state object
//
// Classes: CCatState
//
// History: 09-Feb-96 KyleP Separated from Scanner.hxx
//
//----------------------------------------------------------------------------
#pragma once
#include <parser.hxx>
//+---------------------------------------------------------------------------
//
// Class: CString
//
// Purpose: A simple string class for category names
//
// History: 21-Aug-95 SitaramR Created.
//
//----------------------------------------------------------------------------
class CString
{
public:
inline CString( WCHAR const * wcsString );
~CString()
{
delete [] _wcsString;
}
// Replaces an existing string with the new one
inline void Replace(WCHAR const *wcsString);
WCHAR const *GetString()
{
return _wcsString;
}
private:
WCHAR * _wcsString;
};
//+---------------------------------------------------------------------------
//
// Class: CCatState
//
// Purpose: Holds state information needed by ci.cxx that can be changed
// by CCommandParser.
//
// History: 06-May-92 AmyA Created.
//
//----------------------------------------------------------------------------
enum SORTDIR
{
SORT_UP,
SORT_DOWN,
};
enum ECategorizationDir
{
UP,
DOWN
};
class CCatState
{
public:
CCatState();
~CCatState();
void SetDefaultProperty( WCHAR const * wcsProperty );
WCHAR const * GetDefaultProperty() const { return _wcsProperty; }
void SetPropertyType( PropertyType propType ) { _propType = propType; }
PropertyType GetPropertyType() const { return _propType; }
void SetRankMethod( ULONG ulMethod ) { _ulMethod = ulMethod; }
ULONG GetRankMethod() const { return _ulMethod; }
void SetDeep( BOOL isDeep ) { _isDeep = isDeep; }
void AddDepthFlag(BOOL isDeep);
BOOL GetCurrentDepthFlag() const
{
return _afIsDeep[_cCatSets-1];
}
BOOL GetDepthFlag(unsigned int i) const
{
return _afIsDeep[i];
}
BOOL IsDeep() const { return _isDeep; }
void SetVirtual( BOOL isVirtual ) { _isVirtual = isVirtual; }
BOOL IsVirtual() const { return _isVirtual; }
void SetMetaQuery( CiMetaData eType ) { _eType = eType; }
BOOL IsMetaQuery() { return (_eType != CiNormal); }
CiMetaData MetaQueryType() { return _eType; }
void SetCD( WCHAR const * wcsCD );
WCHAR const * GetCD();
void AddDir( XPtrST<WCHAR> & wcsScope );
void ChangeCurrentScope (WCHAR const * wcsScope);
CDynArray<CString> & GetScopes()
{
return _aCatScopes;
}
void SetCatalog( WCHAR const * wcsCatalog );
void AddCatalog( XPtrST<WCHAR> & wcsCatalog );
void ChangeCurrentCatalog(WCHAR const * wcsCatalog );
void ChangeCurrentDepth(BOOL fDepth);
WCHAR const * GetCatalog() const
{
return _wcsCatalog.GetPointer();
}
WCHAR const * GetCatalog(unsigned int i) const
{
return _aCatalogs[i]->GetString();
}
CDynArray<CString> & GetCatalogs()
{
return _aCatalogs;
}
void AddMachine( XPtrST<WCHAR> & wcsMachine );
void ChangeCurrentMachine( WCHAR const * wcsMachine );
CDynArray<CString> & GetMachines()
{
return _aMachines;
}
void SetColumn( WCHAR const * wcsColumn, unsigned int uPos );
void SetNumberOfColumns( unsigned int cCol );
WCHAR const * GetColumn( unsigned int uPos ) const;
unsigned int NumberOfColumns() const;
void SetSortProp( WCHAR const * wcsProp, SORTDIR sd, unsigned int uPos );
void SetNumberOfSortProps( unsigned int cProp );
void GetSortProp( unsigned int uPos, WCHAR const ** pwcsName, SORTDIR * psd ) const;
unsigned int NumberOfSortProps() const;
void SetLastQuery( CDbRestriction * prst )
{
delete _prstLast;
_prstLast = prst;
}
CDbRestriction * GetLastQuery() { return _prstLast; }
void SetLocale( WCHAR const *wcsLocale );
void SetLocale( LCID lcid ) { _lcid = lcid; }
LCID GetLocale() const { return _lcid; }
void SetCodePage( ULONG ulCodePage ) { _ulCodePage = ulCodePage; }
ULONG GetCodePage() const { return _ulCodePage; }
BOOL IsSC() { return _fIsSC; }
void UseSC() { _fIsSC = TRUE; }
void UseNormalCatalog() { _fIsSC = FALSE; }
BOOL UseCI() { return _fUseCI; }
void SetUseCI(BOOL f) { _fUseCI = f; }
//
// Categorization
//
void SetCategory( WCHAR const *wcsCategory, unsigned uPos );
WCHAR const *GetCategory( unsigned uPos ) const;
void SetNumberOfCategories( unsigned cCat ) { _cCategories = cCat; }
unsigned NumberOfCategories() const { return _cCategories; }
void ClearCategories() { _aCategories.Clear(); }
inline void SetCategorizationDir( ECategorizationDir eCategDir, unsigned iRow );
inline void GetCategorizationDir( ECategorizationDir& eCategDir, unsigned& iRow ) const;
//
// Limits on # results
//
BOOL IsMaxResultsSpecified() const { return _cMaxResults > 0; }
ULONG GetMaxResults() const { return _cMaxResults; }
void SetMaxResults( ULONG cMaxResults ) { _cMaxResults = cMaxResults; }
//
// FirstRows
//
BOOL IsFirstRowsSpecified() const { return _cFirstRows > 0; }
ULONG GetFirstRows() const { return _cFirstRows; }
void SetFirstRows( ULONG cFirstRows ) { _cFirstRows = cFirstRows; }
// Support for multiple catalogs. We will maintain several rows of
// <catalog, machine, depth, scope> tuples. From the command line,
// the user can cause the addition of a row by adding a catalog
// or a scope or a machine. The new row will have the specified value
// for the specified column, but default values for all other columns.
// The user can issue subsequent Set commands to change the defaults
// of the most recently added row.
// The following function creates a new row with defaults
SCODE AddCatSetWithDefaults();
unsigned int GetCatSetCount () const
{
return _cCatSets;
};
private:
// default property
WCHAR * _wcsProperty;
PropertyType _propType;
// vector method
ULONG _ulMethod;
// query depth
BOOL _isDeep;
// virtual or real path?
BOOL _isVirtual;
// Metadata query?
CiMetaData _eType;
// use CI exclusively for query?
BOOL _fUseCI;
// use multiple catalog extensions?
BOOL _fUseMultipleCats;
// output column info
WCHAR ** _pwcsColumns;
unsigned int _nColumns;
// sort information
struct SSortInfo
{
WCHAR * wcsProp;
SORTDIR sd;
};
SSortInfo * _psi;
unsigned int _nSort;
// CD before the program started
XArray<WCHAR> _wcsCDOld;
// buffer to hold the current directory
XArray<WCHAR> _wcsCD;
// multi-scope support
CDynArray<CString> _aCatScopes;
// catalog path
XArray<WCHAR> _wcsCatalog;
CDynArray<CString> _aCatalogs;
CDynArray<CString> _aMachines;
CDynArrayInPlace<BOOL> _afIsDeep;
// previous restriction
CDbRestriction * _prstLast;
// locale for word breaking
LCID _lcid;
// mostly for mbstowcs and back
ULONG _ulCodePage;
// For summary catalog use
BOOL _fIsSC;
// For categorization
unsigned _cCategories; // Count of categories
CDynArray<CString> _aCategories; // Array of categories
ECategorizationDir _eCategorizationDir; // Direction of traversing a categorized rowset
unsigned _iCategorizationRow; // Index of categorized row to be expanded
// Limits on # results
ULONG _cMaxResults;
ULONG _cFirstRows;
UINT _cCatSets; // tracks the number of rows (catalog/scope/machine/depth)
};
//+---------------------------------------------------------------------------
//
// Member: CCatState::SetCategorizationDir
//
// Synopsis: Sets categorization direction and row #
//
// History: 21-Aug-95 SitaramR Created
//
//----------------------------------------------------------------------------
inline void CCatState::SetCategorizationDir( ECategorizationDir eCategDir, unsigned iRow )
{
_eCategorizationDir = eCategDir;
_iCategorizationRow = iRow;
}
//+---------------------------------------------------------------------------
//
// Member: CCatState::GetCategorizationDir
//
// Synopsis: Gets categorization direction and row #
//
// History: 21-Aug-95 SitaramR Created
//
//----------------------------------------------------------------------------
inline void CCatState::GetCategorizationDir( ECategorizationDir& eCategDir, unsigned& iRow ) const
{
eCategDir = _eCategorizationDir;
iRow = _iCategorizationRow;
}
//+---------------------------------------------------------------------------
//
// Function: CString::CString
//
// Purpose: Inline constructor
//
// History: 21-Aug-95 SitaramR Created.
//
//----------------------------------------------------------------------------
inline CString::CString( WCHAR const *wcsString )
{
_wcsString = new WCHAR[ wcslen( wcsString ) + 1 ];
RtlCopyMemory( _wcsString, wcsString, ( wcslen( wcsString ) + 1 ) * sizeof( WCHAR ) );
}
//+---------------------------------------------------------------------------
//
// Function: CString::Replace
//
// Purpose: Inline replacement of string
//
// History: 27-Feb-97 KrishnaN Created.
//
//----------------------------------------------------------------------------
inline void CString::Replace(WCHAR const *wcsString)
{
// Keep it simple. Just delete old string and put in the new string.
// Not used in production code.
delete [] _wcsString;
_wcsString = new WCHAR[ wcslen( wcsString ) + 1 ];
RtlCopyMemory( _wcsString, wcsString, ( wcslen( wcsString ) + 1 ) * sizeof( WCHAR ) );
}