Source code of Windows XP (NT5)
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.
|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1997.
//
// File: pidtable.hxx
//
// Contents: Property to PROPID mapping table for downlevel content
// index. Stored persistently in the files CiPT0000.00?.
//
// Classes: CPidLookupEntry
// CPidLookupTable
// SPidLookupTableHeader
//
// History: 02 Jan 1996 AlanW Created
//
//----------------------------------------------------------------------------
#pragma once
#include <prcstob.hxx>
class CFullPropSpec; class CiStorage;
const unsigned MAX_PROPERTY_NAME_LEN = MAX_PATH;
//+---------------------------------------------------------------------------
//
// Class: CPidLookupEntry
//
// Purpose: CPidLookup table entries.
//
// History: 02 Jan 1996 AlanW Created
//
// Notes:
//
//----------------------------------------------------------------------------
#include <pshpack8.h> // pack(8), and round size to 32 bytes
class CPidLookupEntry { public: BOOL IsEqual( const CFullPropSpec & rProp, const WCHAR * pchStringBase = 0) const;
BOOL IsFree() { return _pid == 0; }
//
// Member variable access
//
void SetPropSet( GUID const & guidPropSet ) { _guid = guidPropSet; } GUID const & GetPropSet() const { return _guid; }
void SetPropertyNameOffset( ULONG iString ) { _eType = 0; _iString = iString; } void SetPropertyPropid( PROPID pidProperty ) { _eType = 1; _propid = pidProperty; }
ULONG GetPropertyNameOffset() const { return _iString; } PROPID GetPropertyPropid() const { return _propid; }
BOOL IsPropertyName() const { return _eType == 0; } BOOL IsPropertyPropid() const { return _eType == 1; }
void SetPid(PROPID Pid) { _pid = Pid; } PROPID Pid() const { return _pid; } private: GUID _guid; ULONG _eType; union { ULONG _propid; ULONG _iString; }; PROPID _pid; };
#include <poppack.h>
class PSaveProgressTracker;
//+---------------------------------------------------------------------------
//
// Class: CPidLookupTable
//
// Purpose: Persistent property spec. to PROPID mapping table for
// downlevel content index.
//
// History: 02 Jan 1996 AlanW Created
//
// Notes:
//
//----------------------------------------------------------------------------
class CPidLookupTable { public:
CPidLookupTable ( );
~CPidLookupTable ();
void Init( ULONG cEntries );
BOOL Init( PRcovStorageObj * pObj );
void MakeBackupCopy( PRcovStorageObj & dstObj, PSaveProgressTracker & tracker );
void Empty();
BOOL FindPropid( const CFullPropSpec & rProp, PROPID & rPid, BOOL fAddToTable = TRUE );
BOOL EnumerateProperty( CFullPropSpec & ps, unsigned & iBmk );
struct SPidLookupTableHeader { CHAR Signature[8]; // "PIDTABLE"
ULONG cbRecord; // size of file records
ULONG cHash; // number of hash table entries
ULONG cEntries; // nunber of hash entries in use
PROPID NextPropid; // next PROPID to be allocated
};
ULONG Size() const { return _Header.cHash; }
ULONG Entries() const { return _Header.cEntries; }
private:
ULONG Hash( const CPidLookupEntry & rProp ); ULONG Hash( const CFullPropSpec & rProp ); ULONG HashString( const WCHAR * pwszStr );
BOOL LookUp( const CFullPropSpec & Prop, ULONG &riTable ); void StoreInTable( const CPidLookupEntry & Prop );
ULONG AddEntry( const CFullPropSpec & Prop ); void GrowAndRehash( ULONG Count ); void GrowStringSpace( ULONG cbNewString );
BOOL IsFull( ) const { return ! (Entries() < Size()); }
PROPID NextPropid() const { return _Header.NextPropid; }
ULONG GrowSize() const;
SPidLookupTableHeader _Header; CPidLookupEntry * _pTable; // the hash table
WCHAR * _pchStringBase; // pointer to string memory
ULONG _cbStrings; // size of string memory
ULONG _cbStringUsed; // size of used string memory
CMutexSem _mutex;
#if ! defined(UNIT_TEST)
XPtr<PRcovStorageObj> _xrsoPidTable; // The persistent storage itself
#else // defined(UNIT_TEST)
public:
void SetFillFactor(ULONG iFill) { _iFillFactor = iFill; _maxEntries = (Size() * iFill) / 100; }
void SetNextPropid(PROPID Next) { _Header.NextPropid = Next; }
void Print( void ); #endif // defined(UNIT_TEST)
#if (DBG == 1)
ULONG _cMaxChainLen; ULONG _cTotalSearches; ULONG _cTotalLength; ULONG _iFillFactor; #endif // (DBG == 1)
ULONG _maxEntries; // max # of hash table entries
};
//+-------------------------------------------------------------------------
//
// Method: CPidLookupEntry::IsEqual, public
//
// Synopsis: Compare a hash table entry with a propspec
//
// Arguments: [rProp] - the property to be compared
// [pchStringBase] - the base address for string-named properties
// in the CPidLookupEntry
//
// Returns: BOOL - TRUE if the entry is equivalent to the property
//
// Notes: For string named properties, the input strings are assumed
// to be mapped to lower case.
//
//--------------------------------------------------------------------------
inline BOOL CPidLookupEntry::IsEqual( const CFullPropSpec & rProp, const WCHAR * pchStringBase) const { if (rProp.IsPropertyPropid()) { return IsPropertyPropid() && rProp.GetPropertyPropid() == _propid && rProp.GetPropSet() == _guid; } else { if (! IsPropertyName() || rProp.GetPropSet() != _guid) return FALSE;
const WCHAR * pwszProp = rProp.GetPropertyName();
unsigned cbPropName = (wcslen(pwszProp) + 1) * sizeof (WCHAR);
return RtlEqualMemory( pwszProp, _iString + pchStringBase, cbPropName ); } }
|