//+------------------------------------------------------------------------- // // 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 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 _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 _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 & 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 _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 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(); }