215 lines
5.1 KiB
C
215 lines
5.1 KiB
C
|
//---------------------------------------------------------------------------
|
||
|
//
|
||
|
// 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;
|
||
|
}
|
||
|
|
||
|
|
||
|
|