2025-04-27 07:49:33 -04:00

200 lines
5.1 KiB
C++

#ifndef __FSLOCK_H_
#define __FSLOCK_H_
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// CLOCKFS.H
//
// Declares the CLockFS object which inherits from CLock and uses
// a CInShLockData object to store information about the lock it represents.
//
// Copyright 2000 Microsoft Corporation, All Rights Reserved
//
// ========================================================================
//
// CLASS CLockFS
//
// Implements a lock object for the file system.
// Contains a file handle that has a particular type of access on the file.
// Inherits from CLock, which is a ref-countable class.
// Wraps CInShLockData that exists in shared memory and holds lock information.
//
class CLockFS : public CMTRefCounted
{
SharedPtr<CInShLockData> m_spSharedLockData;
// NOT IMPLEMENTED
//
CLockFS (const CLockFS&);
CLockFS& operator= (const CLockFS&);
LPCVOID GetOwnerSID()
{ return m_spSharedLockData->GetOwnerSID(); };
public:
CLockFS() {};
~CLockFS() {}; // autoptr will clean up the handle.
// HTTPEXT - SharedMemory functions
// =================================
SharedPtr<CInShLockData>& SharedData()
{ return m_spSharedLockData; };
// =======================================
// ACCESSORS
LPCWSTR GetResourceName() const
{ return m_spSharedLockData->GetResourceName(); }
const __int64* GetLockID() const
{ return m_spSharedLockData->GetLockID(); };
DWORD GetTimeoutInSecs() const
{ return m_spSharedLockData->GetTimeoutInSecs(); }
DWORD GetAccess() const
{ return m_spSharedLockData->GetAccess(); }
DWORD GetLockType() const
{ return m_spSharedLockData->GetLockType(); }
DWORD GetLockScope() const
{ return m_spSharedLockData->GetLockScope(); }
LPCWSTR PwszOwnerComment() const
{ return m_spSharedLockData->PwszOwnerComment(); }
// Lock token string
//
LPCWSTR GetLockTokenString() const
{
return m_spSharedLockData->GetLockTokenString();
}
// MANIPULATORS
//
// Set the timeout in seconds
//
void SetTimeout (DWORD dwSeconds)
{
m_spSharedLockData->SetTimeoutInSecs(dwSeconds);
}
VOID SendLockComment(LPMETHUTIL pmu) const;
DWORD DwCompareLockOwner (LPMETHUTIL pmu);
};
// ------------------------------------------------------------------------
//
// class CParseLockTokenHeader
//
// Takes in a Lock-Token header (you need to fetch the header & pre-check
// that it's not NULL) and provides parsing & iteration routines.
//
// Can also be instantiated over a If-[None-]State-Match header to
// do the state-token checking required.
//
// Implemented in lockutil.cpp
//
class CParseLockTokenHeader
{
// The big stuff
//
LPMETHUTIL m_pmu;
HDRITER_W m_hdr;
LPCSTR m_pszCurrent;
// State bits
BOOL m_fPathsSet : 1;
BOOL m_fTokensChecked : 1;
// Data for paths
UINT m_cwchPath;
auto_heap_ptr<WCHAR> m_pwszPath;
UINT m_cwchDest;
auto_heap_ptr<WCHAR> m_pwszDest;
// Count of locktokens provided
ULONG m_cTokens;
// Quick-access to single-locktoken data
LPCSTR m_pszToken;
// Data for multiple tokens
struct PATH_TOKEN
{
__int64 i64LockId;
BOOL fFetched; // TRUE = path & dwords below have been filled in.
LPCWSTR pwszPath;
DWORD dwLockType;
DWORD dwAccess;
};
auto_heap_ptr<PATH_TOKEN> m_pargPathTokens;
// m_cTokens tells how many valid structures we have.
// Fetch info about this lockid from the lock cache.
HRESULT HrFetchPathInfo (__int64 i64LockId, PATH_TOKEN * pPT);
// NOT IMPLEMENTED
//
CParseLockTokenHeader( const CParseLockTokenHeader& );
CParseLockTokenHeader& operator=( const CParseLockTokenHeader& );
public:
CParseLockTokenHeader (LPMETHUTIL pmu, LPCWSTR pwszHeader) :
m_pmu(pmu),
m_hdr(pwszHeader),
m_pszCurrent(NULL),
m_fPathsSet(FALSE),
m_fTokensChecked(FALSE),
m_cwchPath(0),
m_cwchDest(0),
m_cTokens(0),
m_pszToken(NULL)
{
Assert(m_pmu);
Assert(pwszHeader);
}
~CParseLockTokenHeader() {}
// Special test -- F if not EXACTLY ONE item in the header.
BOOL FOneToken();
// Feed the relevant paths to this lock token parser.
HRESULT SetPaths (LPCWSTR pwszPath, LPCWSTR pwszDest);
// Get the token string for a path WITH a certain kind of access.
HRESULT HrGetLockIdForPath (LPCWSTR pwszPath, DWORD dwAccess,
__int64 * pi64LockId,
BOOL fPathLookup = FALSE);
};
BOOL FLockViolation (LPMETHUTIL pmu,
HRESULT hr,
LPCWSTR pwszPath,
DWORD dwAccess);
BOOL FDeleteLock (LPMETHUTIL pmu, __int64 i64LockId);
HRESULT HrCheckStateHeaders (LPMETHUTIL pmu,
LPCWSTR pwszPath,
BOOL fGetMeth);
HRESULT HrLockIdFromString (LPMETHUTIL pmu,
LPCWSTR pwszToken,
__int64 * pi64LockId);
SCODE ScLockDiscoveryFromCLock (LPMETHUTIL pmu,
CXMLEmitter& emitter,
CEmitterNode& en,
CLockFS* pLock);
HRESULT HrGetLockProp (LPMETHUTIL pmu,
LPCWSTR wszPropName,
LPCWSTR wszResource,
RESOURCE_TYPE rtResource,
CXMLEmitter& emitter,
CEmitterNode& enParent);
#endif // __FSLOCK_H_ endif