Leaked source code of windows server 2003
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.
 
 
 
 
 
 

585 lines
16 KiB

/*++
© 1998 Seagate Software, Inc. All rights reserved
Module Name:
PrMrLvl.cpp
Abstract:
Managed Volume Levels Page
Author:
Art Bragg [abragg] 08-Aug-1997
Revision History:
--*/
#include "stdafx.h"
#include "PrMrLvl.h"
#include "manvol.h"
static DWORD pHelpIds[] =
{
IDC_STATIC_ACTUAL_FREE_PCT, idh_actual_free_space_percent,
IDC_STATIC_ACTUAL_FREE_PCT_LABEL, idh_actual_free_space_percent,
IDC_STATIC_ACTUAL_FREE_PCT_UNIT, idh_actual_free_space_percent,
IDC_STATIC_FREE_ACTUAL_4DIGIT, idh_actual_free_space_capacity,
IDC_EDIT_LEVEL, idh_desired_free_space_percent,
IDC_SPIN_LEVEL, idh_desired_free_space_percent,
IDC_EDIT_LEVEL_LABEL, idh_desired_free_space_percent,
IDC_EDIT_LEVEL_UNIT, idh_desired_free_space_percent,
IDC_STATIC_FREE_DESIRED_4DIGIT, idh_desired_free_space_capacity,
IDC_EDIT_SIZE, idh_min_file_size_criteria,
IDC_SPIN_SIZE, idh_min_file_size_criteria,
IDC_EDIT_SIZE_LABEL, idh_min_file_size_criteria,
IDC_EDIT_SIZE_UNIT, idh_min_file_size_criteria,
IDC_EDIT_TIME, idh_file_access_date_criteria,
IDC_SPIN_TIME, idh_file_access_date_criteria,
IDC_EDIT_TIME_LABEL, idh_file_access_date_criteria,
IDC_EDIT_TIME_UNIT, idh_file_access_date_criteria,
0, 0
};
/////////////////////////////////////////////////////////////////////////////
// CPrMrLvl property page
CPrMrLvl::CPrMrLvl() : CSakVolPropPage(CPrMrLvl::IDD)
{
//{{AFX_DATA_INIT(CPrMrLvl)
m_hsmLevel = 0;
m_fileSize = 0;
m_accessTime = 0;
//}}AFX_DATA_INIT
m_hConsoleHandle = NULL;
m_capacity = 0;
m_fChangingByCode = FALSE;
m_pHelpIds = pHelpIds;
}
CPrMrLvl::~CPrMrLvl()
{
}
void CPrMrLvl::DoDataExchange(CDataExchange* pDX)
{
CSakVolPropPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPrMrLvl)
DDX_Control(pDX, IDC_STATIC_FREE_ACTUAL_4DIGIT, m_staticActual4Digit);
DDX_Control(pDX, IDC_STATIC_FREE_DESIRED_4DIGIT, m_staticDesired4Digit);
DDX_Control(pDX, IDC_EDIT_TIME, m_editTime);
DDX_Control(pDX, IDC_EDIT_SIZE, m_editSize);
DDX_Control(pDX, IDC_EDIT_LEVEL, m_editLevel);
DDX_Control(pDX, IDC_SPIN_TIME, m_spinTime);
DDX_Control(pDX, IDC_SPIN_SIZE, m_spinSize);
DDX_Control(pDX, IDC_SPIN_LEVEL, m_spinLevel);
//}}AFX_DATA_MAP
// blank is valid for multi-select
if( m_bMultiSelect ) {
CString szLevel;
CString szSize;
CString szDays;
m_editLevel.GetWindowText( szLevel );
m_editSize.GetWindowText( szSize );
m_editTime.GetWindowText( szDays );
if( szLevel != L"" ) {
DDX_Text( pDX, IDC_EDIT_LEVEL, m_hsmLevel );
DDV_MinMaxLong( pDX, m_hsmLevel, HSMADMIN_MIN_FREESPACE, HSMADMIN_MAX_FREESPACE );
} else {
m_hsmLevel = HSMADMIN_DEFAULT_MINSIZE;
}
if( szSize != L"" ) {
DDX_Text( pDX, IDC_EDIT_SIZE, m_fileSize );
DDV_MinMaxDWord( pDX, m_fileSize, HSMADMIN_MIN_MINSIZE, HSMADMIN_MAX_MINSIZE );
} else {
m_fileSize = HSMADMIN_DEFAULT_FREESPACE;
}
if( szDays != L"" ) {
DDX_Text( pDX, IDC_EDIT_TIME, m_accessTime );
DDV_MinMaxUInt( pDX, m_accessTime, HSMADMIN_MIN_INACTIVITY, HSMADMIN_MAX_INACTIVITY );
} else {
m_accessTime = HSMADMIN_DEFAULT_INACTIVITY;
}
} else {
//
// Normal validation for single select
//
DDX_Text( pDX, IDC_EDIT_LEVEL, m_hsmLevel );
DDV_MinMaxLong( pDX, m_hsmLevel, HSMADMIN_MIN_FREESPACE, HSMADMIN_MAX_FREESPACE );
DDX_Text( pDX, IDC_EDIT_TIME, m_accessTime );
DDV_MinMaxUInt( pDX, m_accessTime, HSMADMIN_MIN_INACTIVITY, HSMADMIN_MAX_INACTIVITY );
DDX_Text( pDX, IDC_EDIT_SIZE, m_fileSize );
//
// Since we limit the number of characters in the buddy edits, we
// don't expect the previous two DDV's to ever really kick in.
// However, it is possible to enter bad minumum size since both
// '0' and '1' can be entered, but are not in the valid range.
//
// Code is equivalent to:
// DDV_MinMaxDWord( pDX, m_fileSize, HSMADMIN_MIN_MINSIZE, HSMADMIN_MAX_MINSIZE );
//
if( pDX->m_bSaveAndValidate &&
( m_fileSize < HSMADMIN_MIN_MINSIZE ||
m_fileSize > HSMADMIN_MAX_MINSIZE ) ) {
CString message;
AfxFormatString2( message, IDS_ERR_MINSIZE_RANGE,
CString( WsbLongAsString( (LONG)HSMADMIN_MIN_MINSIZE ) ),
CString( WsbLongAsString( (LONG)HSMADMIN_MAX_MINSIZE ) ) );
AfxMessageBox( message, MB_OK | MB_ICONWARNING );
pDX->Fail();
}
}
}
BEGIN_MESSAGE_MAP(CPrMrLvl, CSakVolPropPage)
//{{AFX_MSG_MAP(CPrMrLvl)
ON_EN_CHANGE(IDC_EDIT_LEVEL, OnChangeEditLevel)
ON_EN_CHANGE(IDC_EDIT_SIZE, OnChangeEditSize)
ON_EN_CHANGE(IDC_EDIT_TIME, OnChangeEditTime)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPrMrLvl message handlers
BOOL CPrMrLvl::OnInitDialog()
{
HRESULT hr = 0;
CSakVolPropPage::OnInitDialog();
int freePct;
try {
m_bMultiSelect = ( m_pParent->IsMultiSelect() == S_OK );
// Set the spinner ranges
m_spinTime.SetRange( HSMADMIN_MIN_INACTIVITY, HSMADMIN_MAX_INACTIVITY );
m_spinSize.SetRange( HSMADMIN_MIN_MINSIZE, HSMADMIN_MAX_MINSIZE );
m_spinLevel.SetRange( HSMADMIN_MIN_FREESPACE, HSMADMIN_MAX_FREESPACE );
// Set text limits
m_editTime.SetLimitText( 3 );
m_editSize.SetLimitText( 5 );
m_editLevel.SetLimitText( 2 );
if( !m_bMultiSelect )
{
// Single Select
// Show the byte display of desired free space
m_staticDesired4Digit.ShowWindow( SW_SHOW );
m_staticActual4Digit.ShowWindow( SW_SHOW );
// Get the single Fsa Resource pointer
WsbAffirmHr ( m_pVolParent->GetFsaResource( &m_pFsaResource ) );
WsbAffirmPointer (m_pFsaResource);
ULONG hsmLevel = 0;
LONGLONG fileSize = 0;
BOOL isRelative = TRUE; // assumed to be TRUE
FILETIME accessTime;
// Get data from the Fsa object and assign to controls
WsbAffirmHr( m_pFsaResource->GetHsmLevel( &hsmLevel ) );
m_hsmLevel = hsmLevel / FSA_HSMLEVEL_1;
WsbAffirmHr( m_pFsaResource->GetManageableItemLogicalSize( &fileSize ) );
m_fileSize = (DWORD)(fileSize / 1024); // Show KBytes
WsbAffirmHr( m_pFsaResource->GetManageableItemAccessTime( &isRelative, &accessTime ) );
WsbAssert( isRelative, E_FAIL ); // We only do relative time
// Convert FILETIME to days
LONGLONG temp = WSB_FT_TICKS_PER_DAY;
m_accessTime = (UINT) (WsbFTtoLL (accessTime) / temp);
if( m_accessTime > 999 ) {
m_accessTime = 0;
}
LONGLONG total = 0;
LONGLONG free = 0;
LONGLONG premigrated = 0;
LONGLONG truncated = 0;
// Get actual free space and show in % and 4-digit formats
WsbAffirmHr( m_pFsaResource->GetSizes( &total, &free, &premigrated, &truncated ) );
m_capacity = total;
freePct = (int) ((free * 100) / total);
CString sFormat;
sFormat.Format( L"%d", freePct );
SetDlgItemText( IDC_STATIC_ACTUAL_FREE_PCT, sFormat );
WsbAffirmHr( RsGuiFormatLongLong4Char( free, sFormat ) );
SetDlgItemText( IDC_STATIC_FREE_ACTUAL_4DIGIT, sFormat );
// Show the desired in 4-digit - based on the %
SetDesiredFreePctControl( m_hsmLevel );
// Update the controls
UpdateData( FALSE );
} else {
// MULTI-SELECT
// Hide the byte display of desired free space
m_staticDesired4Digit.ShowWindow( SW_HIDE );
m_staticActual4Digit.ShowWindow( SW_HIDE );
InitDialogMultiSelect( );
}
} WsbCatch (hr);
return( TRUE );
}
BOOL CPrMrLvl::OnApply()
{
HRESULT hr = S_OK;
try {
if( !m_bMultiSelect ) {
LONGLONG fileSize = 0;
// Single Select
UpdateData( TRUE );
WsbAffirmHr( m_pFsaResource->SetHsmLevel( m_hsmLevel * FSA_HSMLEVEL_1 ) );
fileSize = ((LONGLONG)m_fileSize) * 1024;
WsbAffirmHr( m_pFsaResource->SetManageableItemLogicalSize( fileSize ) );
// Convert days to FILETIME
FILETIME accessTime;
LONGLONG temp = WSB_FT_TICKS_PER_DAY;
accessTime = WsbLLtoFT( ( (LONGLONG) m_accessTime ) * temp );
WsbAffirmHr( m_pFsaResource->SetManageableItemAccessTime( TRUE, accessTime ) );
} else {
// Multi-Select
WsbAffirmHr( OnApplyMultiSelect( ) );
}
//
// Tell to save
//
CComPtr<IFsaServer> pFsaServer;
WsbAffirmHr( m_pParent->GetFsaServer( &pFsaServer ) );
WsbAffirmHr( RsServerSaveAll( pFsaServer ) );
//
// Now notify all the nodes
//
m_pParent->OnPropertyChange( m_hConsoleHandle );
} WsbCatch( hr );
return CSakVolPropPage::OnApply();
}
///////////////////////////////////////////////////////////////////////////////
//
// OnChangeEditLevel
//
// Change the display of actual bytes according to the percent setting
//
void CPrMrLvl::OnChangeEditLevel()
{
BOOL fTrans;
int freePct;
freePct = GetDlgItemInt( IDC_EDIT_LEVEL, &fTrans );
if( fTrans ) {
SetDesiredFreePctControl( freePct );
}
if( !m_fChangingByCode ) {
SetModified( TRUE );
}
}
void CPrMrLvl::OnChangeEditSize()
{
if( !m_fChangingByCode ) {
SetModified( TRUE );
}
}
void CPrMrLvl::OnChangeEditTime()
{
if( !m_fChangingByCode ) {
SetModified( TRUE );
}
}
//////////////////////////////////////////////////////////////////////////
//
// SetDesiredFreePctControl
//
// Converts the supplied desired percent to bytes (using m_capacity) and
// displays in the appropriate edit box
//
//
void CPrMrLvl::SetDesiredFreePctControl (int desiredPct)
{
HRESULT hr = 0;
CString sFormat;
LONGLONG desired = (m_capacity * desiredPct) / 100;
try {
WsbAffirmHr (RsGuiFormatLongLong4Char (desired, sFormat));
SetDlgItemText (IDC_STATIC_FREE_DESIRED_4DIGIT, sFormat);
} WsbCatch (hr)
}
//////////////////////////////////////////////////////////////////////////
//
//
HRESULT CPrMrLvl::InitDialogMultiSelect()
{
LONGLONG total;
LONGLONG free;
LONGLONG premigrated;
LONGLONG truncated;
BOOL fLevelSame = TRUE;
BOOL fSizeSame = TRUE;
BOOL fDaysSame = TRUE;
BOOL fFirst = TRUE;
CString szLevel;
CString szSize;
CString szDays;
ULONG hsmLevel = 0;
LONGLONG fileSize = 0;
BOOL isRelative = TRUE; // assumed to be TRUE
FILETIME accessTime;
int hsmLevelPct;
ULONG fileSizeKb;
int accessTimeDays;
int hsmLevelPctSave = 0;
ULONG fileSizeKbSave = 0;
int accessTimeDaysSave = 0;
int freePct;
HRESULT hr = S_OK;
try {
// Set this flag to true because SetEditContents will cause the edit boxes to
// fire a change event, and we don't want that to cause the Finish button to
// be enabled.
m_fChangingByCode = TRUE;
// For each managed resource
int bookMark = 0;
CComPtr<IFsaResource> pFsaResource;
LONGLONG totalCapacity = 0;
LONGLONG totalFree = 0;
while( m_pVolParent->GetNextFsaResource( &bookMark, &pFsaResource ) == S_OK ) {
// Total up volume statistics
WsbAffirmHr (pFsaResource->GetSizes(&total, &free, &premigrated, &truncated));
totalCapacity += total;
totalFree += free;
// Get the levels in the resource
WsbAffirmHr( pFsaResource->GetHsmLevel( &hsmLevel) );
hsmLevelPct = (hsmLevel / FSA_HSMLEVEL_1);
if( ! fFirst ) {
if( hsmLevelPct != hsmLevelPctSave ) {
fLevelSame = FALSE;
}
}
hsmLevelPctSave = hsmLevelPct;
WsbAffirmHr( pFsaResource->GetManageableItemLogicalSize( &fileSize ) );
fileSizeKb = (LONG) ( fileSize / 1024 );
if( !fFirst ) {
if( fileSizeKb != fileSizeKbSave ) {
fSizeSame = FALSE;
}
}
fileSizeKbSave = fileSizeKb;
WsbAffirmHr( pFsaResource->GetManageableItemAccessTime( &isRelative, &accessTime ) );
accessTimeDays = (UINT) ( WsbFTtoLL( accessTime ) / WSB_FT_TICKS_PER_DAY );
if( ! fFirst ) {
if( accessTimeDays != accessTimeDaysSave ) {
fDaysSame = FALSE;
}
}
accessTimeDaysSave = accessTimeDays;
fFirst = FALSE;
pFsaResource.Release( );
} // While
// If all same, put the value in
if( fLevelSame ) {
szLevel.Format( L"%d", hsmLevelPctSave );
} else {
szLevel = L"";
}
if( fSizeSame ) {
szSize.Format( L"%d", fileSizeKbSave );
} else {
szSize = L"";
}
if( fDaysSame ) {
szDays.Format( L"%d", accessTimeDaysSave );
} else {
szDays = L"";
}
// Show volume statistics
if( totalCapacity == 0 ) {
freePct = 0;
} else {
freePct = (int) ( ( totalFree * 100 ) / totalCapacity );
}
CString sFormat;
sFormat.Format( L"%d", freePct );
SetDlgItemText( IDC_STATIC_ACTUAL_FREE_PCT, sFormat );
m_editLevel.SetWindowText( szLevel );
m_editSize.SetWindowText( szSize );
m_editTime.SetWindowText( szDays );
m_fChangingByCode = FALSE;
} WsbCatch( hr );
return( hr );
}
HRESULT CPrMrLvl::OnApplyMultiSelect()
{
HRESULT hr = S_OK;
CComPtr <IFsaResource> pFsaResource;
try {
// For each managed resource
int bookMark = 0;
CComPtr<IFsaResource> pFsaResource;
while( m_pVolParent->GetNextFsaResource( &bookMark, &pFsaResource ) == S_OK ) {
// Set the levels in the resource - only if the edit box was not blank
CString szLevel;
CString szSize;
CString szDays;
m_editLevel.GetWindowText( szLevel );
m_editSize.GetWindowText( szSize );
m_editTime.GetWindowText( szDays );
if( szLevel != L"" ) {
WsbAffirmHr( pFsaResource->SetHsmLevel( m_spinLevel.GetPos( ) * FSA_HSMLEVEL_1 ) );
}
if( szSize != L"" ) {
WsbAffirmHr( pFsaResource->SetManageableItemLogicalSize( (LONGLONG) m_spinSize.GetPos( ) * 1024 ) );
}
if( szDays != L"" ) {
// Convert days to FILETIME
FILETIME accessTime;
accessTime = WsbLLtoFT( ( (LONGLONG) m_spinTime.GetPos( ) ) * WSB_FT_TICKS_PER_DAY);
WsbAffirmHr (pFsaResource->SetManageableItemAccessTime (TRUE, accessTime));
}
pFsaResource.Release( );
}
} WsbCatch (hr);
return( hr );
}