windows-nt/Source/XPSP1/NT/shell/ext/brfcase/filesync/syncui/cvol.c
2020-09-26 16:20:57 +08:00

222 lines
5.4 KiB
C

//---------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation 1993-1994
//
// File: cvol.c
//
// This files contains code for the cached volume ID structs.
//
// History:
// 09-02-93 ScottH Created
// 01-31-94 ScottH Moved from cache.c
//
//---------------------------------------------------------------------------
///////////////////////////////////////////////////// INCLUDES
#include "brfprv.h" // common headers
///////////////////////////////////////////////////// TYPEDEFS
///////////////////////////////////////////////////// CONTROLLING DEFINES
///////////////////////////////////////////////////// DEFINES
///////////////////////////////////////////////////// MACROS
///////////////////////////////////////////////////// MODULE DATA
CACHE g_cacheCVOL = {0, 0, 0}; // Volume ID cache
///////////////////////////////////////////////////// Generic Cache Routines
#ifdef DEBUG
void PRIVATE CVOL_DumpEntry(
CVOL * pcvol)
{
ASSERT(pcvol);
TRACE_MSG(TF_ALWAYS, TEXT("CVOL: Atom %d: %s"), pcvol->atomPath, Atom_GetName(pcvol->atomPath));
TRACE_MSG(TF_ALWAYS, TEXT(" Ref [%u] Hvid = %lx"),
Cache_GetRefCount(&g_cacheCVOL, pcvol->atomPath),
pcvol->hvid);
}
void PUBLIC CVOL_DumpAll()
{
CVOL * pcvol;
int atom;
BOOL bDump;
ENTEREXCLUSIVE()
{
bDump = IsFlagSet(g_uDumpFlags, DF_CVOL);
}
LEAVEEXCLUSIVE()
if (!bDump)
return ;
atom = Cache_FindFirstKey(&g_cacheCVOL);
while (atom != ATOM_ERR)
{
pcvol = Cache_GetPtr(&g_cacheCVOL, atom);
ASSERT(pcvol);
if (pcvol)
{
CVOL_DumpEntry(pcvol);
Cache_DeleteItem(&g_cacheCVOL, atom, FALSE); // Decrement count
}
atom = Cache_FindNextKey(&g_cacheCVOL, atom);
}
}
#endif
/*----------------------------------------------------------
Purpose: Release the volume ID handle
Returns: --
Cond: --
*/
void CALLBACK CVOL_Free(
LPVOID lpv)
{
CVOL * pcvol = (CVOL *)lpv;
DEBUG_CODE( TRACE_MSG(TF_CACHE, TEXT("CVOL Releasing volume ID %s"), Atom_GetName(pcvol->atomPath)); )
ASSERT(Sync_IsEngineLoaded());
Sync_ReleaseVolumeIDHandle(pcvol->hvid);
SharedFree(&pcvol);
}
/*----------------------------------------------------------
Purpose: Add the atomPath to the cache. We add the volume ID.
If atomPath is already in the cache, we replace it
with a newly obtained volume ID.
Returns: Pointer to CVOL
NULL on OOM
Cond: --
*/
CVOL * PUBLIC CVOL_Replace(
int atomPath)
{
CVOL * pcvol;
BOOL bJustAllocd;
pcvol = Cache_GetPtr(&g_cacheCVOL, atomPath);
if (pcvol)
bJustAllocd = FALSE;
else
{
// Allocate using commctrl's Alloc, so the structure will be in
// shared heap space across processes.
pcvol = SharedAllocType(CVOL);
bJustAllocd = TRUE;
}
if (pcvol)
{
HVOLUMEID hvid;
LPCTSTR pszPath = Atom_GetName(atomPath);
ASSERT(pszPath);
DEBUG_CODE( TRACE_MSG(TF_CACHE, TEXT("CVOL Adding volume ID %s"), pszPath); )
if (Sync_GetVolumeIDHandle(pszPath, &hvid) != TR_SUCCESS)
{
if (bJustAllocd)
SharedFree(&pcvol);
else
Cache_DeleteItem(&g_cacheCVOL, atomPath, FALSE); // Decrement count
pcvol = NULL; // Fail
}
else
{
ENTEREXCLUSIVE()
{
pcvol->atomPath = atomPath;
pcvol->hvid = hvid;
}
LEAVEEXCLUSIVE()
if (bJustAllocd)
{
if (!Cache_AddItem(&g_cacheCVOL, atomPath, (LPVOID)pcvol))
{
// Cache_AddItem failed here
//
Sync_ReleaseVolumeIDHandle(hvid);
SharedFree(&pcvol);
}
}
else
Cache_DeleteItem(&g_cacheCVOL, atomPath, FALSE); // Decrement count
}
}
return pcvol;
}
/*----------------------------------------------------------
Purpose: Search for the given volume ID in the cache. Return
the atomKey if it exists, otherwise ATOM_ERR.
Returns: atom
ATOM_ERR if not found
Cond: --
*/
int PUBLIC CVOL_FindID(
HVOLUMEID hvid)
{
int atom;
CVOL * pcvol;
atom = Cache_FindFirstKey(&g_cacheCVOL);
while (atom != ATOM_ERR)
{
LPCTSTR pszPath = Atom_GetName(atom);
ASSERT(pszPath);
ENTEREXCLUSIVE()
{
pcvol = CVOL_Get(atom);
ASSERT(pcvol);
if (pcvol)
{
int nCmp;
Sync_CompareVolumeIDs(pcvol->hvid, hvid, &nCmp);
if (Sync_GetLastError() == TR_SUCCESS && nCmp == 0)
{
// We found it
CVOL_Delete(atom);
LEAVEEXCLUSIVE()
return atom;
}
CVOL_Delete(atom); // decrement count
}
}
LEAVEEXCLUSIVE()
atom = Cache_FindNextKey(&g_cacheCVOL, atom);
}
return ATOM_ERR;
}