windows-nt/Source/XPSP1/NT/drivers/ftapi/ftman/item.cpp
2020-09-26 16:20:57 +08:00

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 );
}