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.
265 lines
7.6 KiB
265 lines
7.6 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1996 - 1998.
|
|
//
|
|
// File: scpfixup.cxx
|
|
//
|
|
// Contents: Scope fixup classes to translate local paths to uncs that
|
|
// remote machines can reference.
|
|
//
|
|
// History: 09-Jun-1998 KyleP Moved out of header
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include <pch.cxx>
|
|
#pragma hdrstop
|
|
|
|
#include <scpfixup.hxx>
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CScopeFixup::Add, public
|
|
//
|
|
// Synopsis: Adds a new fixup to the list
|
|
//
|
|
// Arguments: [pwcScope] -- Source (local) scope (e.g. c:\)
|
|
// [pwcFixup] -- Fixed up scope (e.g. \\server\share\rootc)
|
|
//
|
|
// History: 09-Jun-1998 KyleP Added header
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
void CScopeFixup::Add( WCHAR const * pwcScope, WCHAR const * pwcFixup )
|
|
{
|
|
XPtr<CScopeFixupElem> xElem = new CScopeFixupElem( pwcScope,
|
|
pwcFixup );
|
|
|
|
CWriteAccess lock( _rwLock );
|
|
|
|
for ( unsigned i = 0; i < _aElems.Count(); i++ )
|
|
{
|
|
if ( _aElems[i]->IsMatch( xElem->GetScope() ) )
|
|
{
|
|
//
|
|
// Replace exact matching old fixup with new fixup
|
|
//
|
|
|
|
if ( _aElems[i]->IsExactMatch( xElem.GetReference() ) )
|
|
{
|
|
_aElems[i]->SetSeen();
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Move the original match down the list.
|
|
//
|
|
|
|
CScopeFixupElem * p = _aElems[i];
|
|
_aElems[i] = xElem.Acquire();
|
|
|
|
xElem.Set( p );
|
|
}
|
|
}
|
|
}
|
|
|
|
_aElems.Add( xElem.GetPointer(), _aElems.Count() );
|
|
xElem.Acquire();
|
|
} //Add
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CScopeFixup::Remove, public
|
|
//
|
|
// Synopsis: Removes a fixup from the list
|
|
//
|
|
// Arguments: [pwcScope] -- Source (local) scope (e.g. c:\)
|
|
// [pwcFixup] -- Fixed up scope (e.g. \\server\share\rootc)
|
|
//
|
|
// History: 09-Jun-1998 KyleP Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
void CScopeFixup::Remove( WCHAR const * pwcScope, WCHAR const * pwcFixup )
|
|
{
|
|
CScopeFixupElem Elem( pwcScope, pwcFixup );
|
|
|
|
CWriteAccess lock( _rwLock );
|
|
|
|
for ( unsigned i = 0; i < _aElems.Count(); i++ )
|
|
{
|
|
if ( _aElems[i]->IsExactMatch( Elem ) )
|
|
{
|
|
//
|
|
// Order-preserving delete
|
|
//
|
|
|
|
delete _aElems.AcquireAndShrinkAndPreserveOrder( i );
|
|
break;
|
|
}
|
|
}
|
|
} //Remove
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CScopeFixup::IsExactMatch, public
|
|
//
|
|
// Arguments: [pwcScope] -- Source (local) scope (e.g. c:\)
|
|
// [pwcFixup] -- Fixed up scope (e.g. \\server\share\rootc)
|
|
//
|
|
// Returns: TRUE if both the path and alias exactly match a currently
|
|
// registered pair.
|
|
//
|
|
// History: 09-Jun-1998 KyleP Added header
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
BOOL CScopeFixup::IsExactMatch( WCHAR const * pwcScope,
|
|
WCHAR const * pwcFixup )
|
|
{
|
|
CScopeFixupElem Elem( pwcScope, pwcFixup );
|
|
|
|
CReadAccess lock( _rwLock );
|
|
|
|
for ( unsigned i = 0; i < _aElems.Count(); i++ )
|
|
{
|
|
if ( _aElems[i]->IsExactMatch( Elem ) )
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
} //IsExactMatch
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CScopeFixup::Fixup, public
|
|
//
|
|
// Synopsis: Converts a local path to an aliased (fixed up) path
|
|
//
|
|
// Arguments: [pwcOriginal] -- Fixed up path (e.g. c:\foo.txt)
|
|
// [pwcResult] -- Fixed up path (e.g. \\server\share\foo.txt)
|
|
// [cwcResult] -- Size of [pwcResult]
|
|
// [cSkip] -- Skip this many matches
|
|
//
|
|
// Returns: Count of characters written to [pwcResult]
|
|
//
|
|
// History: 09-Jun-1998 KyleP Added header
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
unsigned CScopeFixup::Fixup( WCHAR const * pwcOriginal,
|
|
WCHAR * pwcResult,
|
|
unsigned cwcResult,
|
|
unsigned cSkip )
|
|
{
|
|
// the path is already lowercase -- don't copy or lowercase it.
|
|
|
|
CLowcaseBuf orig( pwcOriginal, TRUE );
|
|
|
|
{
|
|
// =========================================================
|
|
CReadAccess lock( _rwLock );
|
|
|
|
for ( unsigned i = 0; i < _aElems.Count(); i++ )
|
|
{
|
|
if ( _aElems[i]->IsMatch( orig ) )
|
|
{
|
|
if ( 0 == cSkip )
|
|
return _aElems[i]->Fixup( orig, pwcResult, cwcResult );
|
|
else
|
|
cSkip--;
|
|
}
|
|
}
|
|
// =========================================================
|
|
}
|
|
|
|
// no fixup available -- just copy the original
|
|
|
|
if ( cwcResult > orig.Length() )
|
|
{
|
|
RtlCopyMemory( pwcResult,
|
|
pwcOriginal,
|
|
( orig.Length() + 1 ) * sizeof WCHAR );
|
|
return orig.Length();
|
|
}
|
|
|
|
if ( 0 == cSkip )
|
|
return orig.Length() + 1;
|
|
else
|
|
return 0;
|
|
} //Fixup
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CScopeFixup::InverseFixup, public
|
|
//
|
|
// Synopsis: Converts a fixup to a source path.
|
|
//
|
|
// Arguments: [lcaseFunnyPath] -- Fixed up path (e.g. \\Server\Share\foo.txt)
|
|
// Local path (e.g. c:\foo.txt) is also returned here
|
|
//
|
|
// History: 09-Jun-1998 KyleP Added header
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
void CScopeFixup::InverseFixup( CLowerFunnyPath & lcaseFunnyPath )
|
|
{
|
|
CReadAccess lock( _rwLock );
|
|
|
|
|
|
for ( unsigned i = 0; i < _aElems.Count(); i++ )
|
|
{
|
|
if ( _aElems[i]->IsInverseMatch( lcaseFunnyPath ) )
|
|
{
|
|
_aElems[i]->InverseFixup( lcaseFunnyPath );
|
|
break;
|
|
}
|
|
}
|
|
|
|
} //InverseFixup
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CScopeFixup::BeginSeen, public
|
|
//
|
|
// Synopsis: Initiates 'seen processing' for fixups.
|
|
//
|
|
// History: 09-Jun-1998 KyleP Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
void CScopeFixup::BeginSeen()
|
|
{
|
|
CWriteAccess lock( _rwLock );
|
|
|
|
for ( unsigned i = 0; i < _aElems.Count(); i++ )
|
|
{
|
|
_aElems[i]->ClearSeen();
|
|
}
|
|
} //BeginSeen
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Member: CScopeFixup::EndSeen, public
|
|
//
|
|
// Synopsis: Removes any unreferenced fixups
|
|
//
|
|
// History: 09-Jun-1998 KyleP Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
void CScopeFixup::EndSeen()
|
|
{
|
|
CWriteAccess lock( _rwLock );
|
|
|
|
for ( unsigned i = 0; i < _aElems.Count(); i++ )
|
|
{
|
|
if ( !_aElems[i]->IsSeen() )
|
|
{
|
|
ciDebugOut(( DEB_ITRACE, "Removing fixup for: %ws\n", _aElems[i]->GetScope().Get() ));
|
|
|
|
delete _aElems.AcquireAndShrinkAndPreserveOrder(i);
|
|
}
|
|
}
|
|
} //EndSeen
|