/*++ © 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 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 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 pFsaResource; try { // For each managed resource int bookMark = 0; CComPtr 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 ); }