windows-nt/Source/XPSP1/NT/shell/ext/brfcase/filesync/syncui/cpath.c

215 lines
5.1 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
//---------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation 1993-1994
//
// File: cpath.c
//
// This files contains code for the cached briefcase paths.
//
// History:
// 01-31-94 ScottH Created
//
//---------------------------------------------------------------------------
///////////////////////////////////////////////////// INCLUDES
#include "brfprv.h" // common headers
CACHE g_cacheCPATH = {0, 0, 0}; // Briefcase path cache
#define CPATH_EnterCS() EnterCriticalSection(&g_cacheCPATH.cs)
#define CPATH_LeaveCS() LeaveCriticalSection(&g_cacheCPATH.cs)
#ifdef DEBUG
/*----------------------------------------------------------
Purpose: Dumps a CPATH entry
Returns:
Cond: --
*/
void PRIVATE CPATH_DumpEntry(
CPATH * pcpath)
{
ASSERT(pcpath);
TRACE_MSG(TF_ALWAYS, TEXT("CPATH: Atom %d: %s"), pcpath->atomPath, Atom_GetName(pcpath->atomPath));
TRACE_MSG(TF_ALWAYS, TEXT(" Ref [%u] "),
Cache_GetRefCount(&g_cacheCPATH, pcpath->atomPath));
}
/*----------------------------------------------------------
Purpose: Dumps all CPATH cache
Returns:
Cond: --
*/
void PUBLIC CPATH_DumpAll()
{
CPATH * pcpath;
int atom;
BOOL bDump;
ENTEREXCLUSIVE()
{
bDump = IsFlagSet(g_uDumpFlags, DF_CPATH);
}
LEAVEEXCLUSIVE()
if (!bDump)
return ;
atom = Cache_FindFirstKey(&g_cacheCPATH);
while (atom != ATOM_ERR)
{
pcpath = Cache_GetPtr(&g_cacheCPATH, atom);
ASSERT(pcpath);
if (pcpath)
{
CPATH_DumpEntry(pcpath);
Cache_DeleteItem(&g_cacheCPATH, atom, FALSE, NULL, CPATH_Free); // Decrement count
}
atom = Cache_FindNextKey(&g_cacheCPATH, atom);
}
}
#endif
/*----------------------------------------------------------
Purpose: Release the volume ID handle
Returns: --
Cond: hwndOwner is not used.
This function is serialized by the caller (Cache_Term or
Cache_DeleteItem).
*/
void CALLBACK CPATH_Free(
LPVOID lpv,
HWND hwndOwner)
{
CPATH * pcpath = (CPATH *)lpv;
DEBUG_CODE( TRACE_MSG(TF_CACHE, TEXT("CPATH Freeing Briefcase path %s"), Atom_GetName(pcpath->atomPath)); )
// Delete the atom one extra time, because we explicitly added
// it for this cache.
Atom_Delete(pcpath->atomPath);
SharedFree(&pcpath);
}
/*----------------------------------------------------------
Purpose: Add the atomPath to the cache.
If atomPath is already in the cache, we replace it
with a newly obtained path.
Returns: Pointer to CPATH
NULL on OOM
Cond: --
*/
CPATH * PUBLIC CPATH_Replace(
int atomPath)
{
CPATH * pcpath;
BOOL bJustAllocd;
CPATH_EnterCS();
{
pcpath = Cache_GetPtr(&g_cacheCPATH, atomPath);
if (pcpath)
bJustAllocd = FALSE;
else
{
// Allocate using commctrl's Alloc, so the structure will be in
// shared heap space across processes.
pcpath = SharedAllocType(CPATH);
bJustAllocd = TRUE;
}
if (pcpath)
{
LPCTSTR pszPath = Atom_GetName(atomPath);
ASSERT(pszPath);
DEBUG_CODE( TRACE_MSG(TF_CACHE, TEXT("CPATH Adding known Briefcase %s"), pszPath); )
pcpath->atomPath = atomPath;
if (bJustAllocd)
{
if (!Cache_AddItem(&g_cacheCPATH, atomPath, (LPVOID)pcpath))
{
// Cache_AddItem failed here
//
SharedFree(&pcpath);
}
}
else
Cache_DeleteItem(&g_cacheCPATH, atomPath, FALSE, NULL, CPATH_Free); // Decrement count
}
}
CPATH_LeaveCS();
return pcpath;
}
/*----------------------------------------------------------
Purpose: Search for the given path in the cache. If the path
exists, its locality will be returned.
If it is not found, its locality is not known (but
PL_FALSE is returned).
Returns: path locality (PL_) value
Cond: --
*/
UINT PUBLIC CPATH_GetLocality(
LPCTSTR pszPath,
LPTSTR pszBuf) // Can be NULL, or must be MAXPATHLEN
{
UINT uRet = PL_FALSE;
LPCTSTR pszBrf;
int atom;
ASSERT(pszPath);
CPATH_EnterCS();
{
atom = Cache_FindFirstKey(&g_cacheCPATH);
while (atom != ATOM_ERR)
{
pszBrf = Atom_GetName(atom);
ASSERT(pszBrf);
if (IsSzEqual(pszBrf, pszPath))
{
uRet = PL_ROOT;
break;
}
else if (PathIsPrefix(pszBrf, pszPath))
{
uRet = PL_INSIDE;
break;
}
atom = Cache_FindNextKey(&g_cacheCPATH, atom);
}
if (uRet != PL_FALSE && pszBuf)
lstrcpy(pszBuf, pszBrf);
}
CPATH_LeaveCS();
return uRet;
}