diff -r 491b3ed49290 -r 65326cf895ed filesystemuis/memstatepopup/src/cmemstatepopupimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filesystemuis/memstatepopup/src/cmemstatepopupimpl.cpp Wed Sep 01 12:31:07 2010 +0100 @@ -0,0 +1,415 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0"" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Memory state popup implementation +* +*/ + + +// SYSTEM INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// USER INCLUDES +#include "msputil.h" +#include "cmemstatepopup.h" +#include "cmemstatepopupimpl.h" +#include "cmemscaneventreceiver.h" + +// CONSTANTS +_LIT( KDirAndFile,"Z:MemStatePopup.RSC" ); +_LIT( KMemListSeparator, "\t" ); + +// Max length of a list row +// Has to be big enough to hold "%N %U" +const TInt KListItemMaxLength = 32; + +// --------------------------------------------------------------------------- + +CMemStatePopupImpl::~CMemStatePopupImpl( ) + { + Cancel(); + // Close the resource + iResLoader.Close( ); + + if( iWaitDialog ) + { + iWaitDialog->SetObserver( NULL ); + delete iWaitDialog; + } + + delete iEventReceiver; // deletes also scan engine and server + + delete iGroupNames; + delete iListModel; + delete iListBox; + delete iScanResults; + + + if( iOwnsUtil ) + { + // Delete only if the actual dialog was launched + delete iUtil; + } + + // Try to delete also iPopup in case of leave + // Must call CBase's destructor + // because CAknPopupList destructor is protected + delete ( CBase* ) iPopup; + } + +// --------------------------------------------------------------------------- + +CMemStatePopupImpl::CMemStatePopupImpl( TDriveNumber aDrive, const TDesC& aTitle ) : + CActive(EPriorityStandard), + iFinished( EFalse ), + iDrive( aDrive ), + iTitle( const_cast (&aTitle) ), + iCoeEnv( *CCoeEnv::Static( ) ), + iResLoader( iCoeEnv ), + iOwnsUtil( ETrue ) + { + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- + +// Used by GetUtilL +CMemStatePopupImpl::CMemStatePopupImpl( ) : + CActive(EPriorityStandard), + iFinished( EFalse ), + iDrive( EDriveC ), + iCoeEnv( *CCoeEnv::Static( ) ), + iResLoader( iCoeEnv ), + iOwnsUtil( EFalse ) + { + } + +// --------------------------------------------------------------------------- + +void CMemStatePopupImpl::ConstructL( ) + { + OpenResourceAndReadArrayL( ); + + // Instantiate event receiver, memory scan engine and server + iEventReceiver = CMemScanEventReceiver::NewL( *this ); + + // Get data group names from engine + iGroupNames = iEventReceiver->DataGroupsL( ); + + // Create popup + ConstructPopupL( ); + + // Create wait dialog + iWaitDialog = new( ELeave ) CAknWaitDialog( + reinterpret_cast< CEikDialog** >( &iWaitDialog ) ); + iWaitDialog->SetCallback( this ); + iWaitDialog->PrepareLC( R_MEMSTATE_WAIT_NOTE ); + + StartObserver(); + } + +// --------------------------------------------------------------------------- + +void CMemStatePopupImpl::RunLD( TDriveNumber aDrive, const TDesC& aTitle ) + { + CMemStatePopupImpl* self = new( ELeave ) CMemStatePopupImpl( aDrive, aTitle ); + CleanupStack::PushL( self ); + self->ConstructL( ); + + // Run the actual process + self->ExecuteL( ); + + CleanupStack::PopAndDestroy( self ); + } + + +// --------------------------------------------------------------------------- + +void CMemStatePopupImpl::GetUtilL( CMSPUtil*& aUtil ) + { + CMemStatePopupImpl* self = new( ELeave ) CMemStatePopupImpl; + CleanupStack::PushL( self ); + + // Read the unit array from resource + self->OpenResourceAndReadArrayL( ); + aUtil = self->iUtil; // iUtil is not deleted + + CleanupStack::PopAndDestroy( self ); + } + +// --------------------------------------------------------------------------- + +void CMemStatePopupImpl::StartL( ) + { +#ifdef _DEBUG + RDebug::Print( _L( "Scanning started!" ) ); +#endif + } + +// --------------------------------------------------------------------------- + +void CMemStatePopupImpl::QuitL( TInt /*aReason*/ ) + { +#ifdef _DEBUG + RDebug::Print( _L( "Scanning ended!" ) ); +#endif + if( !iFinished ) + { + // Tell waitdialog that it can quit now + iWaitDialog->ProcessFinishedL( ); + iFinished = ETrue; + } + } + +// --------------------------------------------------------------------------- + +void CMemStatePopupImpl::ErrorL( TInt aError ) + { +#ifdef _DEBUG + RDebug::Print( _L( "Error scanning memory: %d" ), aError ); +#endif + + // getting rid of UREL compiler warning + if( !aError ) + { + aError = KErrNone; + } + } + +// --------------------------------------------------------------------------- + +void CMemStatePopupImpl::DialogDismissedL( TInt aButtonId ) + { + + // Cancel is pressed while scanning is in progress + if( iEventReceiver->ScanInProgress( ) ) + { + iFinished = ETrue; + iEventReceiver->Cancel( ); // Stop scanning + } + + // Cancel is pressed while wait note is on screen (scanning may be completed) + if( aButtonId == EAknSoftkeyCancel ) // instead of EAknSoftkeyDone + { + iPopup->CancelPopup( ); // Remove memory state popup from screen + return; + } + + // Get the new result array + delete iScanResults; + iScanResults = NULL; + TRAPD( err, iScanResults = iEventReceiver->ScanResultL( ) ); + if( err != KErrNone ) + { + iPopup->CancelPopup( ); // Remove memory state popup from screen + return; + } + RefreshL( ); + } + +// --------------------------------------------------------------------------- + +void CMemStatePopupImpl::ConstructPopupL( ) + { + iListBox = new( ELeave ) CMemStateListBox( ); + + iPopup = CAknPopupList::NewL( iListBox, R_AVKON_SOFTKEYS_OK_EMPTY, + AknPopupLayouts::EMenuGraphicHeadingWindow ); + iPopup->SetTitleL( *iTitle ); + + // Set up listbox + iListBox->ConstructL( iPopup, EAknListBoxViewerFlags ); + + // Create listbox model and give the model to the listbox + iListModel = new( ELeave ) CDesCArraySeg( iGroupNames->Count( ) ); + + // Create scroll indicator + iListBox->CreateScrollBarFrameL( ETrue ); + iListBox->ScrollBarFrame( )->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto ); + iListBox->Model( )->SetItemTextArray( iListModel ); + iListBox->Model( )->SetOwnershipType( ELbmDoesNotOwnItemArray ); + iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue ); + } + +// --------------------------------------------------------------------------- + +void CMemStatePopupImpl::ExecuteL( ) + { + // Show wait dialog + iWaitDialog->RunLD( ); + + // Start the scanning + User::LeaveIfError(iEventReceiver->ScanL( iDrive )); + + // Get the result array + iScanResults = iEventReceiver->ScanResultL( ); + + // Set all results zero, so that no actual results are shown + // before the scan is done. + NullifyResults( ); + + // Update the list with initial values (0's) + RefreshL( ); + + // Show popup + iPopup->ExecuteLD( ); + iPopup = NULL; // Has to be set NULL because deleted in destructor + } + +// --------------------------------------------------------------------------- + +void CMemStatePopupImpl::RefreshL( ) + { + //TBuf< KListItemMaxLength > result; + TBuf< KListItemMaxLength > unitText; + TBuf< KListItemMaxLength > tempText; + TPtrC unit; + TInt64 res64( 0 ); + TInt count( iScanResults ? iScanResults->Count( ) : 0 ); + TInt maxGroupName(0); + + for( TInt i = 0; i < iGroupNames->Count(); i++ ) + { + if( maxGroupName < ( *iGroupNames )[ i ].Length() ) + { + maxGroupName = ( *iGroupNames )[ i ].Length(); + } + } + + // Allocate memory for size, unit text and actual group name + HBufC* result = HBufC::NewLC( maxGroupName + 2*KListItemMaxLength ); + TPtr resultPtr( result->Des() ); + HBufC* unitFormatter = StringLoader::LoadLC( R_UNIT_FORMATTER, &iCoeEnv ); + + iListModel->Reset( ); + + // Go through the result array and append to the model as text + for( TInt i = 0; i < count; i++ ) + { + res64 = ( *iScanResults )[ i ]; + + unit.Set( iUtil->SolveUnitAndSize( res64 ) ); + StringLoader::Format( tempText, *unitFormatter, 0, I64INT( res64 ) ); + StringLoader::Format( unitText, tempText, 1, unit ); + resultPtr.Zero( ); + + // The actual listbox row is constructed here + // iListModel is just an array of descriptors + if ( User::Language() == ELangArabic ) + { + resultPtr.Append( KRightToLeftMark ); + } + resultPtr.Append( unitText ); + resultPtr.Append( KMemListSeparator ); + if( i < iGroupNames->Count() ) + { + resultPtr.Append( ( *iGroupNames )[ i ] ); + } + else + { + resultPtr.Append( ( *iGroupNames )[ 0 ] ); + } + iListModel->AppendL( resultPtr ); + } + + CleanupStack::PopAndDestroy( unitFormatter ); + CleanupStack::PopAndDestroy( result ); + + // Update the listbox + iListBox->HandleItemAdditionL( ); + } + +// --------------------------------------------------------------------------- + +void CMemStatePopupImpl::NullifyResults( ) + { + // Set all results to zero + if( iScanResults ) + { + TInt count( iScanResults->Count( ) ); + for( TInt t = 0; t < count; t++ ) + { + ( *iScanResults )[ t ] = 0; + } + } + } + +// --------------------------------------------------------------------------- + +void CMemStatePopupImpl::OpenResourceAndReadArrayL( ) + { + // Open dll resource + + TParse* fp = new(ELeave) TParse(); + fp->Set(KDirAndFile, &KDC_RESOURCE_FILES_DIR, NULL); + TFileName fileName( fp->FullName() ); + delete fp; + + BaflUtils::NearestLanguageFile( iCoeEnv.FsSession( ), + fileName ); + iResLoader.OpenL( fileName ); + + // Read localised unit texts from resource + TResourceReader reader; + iCoeEnv.CreateResourceReaderLC( reader, R_ARRAY_UNITS ); + CDesCArrayFlat* units = reader.ReadDesCArrayL( ); + CleanupStack::PushL( units ); + iUtil = CMSPUtil::NewL( units ); // Give the array to the util class + CleanupStack::Pop( units ); + CleanupStack::PopAndDestroy(); // Private HBufC8* variable + // of CreateResourceReaderLC() + } + +// --------------------------------------------------------------------------- +void CMemStatePopupImpl::RunL() + { + TVolumeInfo volInfo; + TInt err = iCoeEnv.FsSession().Volume( volInfo, iDrive ); + if(err != KErrNone) + { + iPopup->CancelPopup( ); + } + else + { + StartObserver(); + } + } + +// --------------------------------------------------------------------------- +void CMemStatePopupImpl::DoCancel() + { + iCoeEnv.FsSession().NotifyChangeCancel(); + } + +// --------------------------------------------------------------------------- +void CMemStatePopupImpl::StartObserver() + { + if ( IsActive() ) + { + Cancel(); + } + iCoeEnv.FsSession().NotifyChange( ENotifyDisk, iStatus ); + SetActive(); + } + +// End of File