304 lines
7.3 KiB
C++
304 lines
7.3 KiB
C++
|
/*++
|
||
|
|
||
|
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:
|
||
|
<Item identification: >< 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 );
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|