//+--------------------------------------------------------------------------- // // 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 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 _aElems; CReadWriteAccess _rwLock; };