367 lines
10 KiB
C++
367 lines
10 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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 ) );
|
||
|
}
|
||
|
|