#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 #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 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 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