369 lines
9 KiB
C++
369 lines
9 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1998.
|
||
|
//
|
||
|
// File: pidmap.hxx
|
||
|
//
|
||
|
// Contents: Maps pid <--> property name.
|
||
|
//
|
||
|
// History: 21-Jan-93 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
class CRestriction;
|
||
|
class CColumnSet;
|
||
|
class CSortSet;
|
||
|
|
||
|
typedef CCountedDynArray<CFullPropSpec> CPropNameArrayBase;
|
||
|
|
||
|
class CPropNameArray : public CPropNameArrayBase
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
CPropNameArray(unsigned size = arraySize);
|
||
|
|
||
|
//
|
||
|
// Serialization
|
||
|
//
|
||
|
|
||
|
void Marshall( PSerStream & stm ) const;
|
||
|
CPropNameArray( PDeSerStream & stm );
|
||
|
|
||
|
# ifdef CIEXTMODE
|
||
|
void CiExtDump(void *ciExtSelf) const;
|
||
|
# endif
|
||
|
};
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: PPidConverter
|
||
|
//
|
||
|
// Purpose: Maps FULLPROPSPEC to 'real' PROPID
|
||
|
//
|
||
|
// History: 23-Dec-97 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
class PPidConverter
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
virtual ~PPidConverter() {}
|
||
|
|
||
|
virtual SCODE FPSToPROPID( CFullPropSpec const & fps, PROPID & pid ) = 0;
|
||
|
};
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CPidMapper
|
||
|
//
|
||
|
// Purpose: Maps 'fake' pid <--> property name
|
||
|
//
|
||
|
// History: 21-Jan-93 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
class CPidMapper : public CPropNameArray
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
CPidMapper( PPidConverter * pPidConverter = 0);
|
||
|
|
||
|
CPidMapper( unsigned size, PPidConverter * pPidConverter = 0 );
|
||
|
|
||
|
CPidMapper( PDeSerStream & stm, PPidConverter * pPidConverter = 0 );
|
||
|
|
||
|
inline PROPID NameToPid( DBID const & Property );
|
||
|
|
||
|
inline PROPID NameToPid( FULLPROPSPEC const & Property );
|
||
|
|
||
|
PROPID NameToPid( CFullPropSpec const & Property );
|
||
|
|
||
|
inline CFullPropSpec const * PidToName( PROPID pid ) const;
|
||
|
|
||
|
PROPID PidToRealPid( PROPID pid );
|
||
|
|
||
|
inline void Clear( );
|
||
|
|
||
|
inline void SetPidConverter( PPidConverter * pPidConverter );
|
||
|
|
||
|
protected:
|
||
|
|
||
|
inline PROPID RealToFake( PROPID pid ) const;
|
||
|
|
||
|
private:
|
||
|
|
||
|
static BOOL _IsEqual( CFullPropSpec const & p1, CFullPropSpec const & p2 );
|
||
|
|
||
|
CDynArrayInPlace<PROPID> _apidReal; // The 'real' propids are stored here.
|
||
|
PPidConverter * _pPidConverter; // Can convert FULLPROPSPEC to PROPID
|
||
|
};
|
||
|
|
||
|
DECLARE_SMARTP( PidMapper );
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CPidMapperWithNames
|
||
|
//
|
||
|
// Purpose: Maps 'fake' pid <--> property name. Includes associated
|
||
|
// 'friendly' name.
|
||
|
//
|
||
|
// History: 09 Dec 96 Alanw Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
class CPidMapperWithNames : public CPidMapper
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
CPidMapperWithNames( unsigned size = 0 );
|
||
|
|
||
|
void SetFriendlyName( PROPID pid, WCHAR const * pwszName );
|
||
|
|
||
|
WCHAR const * GetFriendlyName( PROPID pid ) const;
|
||
|
|
||
|
inline void Clear( );
|
||
|
|
||
|
private:
|
||
|
|
||
|
CDynArray<WCHAR> _apwszNames;
|
||
|
};
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CSimplePidRemapper
|
||
|
//
|
||
|
// Purpose: A simple pid remapper which does not need a catalog. It is
|
||
|
// used during filtering to support translation of fake pids
|
||
|
// to real pids and nothing else.
|
||
|
//
|
||
|
// History: 1-02-97 srikants Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CSimplePidRemapper
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
CSimplePidRemapper() : _cpidReal(0)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
PROPID FakeToReal( PROPID pid ) const
|
||
|
{
|
||
|
if ( pid < _cpidReal )
|
||
|
return( _xaPidReal[pid] );
|
||
|
else
|
||
|
return( pidInvalid );
|
||
|
}
|
||
|
|
||
|
void Set( XArray<PROPID> & aPids )
|
||
|
{
|
||
|
_xaPidReal.Free();
|
||
|
|
||
|
_cpidReal = aPids.Count();
|
||
|
_xaPidReal.Set( _cpidReal, aPids.Acquire() );
|
||
|
}
|
||
|
|
||
|
unsigned GetCount() const { return _cpidReal; }
|
||
|
|
||
|
const PROPID * GetPropidArray() const { return _xaPidReal.GetPointer(); }
|
||
|
|
||
|
private:
|
||
|
|
||
|
unsigned _cpidReal;
|
||
|
XArray<PROPID> _xaPidReal;
|
||
|
|
||
|
};
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPidMapper::CPidMapper, public
|
||
|
//
|
||
|
// Synopsis: Create pid mapping object
|
||
|
//
|
||
|
// History: 13-Jan-93 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
inline CPidMapper::CPidMapper( PPidConverter * pPidConverter )
|
||
|
: _pPidConverter( pPidConverter )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPidMapper::CPidMapper, public
|
||
|
//
|
||
|
// Synopsis: Create pid mapping object
|
||
|
//
|
||
|
// Arguments: [cPids] - initial size of property array
|
||
|
//
|
||
|
// History: 13-Jan-93 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
inline CPidMapper::CPidMapper( unsigned cPids, PPidConverter * pPidConverter )
|
||
|
: CPropNameArray( cPids ),
|
||
|
_pPidConverter( pPidConverter ),
|
||
|
_apidReal( cPids )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPidMapper::CPidMapper, public
|
||
|
//
|
||
|
// Synopsis: Create pid mapping object
|
||
|
//
|
||
|
// Arguments: [stm] - stream from which a marshalled property array is read
|
||
|
//
|
||
|
// History: 13-Jan-93 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
inline CPidMapper::CPidMapper( PDeSerStream & stm, PPidConverter * pPidConverter )
|
||
|
: CPropNameArray( stm ),
|
||
|
_apidReal( Count() ),
|
||
|
_pPidConverter( pPidConverter )
|
||
|
{
|
||
|
for ( unsigned i = 0; i < Count(); i++ )
|
||
|
_apidReal[i] = pidInvalid;
|
||
|
}
|
||
|
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPidMapper::PidToName, public
|
||
|
//
|
||
|
// Arguments: [pid] -- 'fake' property id
|
||
|
//
|
||
|
// Returns: 'real' property name for fake pid.
|
||
|
//
|
||
|
// History: 31-Jan-93 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
inline CFullPropSpec const * CPidMapper::PidToName( PROPID pid ) const
|
||
|
{
|
||
|
return( Get( pid ) );
|
||
|
}
|
||
|
|
||
|
|
||
|
inline PROPID CPidMapper::NameToPid( FULLPROPSPEC const & Property )
|
||
|
{
|
||
|
return( NameToPid( (CFullPropSpec const &)Property ) );
|
||
|
}
|
||
|
|
||
|
// NOTE: This needs to change if DBID becomes something
|
||
|
// other than a CFullPropSpec.
|
||
|
//
|
||
|
inline PROPID CPidMapper::NameToPid( DBID const & Property )
|
||
|
{
|
||
|
return( NameToPid( (CFullPropSpec const &)Property ) );
|
||
|
}
|
||
|
|
||
|
inline void CPidMapper::Clear( )
|
||
|
{
|
||
|
CPropNameArray::Clear();
|
||
|
|
||
|
Win4Assert( Count() == 0 );
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPidMapper::SetPidConverter, public
|
||
|
//
|
||
|
// Synopsis: Set (or clear) pid converter
|
||
|
//
|
||
|
// Arguments: [pPidConverter] -- Pid converter
|
||
|
//
|
||
|
// History: 30-Dec-97 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
inline void CPidMapper::SetPidConverter( PPidConverter * pPidConverter )
|
||
|
{
|
||
|
Win4Assert( 0 == _pPidConverter || 0 == pPidConverter );
|
||
|
_pPidConverter = pPidConverter;
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPidMapper::RealToFake, public
|
||
|
//
|
||
|
// Arguments: [pid] -- Real pid (not index into array)
|
||
|
//
|
||
|
// Returns: Fake pid (index into array)
|
||
|
//
|
||
|
// History: 30-Dec-97 KyleP Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
inline PROPID CPidMapper::RealToFake( PROPID pid ) const
|
||
|
{
|
||
|
//
|
||
|
// Assume this array is small, and linear search it.
|
||
|
//
|
||
|
|
||
|
for ( PROPID pidFake = 0; pidFake < Count() && pid != _apidReal[pidFake]; pidFake++)
|
||
|
continue; // Null body
|
||
|
|
||
|
if ( pidFake == Count() )
|
||
|
pidFake = 0xFFFFFFFF;
|
||
|
|
||
|
return pidFake;
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPidMapperWithNames::CPidMapperWithNames, public
|
||
|
//
|
||
|
// Synopsis: Create pid mapping with names object
|
||
|
//
|
||
|
// Arguments: [cPids] - initial size of property array
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
inline CPidMapperWithNames::CPidMapperWithNames( unsigned cPids )
|
||
|
: CPidMapper( cPids ),
|
||
|
_apwszNames( 0 )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
inline void CPidMapperWithNames::SetFriendlyName(
|
||
|
PROPID pid,
|
||
|
WCHAR const * pwszName )
|
||
|
{
|
||
|
delete _apwszNames.Acquire(pid);
|
||
|
if (pwszName)
|
||
|
{
|
||
|
unsigned cch = wcslen(pwszName) + 1;
|
||
|
XArray<WCHAR> pwszNewName(cch);
|
||
|
RtlCopyMemory(pwszNewName.GetPointer(), pwszName, cch * sizeof (WCHAR));
|
||
|
_apwszNames.Add( pwszNewName.GetPointer(), pid);
|
||
|
pwszNewName.Acquire();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
inline WCHAR const * CPidMapperWithNames::GetFriendlyName( PROPID pid ) const
|
||
|
{
|
||
|
return (pid < _apwszNames.Size()) ? _apwszNames[pid] : 0;
|
||
|
}
|
||
|
|
||
|
inline void CPidMapperWithNames::Clear( )
|
||
|
{
|
||
|
_apwszNames.Clear();
|
||
|
CPidMapper::Clear();
|
||
|
}
|
||
|
|