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.
392 lines
10 KiB
392 lines
10 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1994.
|
|
//
|
|
// File: spropmap.cxx
|
|
//
|
|
// Contents: Standard Property + Volatile Property mapper
|
|
//
|
|
// Classes: CStandardPropMapper
|
|
//
|
|
// History: 1-03-97 srikants Created (Moved code from qcat.cxx)
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include <pch.cxx>
|
|
#pragma hdrstop
|
|
|
|
#include <propspec.hxx>
|
|
#include <spropmap.hxx>
|
|
|
|
IMPL_DYNARRAY( CPropSpecArray, CPropSpecPidMap );
|
|
|
|
static const GUID guidDbBookmark = DBBMKGUID;
|
|
static const GUID guidDbSelf = DBSELFGUID;
|
|
static const GUID guidDbColumn = DBCIDGUID;
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: Constructor of the Standard property mapper.
|
|
//
|
|
// History: 1-03-97 srikants Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CStandardPropMapper::CStandardPropMapper()
|
|
: _pidNextAvailable( INIT_DOWNLEVEL_PID ),
|
|
_cps( 0 ),
|
|
_cRefs( 1 )
|
|
{
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CStandardPropMapper::StandardPropertyToPropId, protected
|
|
//
|
|
// Synopsis: Locate pid for standard properties
|
|
//
|
|
// Arguments: [ps] -- Property specification (name)
|
|
//
|
|
// Returns: The pid of [ps] if ps is one of the standard properties.
|
|
//
|
|
// History: 10 Jan 1996 Alanw Created
|
|
// 3 Jan 1997 Srikants Moved from CQCat
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
PROPID CStandardPropMapper::StandardPropertyToPropId(
|
|
CFullPropSpec const & ps )
|
|
{
|
|
if ( ps.IsPropertyName() )
|
|
return pidInvalid; // no name-based standard properties
|
|
|
|
PROPID pid = pidInvalid;
|
|
|
|
if ( ps.GetPropSet() == guidStorage )
|
|
{
|
|
if ( ps.IsPropertyPropid() )
|
|
{
|
|
pid = ps.GetPropertyPropid();
|
|
if (pid > PID_DICTIONARY && pid <= PID_STG_MAX)
|
|
{
|
|
pid = MK_CISTGPROPID(pid);
|
|
}
|
|
else if (pid == PID_SECURITY) // Note: overload PID_DICTIONARY
|
|
{
|
|
pid = pidSecurity;
|
|
}
|
|
}
|
|
}
|
|
else if ( ps.GetPropSet() == guidQuery )
|
|
{
|
|
if ( ps.IsPropertyPropid() )
|
|
{
|
|
switch( ps.GetPropertyPropid() )
|
|
{
|
|
case DISPID_QUERY_RANK:
|
|
pid = pidRank;
|
|
break;
|
|
|
|
case DISPID_QUERY_RANKVECTOR:
|
|
pid = pidRankVector;
|
|
break;
|
|
|
|
case DISPID_QUERY_HITCOUNT:
|
|
pid = pidHitCount;
|
|
break;
|
|
|
|
case DISPID_QUERY_WORKID:
|
|
pid = pidWorkId;
|
|
break;
|
|
|
|
case DISPID_QUERY_ALL:
|
|
pid = pidAll;
|
|
break;
|
|
|
|
case DISPID_QUERY_UNFILTERED:
|
|
pid = pidUnfiltered;
|
|
break;
|
|
|
|
case DISPID_QUERY_REVNAME:
|
|
pid = pidRevName;
|
|
break;
|
|
|
|
case DISPID_QUERY_VIRTUALPATH:
|
|
pid = pidVirtualPath;
|
|
break;
|
|
|
|
case DISPID_QUERY_LASTSEENTIME:
|
|
pid = pidLastSeenTime;
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
pid = pidInvalid;
|
|
}
|
|
}
|
|
}
|
|
else if ( ps.GetPropSet() == guidQueryMetadata )
|
|
{
|
|
if ( ps.IsPropertyPropid() )
|
|
{
|
|
switch( ps.GetPropertyPropid() )
|
|
{
|
|
case DISPID_QUERY_METADATA_VROOTUSED:
|
|
pid = pidVRootUsed;
|
|
break;
|
|
|
|
case DISPID_QUERY_METADATA_VROOTAUTOMATIC:
|
|
pid = pidVRootAutomatic;
|
|
break;
|
|
|
|
case DISPID_QUERY_METADATA_VROOTMANUAL:
|
|
pid = pidVRootManual;
|
|
break;
|
|
|
|
case DISPID_QUERY_METADATA_PROPGUID:
|
|
pid = pidPropertyGuid;
|
|
break;
|
|
|
|
case DISPID_QUERY_METADATA_PROPDISPID:
|
|
pid = pidPropertyDispId;
|
|
break;
|
|
|
|
case DISPID_QUERY_METADATA_PROPNAME:
|
|
pid = pidPropertyName;
|
|
break;
|
|
|
|
case DISPID_QUERY_METADATA_STORELEVEL:
|
|
pid = pidPropertyStoreLevel;
|
|
break;
|
|
|
|
case DISPID_QUERY_METADATA_PROPMODIFIABLE:
|
|
pid = pidPropDataModifiable;
|
|
break;
|
|
|
|
default:
|
|
pid = pidInvalid;
|
|
}
|
|
}
|
|
}
|
|
else if ( ps.GetPropSet() == guidDbColumn )
|
|
{
|
|
if (ps.GetPropertyPropid() < CDBCOLDISPIDS)
|
|
{
|
|
pid = MK_CIDBCOLPROPID( ps.GetPropertyPropid() );
|
|
}
|
|
}
|
|
else if ( ps.GetPropSet() == guidDbBookmark )
|
|
{
|
|
if (ps.GetPropertyPropid() < CDBBMKDISPIDS)
|
|
{
|
|
pid = MK_CIDBBMKPROPID( ps.GetPropertyPropid() );
|
|
}
|
|
}
|
|
else if ( ps.GetPropSet() == guidDbSelf )
|
|
{
|
|
if (ps.GetPropertyPropid() == PROPID_DBSELF_SELF)
|
|
{
|
|
pid = pidSelf;
|
|
}
|
|
}
|
|
|
|
return( pid );
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CStandardPropMapper::PropertyToPropId, public
|
|
//
|
|
// Synopsis: Locate pid for property
|
|
//
|
|
// Arguments: [ps] -- Property specification (name)
|
|
// [fCreate] -- TRUE if non-existent mapping should be created
|
|
//
|
|
// Returns: The pid of [ps].
|
|
//
|
|
// History: 28-Feb-1994 KyleP Created
|
|
// 30-Jun-1994 KyleP Added downlevel property support
|
|
// 03-Jan-1997 SrikantS Moved from CQCat
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
PROPID CStandardPropMapper::PropertyToPropId(
|
|
CFullPropSpec const & ps,
|
|
BOOL fCreate )
|
|
{
|
|
PROPID pid = StandardPropertyToPropId( ps );
|
|
|
|
if (pidInvalid == pid)
|
|
{
|
|
//
|
|
// Create pid good only for life of catalog.
|
|
//
|
|
|
|
//
|
|
// Have we seen this property before? Use linear search since
|
|
// we shouldn't have too many of these.
|
|
//
|
|
|
|
for ( unsigned i = 0; i < _cps; i++ )
|
|
{
|
|
if ( ps == _aps.Get(i)->PS() )
|
|
break;
|
|
}
|
|
|
|
if ( i < _cps )
|
|
{
|
|
pid = _aps.Get(i)->Pid();
|
|
}
|
|
else
|
|
{
|
|
pid = _pidNextAvailable++;
|
|
CPropSpecPidMap * ppm = new CPropSpecPidMap( ps, pid );
|
|
|
|
_aps.Add( ppm, _cps );
|
|
_cps++;
|
|
}
|
|
}
|
|
|
|
return pid;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CStandardPropMapper::AddRef
|
|
//
|
|
// Synopsis: Increments refcount
|
|
//
|
|
// History: 31-Jan-1997 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
ULONG STDMETHODCALLTYPE CStandardPropMapper::AddRef()
|
|
{
|
|
return InterlockedIncrement( (long *) &_cRefs );
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CStandardPropMapper::Release
|
|
//
|
|
// Synopsis: Decrement refcount. Delete if necessary.
|
|
//
|
|
// History: 31-Jan-1997 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
ULONG STDMETHODCALLTYPE CStandardPropMapper::Release()
|
|
{
|
|
Win4Assert( _cRefs > 0 );
|
|
|
|
ULONG uTmp = InterlockedDecrement( (long *) &_cRefs );
|
|
|
|
if ( 0 == uTmp )
|
|
delete this;
|
|
|
|
return uTmp;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CStandardPropMapper::QueryInterface
|
|
//
|
|
// Synopsis: Rebind to other interface
|
|
//
|
|
// Arguments: [riid] -- IID of new interface
|
|
// [ppvObject] -- New interface * returned here
|
|
//
|
|
// Returns: S_OK if bind succeeded, E_NOINTERFACE if bind failed
|
|
//
|
|
// History: 31-Jan-1997 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE STDMETHODCALLTYPE CStandardPropMapper::QueryInterface(
|
|
REFIID riid,
|
|
void ** ppvObject)
|
|
{
|
|
if ( 0 == ppvObject )
|
|
return E_INVALIDARG;
|
|
|
|
*ppvObject = 0;
|
|
|
|
if ( IID_IPropertyMapper == riid )
|
|
*ppvObject = (IUnknown *)(IPropertyMapper *) this;
|
|
else if ( IID_IUnknown == riid )
|
|
*ppvObject = (IUnknown *) this;
|
|
else
|
|
return E_NOINTERFACE;
|
|
|
|
AddRef();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CStandardPropMapper::PropertyToPropid
|
|
//
|
|
// Synopsis: Convert propspec to pid
|
|
//
|
|
// Arguments: [pFullPropSpec] -- propspec to convert
|
|
// [fCreate] -- Create property if not found ?
|
|
// [pPropId] -- pid returned here
|
|
//
|
|
// History: 31-Jan-1997 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE STDMETHODCALLTYPE CStandardPropMapper::PropertyToPropid( const FULLPROPSPEC *pFullPropSpec,
|
|
BOOL fCreate,
|
|
PROPID *pPropId)
|
|
{
|
|
SCODE sc = S_OK;
|
|
|
|
TRY
|
|
{
|
|
CFullPropSpec const * pProperty = (CFullPropSpec const *) pFullPropSpec;
|
|
*pPropId = PropertyToPropId( *pProperty, fCreate );
|
|
}
|
|
CATCH( CException, e )
|
|
{
|
|
sc = e.GetErrorCode();
|
|
|
|
vqDebugOut(( DEB_ERROR,
|
|
"CStandardPropMapper:PropertyToPropid - Exception caught 0x%x\n",
|
|
sc ));
|
|
}
|
|
END_CATCH;
|
|
|
|
return sc;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CStandardPropMapper::PropidToProperty
|
|
//
|
|
// Synopsis: Convert pid to propspec
|
|
//
|
|
// Arguments: [pPropId] -- pid to convert
|
|
// [pFullPropSpec] -- propspec returned here
|
|
//
|
|
// History: 31-Jan-1997 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
SCODE STDMETHODCALLTYPE CStandardPropMapper::PropidToProperty( PROPID propId,
|
|
FULLPROPSPEC **ppFullPropSpec )
|
|
{
|
|
Win4Assert( !"Not yet implemented" );
|
|
|
|
return E_NOTIMPL;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|