//+--------------------------------------------------------------------------- // // 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 //+--------------------------------------------------------------------------- // // 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 & wcsScope ); void ChangeCurrentScope (WCHAR const * wcsScope); CDynArray & GetScopes() { return _aCatScopes; } void SetCatalog( WCHAR const * wcsCatalog ); void AddCatalog( XPtrST & 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 & GetCatalogs() { return _aCatalogs; } void AddMachine( XPtrST & wcsMachine ); void ChangeCurrentMachine( WCHAR const * wcsMachine ); CDynArray & 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 // 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 _wcsCDOld; // buffer to hold the current directory XArray _wcsCD; // multi-scope support CDynArray _aCatScopes; // catalog path XArray _wcsCatalog; CDynArray _aCatalogs; CDynArray _aMachines; CDynArrayInPlace _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 _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 ) ); }