|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 2000.
//
// File: pathstor.hxx
//
// Contents: Store for paths in the bigtable.
//
// Classes: CCompressedPath, CCompressedPathStore, XRefPath
//
// Functions:
//
// History: 5-02-95 srikants Created
//
//----------------------------------------------------------------------------
#pragma once
#include "strhash.hxx"
typedef ULONG STRINGID;
const WCHAR wchPathSep = L'\\';
//+---------------------------------------------------------------------------
//
// Class: CStringStore
//
// Purpose: A Store for strings allowing quick lookup.
//
// History: 5-23-95 srikants Created
//
// Notes: Right now it is just using the CCompressedColHashString to
// actually store the strings. We should either make
// CCompressedColHashString a dynamic hash table or come up with
// a different scheme for storing paths in this class.
//
//----------------------------------------------------------------------------
class CStringStore { public:
CStringStore(); ~CStringStore();
STRINGID Add( const WCHAR * wszString );
STRINGID AddCountedWStr( const WCHAR * wszString, ULONG cwcStr );
STRINGID FindCountedWStr( const WCHAR * wszString, ULONG cwcStr );
const WCHAR * GetCountedWStr( STRINGID strId, ULONG & cwcStr );
GetValueResult GetString( STRINGID strId, WCHAR * pwszPath, ULONG & cwcStr );
void GetData( PROPVARIANT * pVarnt, STRINGID strId ) { _pStrHash->GetData( pVarnt, VT_LPWSTR, strId ); }
void FreeVariant( PROPVARIANT * pVarnt ) { _pStrHash->FreeVariant( pVarnt ); }
WCHAR * GetStringBuffer( ULONG cwc ) { return _pStrHash->_GetStringBuffer( cwc ); }
ULONG StrLen( STRINGID strId );
ULONG MemUsed() { return _pStrHash->MemUsed(); }
private:
CCompressedColHashString * _pStrHash; };
//+---------------------------------------------------------------------------
//
// Class: CShortPath
//
// Purpose: A compact notation for storing a path name. A path name
// is identifed by a "parent Id" and a "filename id".
//
// History: 5-02-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
class CShortPath {
public:
CShortPath( STRINGID idParent = stridInvalid, STRINGID idFileName = stridInvalid ) :_idParent(idParent), _idFileName(idFileName) {
}
BOOL IsValid() const { return stridInvalid != _idParent && stridInvalid != _idFileName ; }
void Set( STRINGID idParent, STRINGID idFileName ) { _idParent = idParent; _idFileName = idFileName; }
STRINGID GetParent() const { return _idParent; }
void SetParent( STRINGID idParent ) { _idParent = idParent; }
STRINGID GetFileName() const { return _idFileName; }
void SetFileName( STRINGID idFileName ) { _idFileName = idFileName; }
BOOL IsSame( CShortPath & other ) { return _idParent == other._idParent && _idFileName == other._idFileName; }
private:
STRINGID _idParent; STRINGID _idFileName; };
class CSplitPath;
DECL_DYNARRAY_INPLACE( CShortPathArray, CShortPath );
//+---------------------------------------------------------------------------
//
// Class: CPathStore
//
// Purpose: A store for paths in the bigtable. It stores them in a compact
// format. It also implements "Compare" methods which can compare
// two paths by their PATHIDs or a full path and a PATHID. This
// allows us to do comparisons quickly without having to construct
// the variants.
//
// History: 5-02-95 srikants Created
//
// Notes:
//
//----------------------------------------------------------------------------
typedef ULONG PATHID;
class CPathStore : public CCompressedCol { //
// CLEANCODE: this is somehow related to the expected number of rows in a
// window - maybe 1/4 of the expected is a good start.
//
enum { INIT_PATHIDS = 128 };
public:
CPathStore() : _wchPathSep( wchPathSep ), _aShortPath(INIT_PATHIDS) { }
~CPathStore();
//
// Virtual methods of CCompressedCol.
//
void AddData( PROPVARIANT const * const pvarnt, ULONG * pKey, GetValueResult& reIndicator );
BOOL FindData( PROPVARIANT const * const pvarnt, ULONG & rKey );
GetValueResult GetData(PROPVARIANT * pvarnt, VARTYPE PreferredType, ULONG key = 0, PROPID prop = 0);
void FreeVariant(PROPVARIANT * pvarnt);
ULONG MemUsed(void) { return 0; // NEWFEATURE - to be written
}
CPathStore * GetPathStore() // virtual
{ return this; }
PATHID AddPath( WCHAR * wszPath );
//
// Useful during window splits to copy a path from one window to another.
//
PATHID AddPath( CPathStore & srcStore, PATHID srcPathId );
GetValueResult GetPath( CShortPath & path, WCHAR * pwszPath, ULONG & cwcPath ); GetValueResult GetPath( PATHID pathId, PROPVARIANT & vtPath, ULONG & cbVarnt );
WCHAR * Get( PATHID pathId, PROPID propId, PVarAllocator & dstPool );
const CShortPath & GetShortPath( PATHID pathId ) { Win4Assert( pathId > 0 && pathId <= _aShortPath.Count() ); return _aShortPath.Get( pathId-1 ); }
ULONG PathLen( PATHID pathId );
int Compare( PATHID pathid1, PATHID pathid2, PROPID propId = pidPath );
int Compare( WCHAR const * wszPath1, PATHID pathid2, PROPID propId = pidPath );
int Compare( PROPVARIANT & vtPath1, PATHID pathid2, PROPID propId = pidPath );
CStringStore & GetStringStore() { return _strStore; }
private:
WCHAR _wchPathSep; // Path Separator
CStringStore _strStore; // Storage for strings.
CShortPathArray _aShortPath; // Array of short paths. Indexed
// by pathid
PATHID _AddPath( CSplitPath & splitPath ); PATHID _AddEntry( STRINGID idParent, STRINGID idFileName ); void _GetPath( PATHID pathId, WCHAR * pwszPath, ULONG cwcPath );
BOOL _IsValid( PATHID pathid ) const { return pathid > 0 && pathid <= _aShortPath.Count(); }
WCHAR * _GetPathBuffer( ULONG cwc ) { return _strStore.GetStringBuffer( cwc ); }
};
|