windows-nt/Source/XPSP1/NT/inetsrv/query/restrict/pidmap.cxx
2020-09-26 16:20:57 +08:00

202 lines
5 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 2002.
//
// File: pidmap.cxx
//
// Contents: Maps pid <--> property name.
//
// History: 31-Jan-93 KyleP Created
//
//--------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include <pidmap.hxx>
#include <coldesc.hxx>
IMPL_DYNARRAY( CPropNameArrayBase, CFullPropSpec );
//+-------------------------------------------------------------------------
//--------------------------------------------------------------------------
CPropNameArray::CPropNameArray(unsigned size)
: CPropNameArrayBase( size )
{
}
//+-------------------------------------------------------------------------
//--------------------------------------------------------------------------
void CPropNameArray::Marshall( PSerStream & stm ) const
{
//
// Compute # non-zero items
//
for ( unsigned len = 0; len < Size(); len++ )
{
if ( 0 == Get(len) )
break;
}
stm.PutULong( len );
for ( unsigned i = 0; i < len; i++ )
{
Get(i)->Marshall( stm );
}
}
//+-------------------------------------------------------------------------
//--------------------------------------------------------------------------
CPropNameArray::CPropNameArray( PDeSerStream & stm )
: CPropNameArrayBase( 0 )
{
ULONG cItems = stm.GetULong();
// Guard against attack
if ( 0 == cItems || cItems > 1000 )
THROW( CException( E_INVALIDARG ) );
SetExactSize( cItems );
for ( unsigned i = 0; i < cItems; i++ )
{
CFullPropSpec * pps = new CFullPropSpec( stm );
XPtr<CFullPropSpec> xpps(pps);
if ( xpps.IsNull() || !xpps->IsValid() )
{
THROW( CException( STATUS_NO_MEMORY ) );
}
Add( pps, i);
xpps.Acquire();
}
}
//+-------------------------------------------------------------------------
//
// Member: CPidMapper::NameToPid, public
//
// Arguments: [wcsProperty] -- Property name
//
// Returns: 'fake' (pid) for [wcsProperty].
//
// History: 31-Jan-93 KyleP Created
//
//--------------------------------------------------------------------------
PROPID CPidMapper::NameToPid( CFullPropSpec const & Property )
{
if ( !Property.IsValid() )
return pidInvalid;
//
// Just linear search the array. It should be small.
//
for ( int i = Count() - 1; i >= 0; i-- )
{
Win4Assert( Get(i) != 0 );
if ( *Get( i ) == Property )
{
return( i );
}
}
//
// Wasn't in array. Add.
//
CFullPropSpec * ppsFull = new CFullPropSpec( Property );
XPtr<CFullPropSpec> xpps(ppsFull);
if ( xpps.IsNull() || !xpps->IsValid() )
{
THROW( CException( STATUS_NO_MEMORY ) );
}
PROPID pidNew = Count();
Add( ppsFull, pidNew );
xpps.Acquire();
_apidReal[pidNew] = pidInvalid;
return pidNew;
}
//+-------------------------------------------------------------------------
//
// Member: CPidMapper::PidToRealPid, public
//
// Synopsis: Converts a fake (index) pid to real pid.
//
// Arguments: [pidFake] -- Fake (index) pid
//
// Returns: Real pid
//
// History: 30-Dec-1997 KyleP Created
//
//--------------------------------------------------------------------------
PROPID CPidMapper::PidToRealPid( PROPID pidFake )
{
if ( pidInvalid == _apidReal[pidFake] )
{
Win4Assert( 0 != _pPidConverter );
SCODE sc = _pPidConverter->FPSToPROPID( *Get(pidFake), _apidReal[pidFake] );
if ( FAILED(sc) )
{
THROW( CException( sc ) );
}
#if CIDBG == 1
if ( vqInfoLevel & DEB_ITRACE )
{
CFullPropSpec const & ps = *Get(pidFake);
GUID const & guid = ps.GetPropSet();
char szGuid[50];
sprintf( szGuid,
"%08lX-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X\\",
guid.Data1,
guid.Data2,
guid.Data3,
guid.Data4[0], guid.Data4[1],
guid.Data4[2], guid.Data4[3],
guid.Data4[4], guid.Data4[5],
guid.Data4[6], guid.Data4[7] );
vqDebugOut(( DEB_ITRACE, szGuid ));
if ( ps.IsPropertyName() )
vqDebugOut(( DEB_ITRACE | DEB_NOCOMPNAME,
"%ws ",
ps.GetPropertyName() ));
else
vqDebugOut(( DEB_ITRACE | DEB_NOCOMPNAME,
"0x%x ",
ps.GetPropertyPropid() ));
vqDebugOut(( DEB_ITRACE | DEB_NOCOMPNAME, " --> pid 0x%x\n",
_apidReal[pidFake] ));
}
#endif // CIDBG == 1
}
return _apidReal[pidFake];
}