Source code of Windows XP (NT5)
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.

303 lines
7.3 KiB

  1. /*++
  2. Copyright (c) 1998 Microsoft Corporation
  3. Module Name:
  4. FTMan
  5. File Name:
  6. Item.cpp
  7. Abstract:
  8. The implementation of class CItemData. A generic base class to store the data of items from the
  9. tree control of CFTTreeView and from the list control of CFTListView
  10. Author:
  11. Cristian Teodorescu November 3, 1998
  12. Notes:
  13. Revision History:
  14. --*/
  15. #include "stdafx.h"
  16. #include "FrSpace.h"
  17. #include "Item.h"
  18. #include "LogVol.h"
  19. #include "PhPart.h"
  20. #include "Resource.h"
  21. #ifdef _DEBUG
  22. #define new DEBUG_NEW
  23. #undef THIS_FILE
  24. static char THIS_FILE[] = __FILE__;
  25. #endif
  26. /////////////////////////////////////////////////////////////////////////////
  27. // CItemData
  28. IMPLEMENT_DYNAMIC(CItemData, CObject)
  29. // Constructor
  30. CItemData::CItemData( ITEM_TYPE wItemType, CItemData* pParentData /* = NULL */, BOOL bIsRootVolume /* = FALSE */) :
  31. m_wItemType(wItemType), m_bIsRootVolume(bIsRootVolume), m_ulNumMembers(0),
  32. m_cDriveLetter(_T('\0')), m_bIoOK(FALSE), m_nMemberStatus(FtMemberHealthy),
  33. m_bValid(FALSE), m_iImage(II_PhysicalPartition_Error),m_pParentData( pParentData ),
  34. m_hTreeItem(NULL), m_nListItem(-1), m_bAreMembersInserted(FALSE)
  35. {
  36. }
  37. // Copy constructor
  38. CItemData::CItemData( CItemData& rData ) :
  39. m_wItemType(rData.m_wItemType), m_ulNumMembers(rData.m_ulNumMembers),
  40. m_cDriveLetter(rData.m_cDriveLetter), m_strVolumeName( rData.m_strVolumeName ),
  41. m_bIoOK(rData.m_bIoOK), m_nMemberStatus( rData.m_nMemberStatus ),
  42. m_bIsRootVolume(rData.m_bIsRootVolume), m_bValid( rData.m_bValid ),
  43. m_iImage(rData.m_iImage), m_pParentData(rData.m_pParentData ),
  44. m_hTreeItem(rData.m_hTreeItem), m_nListItem(rData.m_nListItem),
  45. m_bAreMembersInserted(rData.m_bAreMembersInserted)
  46. {
  47. MY_TRY
  48. m_arrMountPaths.RemoveAll();
  49. for( int i = 0; i < rData.m_arrMountPaths.GetSize(); i++ )
  50. m_arrMountPaths.Add(rData.m_arrMountPaths.GetAt(i));
  51. m_setDisks = rData.m_setDisks;
  52. MY_CATCH_AND_THROW
  53. }
  54. ////////////////////////////////////////////////////////////////////////////////////////////////////
  55. // Public methods
  56. void CItemData::GetDisplayVolumeID( CString& strDisplay) const
  57. {
  58. MY_TRY
  59. FT_LOGICAL_DISK_ID llVolID;
  60. if( GetVolumeID(llVolID) )
  61. strDisplay.Format(_T("%I64X"), llVolID );
  62. else
  63. strDisplay = _T("");
  64. MY_CATCH_AND_THROW
  65. }
  66. void CItemData::GetDisplaySize( CString& strDisplay) const
  67. {
  68. MY_TRY
  69. LONGLONG llSize;
  70. if( GetSize(llSize) )
  71. ::FormatVolumeSize( strDisplay, llSize );
  72. else
  73. strDisplay = _T("");
  74. MY_CATCH_AND_THROW
  75. }
  76. void CItemData::GetDisplayDisksSet( CString& strDisplay ) const
  77. {
  78. MY_TRY
  79. strDisplay = _T("");
  80. for( int i = 0; i < m_setDisks.GetSize(); i++ )
  81. {
  82. CString strDisk;
  83. if( i > 0 )
  84. strDisk.Format(_T(",%lu"), m_setDisks[i] );
  85. else
  86. strDisk.Format(_T("%lu"), m_setDisks[i] );
  87. strDisplay += strDisk;
  88. }
  89. MY_CATCH_AND_THROW
  90. }
  91. void CItemData::GetDisplayOffset( CString& strDisplay) const
  92. {
  93. MY_TRY
  94. LONGLONG llOffset;
  95. if( GetOffset(llOffset) )
  96. ::FormatVolumeSize( strDisplay, llOffset );
  97. else
  98. strDisplay = _T("");
  99. MY_CATCH_AND_THROW
  100. }
  101. ////////////////////////////////////////////////////////////////////////////////////////////////////
  102. // Protected methods
  103. BOOL CItemData::ReadDriveLetterAndVolumeName()
  104. {
  105. MY_TRY
  106. m_cDriveLetter = _T('\0');
  107. m_strVolumeName = _T("");
  108. m_arrMountPaths.RemoveAll();
  109. if( !IsRootVolume() )
  110. return TRUE;
  111. CString strNTName;
  112. if( !RetrieveNTName( strNTName ) )
  113. return FALSE;
  114. if( !QueryDriveLetterAndVolumeName( strNTName, m_cDriveLetter, m_strVolumeName ) )
  115. return FALSE;
  116. return TRUE;
  117. MY_CATCH_AND_THROW
  118. }
  119. /*
  120. Add a error message to a string .The error message will be formatted like this:
  121. <Item identification: >< My error message > [ System error message ]
  122. */
  123. void CItemData::AddError( CString& strErrors, UINT unErrorMsg, BOOL bAddSystemMsg /* =FALSE */ )
  124. {
  125. MY_TRY
  126. CString str, strName, strErr, strSystemErr;
  127. // Get system error message
  128. if( bAddSystemMsg )
  129. {
  130. LPVOID lpMsgBuf;
  131. if( ::FormatMessage(
  132. FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
  133. NULL,
  134. GetLastError(),
  135. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  136. (LPTSTR) &lpMsgBuf,
  137. 0,
  138. NULL ) ) // Process any inserts in lpMsgBuf.
  139. {
  140. strSystemErr = (LPCTSTR)lpMsgBuf;
  141. LocalFree( lpMsgBuf );
  142. }
  143. }
  144. // Get the name of the item
  145. GetDisplayName(strName);
  146. // Get my error message
  147. strErr.LoadString(unErrorMsg);
  148. str.Format(_T("%s: %s %s\n"), strName, strErr, strSystemErr );
  149. strErrors += str;
  150. MY_CATCH_AND_THROW
  151. }
  152. ////////////////////////////////////////////////////////////////////////////////////////////////////
  153. // Class CItemID
  154. // Constructor for a root item ID
  155. CItemID::CItemID() : m_wItemType( IT_RootVolumes)
  156. {
  157. }
  158. CItemID::CItemID( const CItemData& rData )
  159. {
  160. Load( rData );
  161. }
  162. void CItemID::Load( const CItemData& rData )
  163. {
  164. m_wItemType = rData.GetItemType();
  165. switch( m_wItemType )
  166. {
  167. case IT_RootVolumes:
  168. break;
  169. case IT_LogicalVolume:
  170. m_ID.m_LogicalVolumeID.m_llVolID = ((CLogicalVolumeData*)(&rData))->m_llVolID;
  171. break;
  172. case IT_PhysicalPartition:
  173. m_ID.m_PhysicalPartitionID.m_ulDiskNumber = ((CPhysicalPartitionData*)(&rData))->m_dwDiskNumber;
  174. m_ID.m_PhysicalPartitionID.m_llOffset = ((CPhysicalPartitionData*)(&rData))->m_PartInfo.StartingOffset.QuadPart;
  175. break;
  176. case IT_RootFreeSpaces:
  177. break;
  178. case IT_FreeSpace:
  179. m_ID.m_FreeSpaceID.m_ulDiskNumber = ((CFreeSpaceData*)(&rData))->m_dwDiskNumber;
  180. m_ID.m_FreeSpaceID.m_llOffset = ((CFreeSpaceData*)(&rData))->m_llOffset;
  181. break;
  182. default:
  183. ASSERT(FALSE);
  184. }
  185. }
  186. BOOL CItemID::operator==( const CItemID& id ) const
  187. {
  188. if( m_wItemType == id.m_wItemType )
  189. {
  190. switch( m_wItemType )
  191. {
  192. case IT_RootVolumes:
  193. return TRUE;
  194. case IT_LogicalVolume:
  195. return ( m_ID.m_LogicalVolumeID.m_llVolID == id.m_ID.m_LogicalVolumeID.m_llVolID );
  196. case IT_PhysicalPartition:
  197. return (( m_ID.m_PhysicalPartitionID.m_ulDiskNumber == id.m_ID.m_PhysicalPartitionID.m_ulDiskNumber ) &&
  198. ( m_ID.m_PhysicalPartitionID.m_llOffset == id.m_ID.m_PhysicalPartitionID.m_llOffset ) );
  199. case IT_RootFreeSpaces:
  200. return TRUE;
  201. case IT_FreeSpace:
  202. return (( m_ID.m_FreeSpaceID.m_ulDiskNumber == id.m_ID.m_FreeSpaceID.m_ulDiskNumber ) &&
  203. ( m_ID.m_FreeSpaceID.m_llOffset == id.m_ID.m_FreeSpaceID.m_llOffset ) );
  204. default:
  205. ASSERT(FALSE);
  206. }
  207. }
  208. return FALSE;
  209. }
  210. BOOL CItemID::operator>( const CItemID& id ) const
  211. {
  212. if( m_wItemType == id.m_wItemType )
  213. {
  214. switch( m_wItemType )
  215. {
  216. case IT_RootVolumes:
  217. return FALSE;
  218. case IT_LogicalVolume:
  219. return ( m_ID.m_LogicalVolumeID.m_llVolID > id.m_ID.m_LogicalVolumeID.m_llVolID );
  220. case IT_PhysicalPartition:
  221. if( m_ID.m_PhysicalPartitionID.m_ulDiskNumber == id.m_ID.m_PhysicalPartitionID.m_ulDiskNumber )
  222. return ( m_ID.m_PhysicalPartitionID.m_llOffset > id.m_ID.m_PhysicalPartitionID.m_llOffset );
  223. return ( m_ID.m_PhysicalPartitionID.m_ulDiskNumber > id.m_ID.m_PhysicalPartitionID.m_ulDiskNumber );
  224. case IT_RootFreeSpaces:
  225. return FALSE;
  226. case IT_FreeSpace:
  227. if( m_ID.m_FreeSpaceID.m_ulDiskNumber == id.m_ID.m_FreeSpaceID.m_ulDiskNumber )
  228. return ( m_ID.m_FreeSpaceID.m_llOffset > id.m_ID.m_FreeSpaceID.m_llOffset );
  229. return ( m_ID.m_FreeSpaceID.m_ulDiskNumber > id.m_ID.m_FreeSpaceID.m_ulDiskNumber );
  230. default:
  231. ASSERT(FALSE);
  232. }
  233. }
  234. return ( m_wItemType > id.m_wItemType );
  235. }