/*++ Copyright (c) 1998 Microsoft Corporation Module Name: FTMan File Name: Item.cpp Abstract: The implementation of class CItemData. A generic base class to store the data of items from the tree control of CFTTreeView and from the list control of CFTListView Author: Cristian Teodorescu November 3, 1998 Notes: Revision History: --*/ #include "stdafx.h" #include "FrSpace.h" #include "Item.h" #include "LogVol.h" #include "PhPart.h" #include "Resource.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CItemData IMPLEMENT_DYNAMIC(CItemData, CObject) // Constructor CItemData::CItemData( ITEM_TYPE wItemType, CItemData* pParentData /* = NULL */, BOOL bIsRootVolume /* = FALSE */) : m_wItemType(wItemType), m_bIsRootVolume(bIsRootVolume), m_ulNumMembers(0), m_cDriveLetter(_T('\0')), m_bIoOK(FALSE), m_nMemberStatus(FtMemberHealthy), m_bValid(FALSE), m_iImage(II_PhysicalPartition_Error),m_pParentData( pParentData ), m_hTreeItem(NULL), m_nListItem(-1), m_bAreMembersInserted(FALSE) { } // Copy constructor CItemData::CItemData( CItemData& rData ) : m_wItemType(rData.m_wItemType), m_ulNumMembers(rData.m_ulNumMembers), m_cDriveLetter(rData.m_cDriveLetter), m_strVolumeName( rData.m_strVolumeName ), m_bIoOK(rData.m_bIoOK), m_nMemberStatus( rData.m_nMemberStatus ), m_bIsRootVolume(rData.m_bIsRootVolume), m_bValid( rData.m_bValid ), m_iImage(rData.m_iImage), m_pParentData(rData.m_pParentData ), m_hTreeItem(rData.m_hTreeItem), m_nListItem(rData.m_nListItem), m_bAreMembersInserted(rData.m_bAreMembersInserted) { MY_TRY m_arrMountPaths.RemoveAll(); for( int i = 0; i < rData.m_arrMountPaths.GetSize(); i++ ) m_arrMountPaths.Add(rData.m_arrMountPaths.GetAt(i)); m_setDisks = rData.m_setDisks; MY_CATCH_AND_THROW } //////////////////////////////////////////////////////////////////////////////////////////////////// // Public methods void CItemData::GetDisplayVolumeID( CString& strDisplay) const { MY_TRY FT_LOGICAL_DISK_ID llVolID; if( GetVolumeID(llVolID) ) strDisplay.Format(_T("%I64X"), llVolID ); else strDisplay = _T(""); MY_CATCH_AND_THROW } void CItemData::GetDisplaySize( CString& strDisplay) const { MY_TRY LONGLONG llSize; if( GetSize(llSize) ) ::FormatVolumeSize( strDisplay, llSize ); else strDisplay = _T(""); MY_CATCH_AND_THROW } void CItemData::GetDisplayDisksSet( CString& strDisplay ) const { MY_TRY strDisplay = _T(""); for( int i = 0; i < m_setDisks.GetSize(); i++ ) { CString strDisk; if( i > 0 ) strDisk.Format(_T(",%lu"), m_setDisks[i] ); else strDisk.Format(_T("%lu"), m_setDisks[i] ); strDisplay += strDisk; } MY_CATCH_AND_THROW } void CItemData::GetDisplayOffset( CString& strDisplay) const { MY_TRY LONGLONG llOffset; if( GetOffset(llOffset) ) ::FormatVolumeSize( strDisplay, llOffset ); else strDisplay = _T(""); MY_CATCH_AND_THROW } //////////////////////////////////////////////////////////////////////////////////////////////////// // Protected methods BOOL CItemData::ReadDriveLetterAndVolumeName() { MY_TRY m_cDriveLetter = _T('\0'); m_strVolumeName = _T(""); m_arrMountPaths.RemoveAll(); if( !IsRootVolume() ) return TRUE; CString strNTName; if( !RetrieveNTName( strNTName ) ) return FALSE; if( !QueryDriveLetterAndVolumeName( strNTName, m_cDriveLetter, m_strVolumeName ) ) return FALSE; return TRUE; MY_CATCH_AND_THROW } /* Add a error message to a string .The error message will be formatted like this: < My error message > [ System error message ] */ void CItemData::AddError( CString& strErrors, UINT unErrorMsg, BOOL bAddSystemMsg /* =FALSE */ ) { MY_TRY CString str, strName, strErr, strSystemErr; // Get system error message if( bAddSystemMsg ) { LPVOID lpMsgBuf; if( ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL ) ) // Process any inserts in lpMsgBuf. { strSystemErr = (LPCTSTR)lpMsgBuf; LocalFree( lpMsgBuf ); } } // Get the name of the item GetDisplayName(strName); // Get my error message strErr.LoadString(unErrorMsg); str.Format(_T("%s: %s %s\n"), strName, strErr, strSystemErr ); strErrors += str; MY_CATCH_AND_THROW } //////////////////////////////////////////////////////////////////////////////////////////////////// // Class CItemID // Constructor for a root item ID CItemID::CItemID() : m_wItemType( IT_RootVolumes) { } CItemID::CItemID( const CItemData& rData ) { Load( rData ); } void CItemID::Load( const CItemData& rData ) { m_wItemType = rData.GetItemType(); switch( m_wItemType ) { case IT_RootVolumes: break; case IT_LogicalVolume: m_ID.m_LogicalVolumeID.m_llVolID = ((CLogicalVolumeData*)(&rData))->m_llVolID; break; case IT_PhysicalPartition: m_ID.m_PhysicalPartitionID.m_ulDiskNumber = ((CPhysicalPartitionData*)(&rData))->m_dwDiskNumber; m_ID.m_PhysicalPartitionID.m_llOffset = ((CPhysicalPartitionData*)(&rData))->m_PartInfo.StartingOffset.QuadPart; break; case IT_RootFreeSpaces: break; case IT_FreeSpace: m_ID.m_FreeSpaceID.m_ulDiskNumber = ((CFreeSpaceData*)(&rData))->m_dwDiskNumber; m_ID.m_FreeSpaceID.m_llOffset = ((CFreeSpaceData*)(&rData))->m_llOffset; break; default: ASSERT(FALSE); } } BOOL CItemID::operator==( const CItemID& id ) const { if( m_wItemType == id.m_wItemType ) { switch( m_wItemType ) { case IT_RootVolumes: return TRUE; case IT_LogicalVolume: return ( m_ID.m_LogicalVolumeID.m_llVolID == id.m_ID.m_LogicalVolumeID.m_llVolID ); case IT_PhysicalPartition: return (( m_ID.m_PhysicalPartitionID.m_ulDiskNumber == id.m_ID.m_PhysicalPartitionID.m_ulDiskNumber ) && ( m_ID.m_PhysicalPartitionID.m_llOffset == id.m_ID.m_PhysicalPartitionID.m_llOffset ) ); case IT_RootFreeSpaces: return TRUE; case IT_FreeSpace: return (( m_ID.m_FreeSpaceID.m_ulDiskNumber == id.m_ID.m_FreeSpaceID.m_ulDiskNumber ) && ( m_ID.m_FreeSpaceID.m_llOffset == id.m_ID.m_FreeSpaceID.m_llOffset ) ); default: ASSERT(FALSE); } } return FALSE; } BOOL CItemID::operator>( const CItemID& id ) const { if( m_wItemType == id.m_wItemType ) { switch( m_wItemType ) { case IT_RootVolumes: return FALSE; case IT_LogicalVolume: return ( m_ID.m_LogicalVolumeID.m_llVolID > id.m_ID.m_LogicalVolumeID.m_llVolID ); case IT_PhysicalPartition: if( m_ID.m_PhysicalPartitionID.m_ulDiskNumber == id.m_ID.m_PhysicalPartitionID.m_ulDiskNumber ) return ( m_ID.m_PhysicalPartitionID.m_llOffset > id.m_ID.m_PhysicalPartitionID.m_llOffset ); return ( m_ID.m_PhysicalPartitionID.m_ulDiskNumber > id.m_ID.m_PhysicalPartitionID.m_ulDiskNumber ); case IT_RootFreeSpaces: return FALSE; case IT_FreeSpace: if( m_ID.m_FreeSpaceID.m_ulDiskNumber == id.m_ID.m_FreeSpaceID.m_ulDiskNumber ) return ( m_ID.m_FreeSpaceID.m_llOffset > id.m_ID.m_FreeSpaceID.m_llOffset ); return ( m_ID.m_FreeSpaceID.m_ulDiskNumber > id.m_ID.m_FreeSpaceID.m_ulDiskNumber ); default: ASSERT(FALSE); } } return ( m_wItemType > id.m_wItemType ); }