/*++

Copyright (c) 1998 Microsoft Corporation

Module Name:

    FTMan

File Name:

	FrSpace.cpp

Abstract:

    Implementation of the CFreeSpaceData class. The class that stores all information related
	to a free space

Author:

    Cristian Teodorescu      October 23, 1998

Notes:

Revision History:

--*/

#include "stdafx.h"

#include "FrSpace.h"
#include "Resource.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

///////////////////////////////////////////////////////////////////////////////////////////////////
// CFreeSpaceData

// Constructor
CFreeSpaceData::CFreeSpaceData(
							DWORD			dwDiskNumber, 
							DWORD			dwSignature, 
							LONGLONG		llOffset, 
							LONGLONG		llSize,
							FREE_SPACE_TYPE	wFreeSpaceType,
							LONGLONG		llCylinderSize,
							DWORD			dwPartitionCountOnLevel,
							DWORD			dwExtendedPartitionCountOnLevel,
							CItemData*		pParentData /* = NULL */) 
	:	CItemData( IT_FreeSpace, pParentData, FALSE ),						m_dwDiskNumber(dwDiskNumber),	
		m_dwSignature(dwSignature),			m_llOffset(llOffset),			m_llSize(llSize),				
		m_wFreeSpaceType( wFreeSpaceType ), m_dwFreeSpaceNumber(0),			m_llCylinderSize(llCylinderSize),
		m_dwPartitionCountOnLevel( dwPartitionCountOnLevel ),		
		m_dwExtendedPartitionCountOnLevel( dwExtendedPartitionCountOnLevel )
{
}

////////////////////////////////////////////////////////////////////////////////////////////////////
// Public methods

BOOL CFreeSpaceData::ReadItemInfo( CString& strErrors )
{
	MY_TRY

	m_bValid = TRUE;
	strErrors = _T("");
	
	m_ulNumMembers = 0;	
	
	// Retrieve all disks used by this volume
	if( !RetrieveDisksSet() )
	{
		AddError( strErrors, IDS_ERR_RETRIEVE_DISKS_SET, FALSE );
		m_bValid = FALSE;
	}

	m_bIoOK = TRUE;

	m_iImage = ComputeImageIndex();

	return m_bValid;

	MY_CATCH_AND_THROW
}

BOOL CFreeSpaceData::ReadMembers( CObArray& arrMembersData, CString& strErrors )
{
	arrMembersData.RemoveAll();
	strErrors = _T("");
	m_ulNumMembers = 0;
	return TRUE;
}

int CFreeSpaceData::ComputeImageIndex() const
{
	return II_FreeSpace;
}

BOOL CFreeSpaceData::operator==(CItemData& rData) const
{
	MY_TRY

	if( rData.GetItemType() != IT_FreeSpace )
		return FALSE;

	CFreeSpaceData* pFrSpaceData = (CFreeSpaceData*)(&rData);

	return( ( m_dwDiskNumber == pFrSpaceData->m_dwDiskNumber ) &&
			( m_dwSignature == pFrSpaceData->m_dwSignature ) &&
			( m_llOffset == pFrSpaceData->m_llOffset ) &&
			( m_llSize == pFrSpaceData->m_llSize ) &&
			( m_wFreeSpaceType == pFrSpaceData->m_wFreeSpaceType ) &&
			( m_llCylinderSize == pFrSpaceData->m_llCylinderSize ) &&
			( m_dwPartitionCountOnLevel == pFrSpaceData->m_dwPartitionCountOnLevel ) &&
			( m_dwExtendedPartitionCountOnLevel == pFrSpaceData->m_dwExtendedPartitionCountOnLevel ) );

	MY_CATCH_AND_THROW
}

void CFreeSpaceData::GetDisplayName( CString& strDisplay ) const 
{
	MY_TRY
		
	strDisplay.Format( IDS_FREE_SPACE_NAME, m_dwDiskNumber, m_dwFreeSpaceNumber );
	
	MY_CATCH_AND_THROW
}

void CFreeSpaceData::GetDisplayType( CString& strDisplay ) const 
{
	MY_TRY

	switch( m_wFreeSpaceType )
	{
		case FST_Primary:
			strDisplay.LoadString( IDS_TYPE_FREE_SPACE );
			break;
		case FST_InExtendedPartition:
			strDisplay.LoadString( IDS_TYPE_FREE_SPACE_IN_EXTENDED_PARTITION );
			break;
		case FST_EmptyExtendedPartition:
			strDisplay.LoadString( IDS_TYPE_EMPTY_EXTENDED_PARTITION );
			break;
		default:
			ASSERT(FALSE);
	}

	MY_CATCH_AND_THROW
}

BOOL CFreeSpaceData::GetSize( LONGLONG& llSize ) const
{
	llSize = m_llSize;
	return TRUE;
}

BOOL CFreeSpaceData::GetDiskNumber( ULONG& ulDiskNumber ) const
{
	ulDiskNumber  = m_dwDiskNumber;
	return TRUE;
}

BOOL CFreeSpaceData::GetOffset( LONGLONG& llOffset) const
{
	llOffset = m_llOffset;
	return TRUE;
}

////////////////////////////////////////////////////////////////////////////////////////////////////
// Protected methods

BOOL CFreeSpaceData::RetrieveDisksSet()
{
	MY_TRY

	m_setDisks.RemoveAll();
	m_setDisks.Add( m_dwDiskNumber );
	return TRUE;

	MY_CATCH_AND_THROW
}