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.
259 lines
6.7 KiB
259 lines
6.7 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// 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 );
|
|
}
|
|
|
|
};
|
|
|