160 lines
4.9 KiB
C++
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;
|
|
};
|
|
|