mirror of https://github.com/tongzx/nt5src
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.
200 lines
6.2 KiB
200 lines
6.2 KiB
#ifndef _INC_DSKQUOTA_OWNERLST_H
|
|
#define _INC_DSKQUOTA_OWNERLST_H
|
|
|
|
#ifndef _INC_DSKQUOTA_STRCLASS_H
|
|
# include "strclass.h"
|
|
#endif
|
|
|
|
#ifndef _INC_DSKQUOTA_CARRAY_H
|
|
# include "carray.h"
|
|
#endif
|
|
|
|
#ifndef _INC_DSKQUOTA_H
|
|
# include <dskquota.h>
|
|
#endif
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// The following classes are used in managing the list of files owned by
|
|
// one or more users selected for deletion from within the details view.
|
|
//
|
|
// COwnerList - A list of "owner" objects. Each representing one of the
|
|
// account selected for deletion from the details view.
|
|
//
|
|
// COwnerListEntry - A single entry in the COwnerList container. Each
|
|
// entry contains a pointer to the IDiskQuotaUser inteface of the
|
|
// file owner and an array of CStrings containing the names of the
|
|
// files owned by that user. A blank filename is considered "deleted".
|
|
//
|
|
// COwnerListFile - A simple derivation from CPath that adds a 'directory'
|
|
// boolean member. This allows us to easily handle the differences
|
|
// between files and folders in the UI. For all intents and purposes,
|
|
// instances of this class can be treated as a simple CPath object.
|
|
//
|
|
// COwnerListItemHandle - This is a simple class used to hide the encoding
|
|
// of the owner index and file index in a listview LPARAM value. The
|
|
// owner index is the index of the LV item's owner in the COwnerList
|
|
// container. The file index is the index of the item's filename in the
|
|
// owner's COwnerListEntry in the COwnerList container. Perfectly clear,
|
|
// right? Each listview item's LPARAM contains enough information
|
|
// (iOwner and iFile) to locate the owner and file information in the
|
|
// COwnerList container. This encoding was done for efficiency reasons.
|
|
// The encoding is currently 10 bits for iOwner (max of 1024) and 22
|
|
// bits for iFile (max of 4 meg). These values can be adjusted if
|
|
// the balance isn't quite right.
|
|
//
|
|
//
|
|
|
|
class COwnerListFile : public CPath
|
|
{
|
|
public:
|
|
COwnerListFile(void)
|
|
: m_bDirectory(false) { }
|
|
|
|
COwnerListFile(LPCTSTR pszFile, bool bDirectory)
|
|
: CPath(pszFile),
|
|
m_bDirectory(bDirectory) { }
|
|
|
|
bool IsDirectory(void) const
|
|
{ return m_bDirectory; }
|
|
|
|
private:
|
|
bool m_bDirectory;
|
|
};
|
|
|
|
|
|
class COwnerListEntry
|
|
{
|
|
public:
|
|
explicit COwnerListEntry(IDiskQuotaUser *pOwner);
|
|
~COwnerListEntry(void)
|
|
{ if (m_pOwner) m_pOwner->Release(); }
|
|
|
|
IDiskQuotaUser* GetOwner(void) const
|
|
{ m_pOwner->AddRef(); return m_pOwner; }
|
|
|
|
void GetOwnerName(CString *pstrOwner) const
|
|
{ *pstrOwner = m_strOwnerName; }
|
|
|
|
int AddFile(LPCTSTR pszFile, bool bDirectory);
|
|
|
|
void MarkFileDeleted(int iFile)
|
|
{ m_rgFiles[iFile].Empty(); }
|
|
|
|
bool IsFileDeleted(int iFile) const
|
|
{ return !!m_rgFiles[iFile].IsEmpty(); }
|
|
|
|
bool IsFileDirectory(int iFile) const
|
|
{ return m_rgFiles[iFile].IsDirectory(); }
|
|
|
|
void GetFileName(int iFile, CPath *pstrFile) const
|
|
{ m_rgFiles[iFile].GetFileSpec(pstrFile); }
|
|
|
|
void GetFolderName(int iFile, CPath *pstrFolder) const
|
|
{ m_rgFiles[iFile].GetPath(pstrFolder); }
|
|
|
|
void GetFileFullPath(int iFile, CPath *pstrFullPath) const
|
|
{ *pstrFullPath = m_rgFiles[iFile]; }
|
|
|
|
int FileCount(bool bIncludeDeleted = false);
|
|
|
|
#if DBG
|
|
void Dump(void) const;
|
|
#endif
|
|
|
|
private:
|
|
IDiskQuotaUser *m_pOwner; // Ptr to owner object.
|
|
CString m_strOwnerName; // Owner's name for display.
|
|
CArray<COwnerListFile> m_rgFiles; // Filenames for display.
|
|
|
|
//
|
|
// Prevent copy. Array makes it too expensive.
|
|
//
|
|
COwnerListEntry(const COwnerListEntry& rhs);
|
|
COwnerListEntry& operator = (const COwnerListEntry& rhs);
|
|
};
|
|
|
|
|
|
class COwnerList
|
|
{
|
|
public:
|
|
COwnerList(void) { }
|
|
~COwnerList(void);
|
|
|
|
int AddOwner(IDiskQuotaUser *pOwner);
|
|
|
|
IDiskQuotaUser *GetOwner(int iOwner) const;
|
|
|
|
void GetOwnerName(int iOwner, CString *pstrOwner) const
|
|
{ m_rgpOwners[iOwner]->GetOwnerName(pstrOwner); }
|
|
|
|
int AddFile(int iOwner, LPCTSTR pszFile, bool bDirectory)
|
|
{ return m_rgpOwners[iOwner]->AddFile(pszFile, bDirectory); }
|
|
|
|
void MarkFileDeleted(int iOwner, int iFile)
|
|
{ m_rgpOwners[iOwner]->MarkFileDeleted(iFile); }
|
|
|
|
bool IsFileDeleted(int iOwner, int iFile) const
|
|
{ return m_rgpOwners[iOwner]->IsFileDeleted(iFile); }
|
|
|
|
bool IsFileDirectory(int iOwner, int iFile) const
|
|
{ return m_rgpOwners[iOwner]->IsFileDirectory(iFile); }
|
|
|
|
void GetFileName(int iOwner, int iFile, CPath *pstrFile) const
|
|
{ m_rgpOwners[iOwner]->GetFileName(iFile, pstrFile); }
|
|
|
|
void GetFolderName(int iOwner, int iFile, CPath *pstrFolder) const
|
|
{ m_rgpOwners[iOwner]->GetFolderName(iFile, pstrFolder); }
|
|
|
|
void GetFileFullPath(int iOwner, int iFile, CPath *pstrFullPath) const
|
|
{ m_rgpOwners[iOwner]->GetFileFullPath(iFile, pstrFullPath); }
|
|
|
|
void Clear(void);
|
|
|
|
int FileCount(int iOwner = -1, bool bIncludeDeleted = false) const;
|
|
|
|
int OwnerCount(void) const
|
|
{ return m_rgpOwners.Count(); }
|
|
|
|
#if DBG
|
|
void Dump(void) const;
|
|
#endif
|
|
|
|
private:
|
|
CArray<COwnerListEntry *> m_rgpOwners;
|
|
|
|
//
|
|
// Prevent copy.
|
|
//
|
|
COwnerList(const COwnerList& rhs);
|
|
COwnerList& operator = (const COwnerList& rhs);
|
|
};
|
|
|
|
|
|
|
|
class COwnerListItemHandle
|
|
{
|
|
public:
|
|
explicit COwnerListItemHandle(int iOwner = -1, int iFile = -1)
|
|
: m_handle((iOwner & MASK) | ((iFile << SHIFT) & ~MASK)) { }
|
|
|
|
COwnerListItemHandle(LPARAM lParam)
|
|
: m_handle(lParam) { }
|
|
|
|
operator LPARAM() const
|
|
{ return m_handle; }
|
|
|
|
int OwnerIndex(void) const
|
|
{ return int(m_handle & MASK); }
|
|
|
|
int FileIndex(void) const
|
|
{ return int((m_handle >> SHIFT) & (~MASK >> SHIFT)); }
|
|
|
|
private:
|
|
LPARAM m_handle;
|
|
|
|
enum { MASK = 0x3FF, SHIFT = 10 };
|
|
};
|
|
|
|
|
|
|
|
#endif // _INC_DSKQUOTA_OWNERLST_H
|