windows-nt/Source/XPSP1/NT/inetsrv/query/cicat/scpfixup.hxx
2020-09-26 16:20:57 +08:00

160 lines
4.9 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1998.
//
// File: scpfixup.hxx
//
// Contents: Scope fixup classes to translate local paths to uncs that
// remote machines can reference.
//
// History: 17-Oct-96 dlee created
//
//----------------------------------------------------------------------------
#pragma once
//+---------------------------------------------------------------------------
//
// Class: CScopeFixupElem
//
// Purpose: An element in the scope fixup table
//
// History: 17-Oct-96 dlee created
//
//----------------------------------------------------------------------------
class CScopeFixupElem
{
public:
CScopeFixupElem( WCHAR const * pwcScope,
WCHAR const * pwcFixup ) :
_scope( pwcScope ),
_fixup( pwcFixup ),
_fSeen( TRUE )
{
_scope.AppendBackSlash();
_fixup.AppendBackSlash();
}
BOOL IsMatch( CLowcaseBuf const & orig ) const
{
return ( orig.Length() >= _scope.Length() ) &&
( RtlEqualMemory( orig.Get(),
_scope.Get(),
_scope.Length() * sizeof WCHAR ) );
}
BOOL IsExactMatch( CScopeFixupElem const & orig ) const
{
return ( orig._scope.Length() == _scope.Length() ) &&
( RtlEqualMemory( orig._scope.Get(),
_scope.Get(),
_scope.Length() * sizeof WCHAR ) ) &&
( orig._fixup.Length() == _fixup.Length() ) &&
( RtlEqualMemory( orig._fixup.Get(),
_fixup.Get(),
_fixup.Length() * sizeof WCHAR ) );
}
BOOL IsInverseMatch( CLowerFunnyPath & lcaseFunnyPath ) const
{
return ( ( lcaseFunnyPath.GetActualLength() >= _fixup.Length() ) &&
( RtlEqualMemory( lcaseFunnyPath.GetActualPath(),
_fixup.Get(),
_fixup.Length() * sizeof WCHAR ) ) ) ||
( ( lcaseFunnyPath.GetActualLength() == ( _fixup.Length() - 1 ) ) &&
( RtlEqualMemory( lcaseFunnyPath.GetActualPath(),
_fixup.Get(),
lcaseFunnyPath.GetActualLength() * sizeof WCHAR ) ) );
}
unsigned Fixup( CLowcaseBuf const & orig,
WCHAR * pwcResult,
unsigned cwcResult ) const
{
unsigned cwcPrefix = _fixup.Length();
unsigned cwcTail = 1 + orig.Length() - _scope.Length();
if ( cwcResult < ( cwcPrefix + cwcTail ) )
return cwcPrefix + cwcTail;
RtlCopyMemory( pwcResult,
_fixup.Get(),
cwcPrefix * sizeof WCHAR );
RtlCopyMemory( pwcResult + _fixup.Length(),
orig.Get() + _scope.Length(),
cwcTail * sizeof WCHAR );
return cwcPrefix + cwcTail - 1;
} //Fixup
void InverseFixup( CLowerFunnyPath & lcaseFunnyPath ) const
{
unsigned cwcPrefix = _scope.Length();
unsigned cwcTail = lcaseFunnyPath.GetActualLength() - _fixup.Length();
XGrowable<WCHAR> xTemp( cwcPrefix + cwcTail + 1 );
RtlCopyMemory( xTemp.Get(),
_scope.Get(),
cwcPrefix * sizeof WCHAR );
RtlCopyMemory( xTemp.Get() + _scope.Length(),
lcaseFunnyPath.GetActualPath() + _fixup.Length(),
( 1 + cwcTail ) * sizeof WCHAR );
lcaseFunnyPath.SetPath( xTemp.Get(), cwcPrefix + cwcTail, TRUE );
} //InverseFixup
CLowcaseBuf & GetScope() { return _scope; }
BOOL IsSeen() const { return _fSeen; }
void SetSeen() { _fSeen = TRUE; }
void ClearSeen() { _fSeen = FALSE; }
private:
BOOL _fSeen;
CLowcaseBuf _scope;
CLowcaseBuf _fixup;
};
//+---------------------------------------------------------------------------
//
// Class: CScopeFixup
//
// Purpose: The scope fixup table.
//
// History: 17-Oct-96 dlee created
//
//----------------------------------------------------------------------------
class CScopeFixup
{
public:
CScopeFixup() { }
void Add( WCHAR const * pwcScope, WCHAR const * pwcFixup );
void Remove( WCHAR const * pwcScope, WCHAR const * pwcFixup );
BOOL IsExactMatch( WCHAR const * pwcScope, WCHAR const * pwcFixup );
unsigned Fixup( WCHAR const * pwcOriginal,
WCHAR * pwcResult,
unsigned cwcResult,
unsigned cSkip );
void InverseFixup( CLowerFunnyPath & lcaseFunnyPath );
void BeginSeen();
void EndSeen();
private:
CCountedDynArray<CScopeFixupElem> _aElems;
CReadWriteAccess _rwLock;
};