diff -r 6385c4c93049 -r 8e6fa1719340 browserui/browser/BrowserAppSrc/BrowserProgressIndicator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserui/browser/BrowserAppSrc/BrowserProgressIndicator.cpp Wed Sep 01 12:31:04 2010 +0100 @@ -0,0 +1,493 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* +* +*/ + + +// INCLUDE FILES + +#include +#include +#include +#include +#include + +// USER INCLUDES + +#include "Display.h" +#include "ApiProvider.h" +#include "CommonConstants.h" // for View Ids +#include "BrowserProgressIndicator.h" +#include "Logger.h" +#include "AknUtils.h" + +// CONSTANTS + +const TInt KGranularity = 4; +const TUint KkBLimit = 999; +const TUint KOnekB = 1024; +const TUint KOneMB = 1024 * 1024; +const TInt KMaxPercentage = 100; +const TInt KMBLimit = 10; +const TInt KMaxMBLimit = 100; +_LIT(text,"(%S) %S "); +_LIT(twoDecimals,"%2.2lf"); +_LIT(oneDecimal, "%2.1lf"); +_LIT(noDecimals, "%d"); + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CBrowserProgressIndicator::NewL +// --------------------------------------------------------- +// +CBrowserProgressIndicator* CBrowserProgressIndicator::NewL( + MApiProvider& aApiProvider ) + { + CBrowserProgressIndicator* self = new (ELeave) + CBrowserProgressIndicator( aApiProvider ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::ConstructL +// --------------------------------------------------------- +// +void CBrowserProgressIndicator::ConstructL() + { + iProgressData = new(ELeave) CArrayFixFlat( KGranularity ); + iInitialDownloadIndicatorState = EFalse; + + HBufC* myKb = StringLoader::LoadL( R_WML_UNIT_KB ); + iMyKb = myKb->Alloc(); + delete myKb; + + HBufC* myMb = StringLoader::LoadL( R_WML_UNIT_MB ); + iMyMb = myMb->Alloc(); + delete myMb; + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::CBrowserProgressIndicator +// --------------------------------------------------------- +// +CBrowserProgressIndicator::CBrowserProgressIndicator( + MApiProvider& aApiProvider ) : + iIsRunning( EFalse ), + iApiProvider( aApiProvider ), + iLastMaxEstimate( 0 ), + iLastReceivedData( 0 ) + { + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::~CBrowserProgressIndicator +// --------------------------------------------------------- +// +CBrowserProgressIndicator::~CBrowserProgressIndicator() + { + delete iProgressData; + delete iMyKb; + delete iMyMb; + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::AddTransActIdL +// --------------------------------------------------------- +// +void CBrowserProgressIndicator::AddTransActIdL( TUint16 aId ) + { + //Format each id at start point. + AddProgressDataL(aId, 0, 0); + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::DeleteProgressDataItem +// --------------------------------------------------------- +// +void CBrowserProgressIndicator::DeleteProgressDataItem( TUint16 aId ) + { + TKeyArrayFix key(0, ECmpTUint16); + TInt pos = 0; + TProgressData data; + data.iId = aId; + TInt retVal = iProgressData->Find( data,key,pos ); + if ( retVal == KErrNone ) + { + iProgressData->Delete( pos ); + } + + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::TransActIdAmount() +// --------------------------------------------------------- +// +TInt CBrowserProgressIndicator::TransActIdAmount() const + { + return iProgressData->Count(); + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::TransActIdAmountCompleted() +// --------------------------------------------------------- +// +TInt CBrowserProgressIndicator::TransActIdAmountCompleted() const + { + TInt numOfCompleted( 0 ); + TInt i; + for( i=0; iAt( i ).iComplete ) + ++numOfCompleted; + } + return numOfCompleted; + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::ResetValues() +// --------------------------------------------------------- +// +void CBrowserProgressIndicator::ResetValues() + { + iProgressData->Reset(); + iProgressEstimate = 0; + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::ReceivedData() +// --------------------------------------------------------- +// +TUint32 CBrowserProgressIndicator::ReceivedData() + { + TUint32 recvdData = 0; + for (TInt i = 0; i < iProgressData->Count();i++) + { + TProgressData data = iProgressData->At( i ); + recvdData += data.iRecvdData; + } + return recvdData; + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::EstimateMaxData() +// --------------------------------------------------------- +// +TUint32 CBrowserProgressIndicator::EstimateMaxData() + { + TUint32 maxData = 0; + TInt count = 0; + TUint32 estimation = 0; + for ( TInt i = 0; i < iProgressData->Count();i++ ) + { + TProgressData data = iProgressData->At( i ); + if( data.iMaxData ) + { + maxData += data.iMaxData; + count++; + } + } + // estimate maximum data what will be received + if ( count ) + { + return estimation = ((maxData/count)* iProgressData->Count()); + } + + return estimation; + + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::TransActId() +// --------------------------------------------------------- +// +TUint16 CBrowserProgressIndicator::TransActId( TInt aIndex ) + { + return iProgressData->At( aIndex ).iId; + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::AddProgressDataL() +// --------------------------------------------------------- +// +void CBrowserProgressIndicator::AddProgressDataL( + TUint16 aId, TUint32 aRecvdData, TUint32 aMaxData ) + { + //Try to seek if current id exist in array + TKeyArrayFix key(0, ECmpTUint16); + TInt pos = 0; + TProgressData data; + data.iId = aId; + TInt retVal = iProgressData->Find( data,key,pos ); + if ( retVal!=KErrNone ) //id was NOT found + { + //Add id, recvdData and maxData to array + TProgressData data; + data.iId = aId; + data.iRecvdData = aRecvdData; + data.iMaxData = aMaxData; + data.iComplete = EFalse; + iProgressData->AppendL( data ); + } + else + { + + data = iProgressData->At( pos ); + if( ((data.iRecvdData != aRecvdData) && aRecvdData!=0 ) ) + { + data.iRecvdData = aRecvdData; + } + if ( aMaxData!=0 ) + { + data.iMaxData = aMaxData; + } + + iProgressData->Delete( pos ); + iProgressData->InsertL( pos,data ); + } + } + + +// --------------------------------------------------------- +// CBrowserProgressIndicator::TransActIdCompleteL() +// --------------------------------------------------------- +// +void CBrowserProgressIndicator::TransActIdCompleteL( TUint16 aId ) + { + TKeyArrayFix key( 0, ECmpTUint16 ); + TInt pos = 0; + TProgressData data; + data.iId = aId; + TInt retVal = iProgressData->Find( data,key,pos ); + if ( retVal == KErrNone && ! iProgressData->At(pos).iComplete ) + { + data = iProgressData->At( pos ); + // we don't need this id anymore if both data values are empty + if ( !data.iMaxData && !data.iRecvdData ) + { + iProgressData->Delete( pos ); + } + else + { + data.iComplete = ETrue; + if ( data.iMaxData > data.iRecvdData ) + { + data.iRecvdData = data.iMaxData; + } + iProgressData->Delete( pos ); + iProgressData->InsertL( pos,data ); + } + } + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::EnquireStatusL() +// --------------------------------------------------------- +// +void CBrowserProgressIndicator::EnquireStatusL() + { +LOG_ENTERFN("EnquireStatusL"); + // Reset string storage. + iPercentText.SetLength( 0 ); + iDataText.SetLength( 0 ); + iMBvalue.SetLength( 0 ); + + TUint32 receivedData = ReceivedData(); + TUint32 maxEstimate = EstimateMaxData(); + + if (receivedData == 0 || maxEstimate == 0) + { + // fake initial progress to reflect 5% downloaded and 0 kb received. + receivedData = 5; + maxEstimate = 100; + } + + //Calculate either kB-text or MB-text + if ( ((receivedData)/KOnekB ) <= KkBLimit ) + { + HBufC* kbUnit = HBufC::NewL( iMyKb->Length()+5 ); + TPtr ptr1( kbUnit->Des() ); + StringLoader::Format( ptr1, *iMyKb, -1, (receivedData)/KOnekB ); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion(ptr1); + iDataText.Copy( ptr1 ); + delete kbUnit; + } + else + { + + TReal received( receivedData ); + TReal oneMB( KOneMB ); + TReal result( received / oneMB ); + // TUint32 result( receivedData / KOneMB ); + if ( result < KMBLimit ) + { + // TUint32 res2( ( ( receivedData * 100 ) / KOneMB ) % 100 ); + // need to modify the format string too + iMBvalue.Format( twoDecimals, result ); + } + else if ( result < KMaxMBLimit ) + { + // TUint32 res2( ( ( receivedData * 10 ) / KOneMB ) % 10 ); + // need to modify the format string too + iMBvalue.Format( oneDecimal, result ); + } + else if ( result > KMaxMBLimit) + { + TInt16 resultInt( 0 ); + Math::Int( resultInt, result ); + iMBvalue.Format( noDecimals, resultInt ); + } + HBufC* mbUnit = HBufC::NewL( iMyMb->Length() + iMBvalue.Length() + 1 ); + TPtr ptr1( mbUnit->Des() ); + StringLoader::Format( ptr1, *iMyMb, -1, iMBvalue ); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion(ptr1); + iDataText.Copy( ptr1 ); + delete mbUnit; + } + + // progress animation should be shown only in content view (not in bookmarks) + if( iApiProvider.LastActiveViewId() == KUidBrowserContentViewId ) + { + // Check all possible states. + if ( !iInitialDownloadIndicatorState && maxEstimate <= 0 ) + { + iInitialDownloadIndicatorState = ETrue; + // The initial indicator state changed from EFalse to ETrue. Update it. + iApiProvider.Display().UpdateFSDownloadInitialIndicator( ETrue ); + } + else if ( !iInitialDownloadIndicatorState && 0 < maxEstimate ) + { + //iInitialDownloadIndicatorState = EFalse; // Unnecessary statement. + } + else if ( iInitialDownloadIndicatorState && maxEstimate <= 0 ) + { + //iInitialDownloadIndicatorState = ETrue; // Unnecessary statement. + } + else if ( iInitialDownloadIndicatorState && 0 < maxEstimate ) + { + iInitialDownloadIndicatorState = EFalse; + // The initial indicator state changed from ETrue to EFalse. Update it. + iApiProvider.Display().UpdateFSDownloadInitialIndicator( EFalse ); + } + + iApiProvider.Display().UpdateFSProgressIndicator( maxEstimate, receivedData ); + + // Render the downloaded data size. + iApiProvider.Display().UpdateFSProgressDataL( iDataText ); + } + else + { + // is this section really run? + + // Show how many percentage has been dowloaded + if ( maxEstimate ) + { + TReal received( receivedData ); + TReal maxEst( maxEstimate ); + TReal factor( 100 ); + TReal percentage( (received / maxEst) * factor ); + TInt16 percentInt( 0 ); + Math::Int( percentInt, percentage ); + if ( percentInt > KMaxPercentage ) + { + percentInt = KMaxPercentage; + } + HBufC* percentUnit = + StringLoader::LoadLC( R_WML_UNIT_PERCENT, percentInt ); + iPercentText.Format( text, percentUnit, &iDataText ); + CleanupStack::PopAndDestroy( percentUnit ); //percentUnit + + //Update navi pane + iApiProvider.UpdateNaviPaneL( iPercentText ); + } + //Show amount of downloaded data (recvd data) + //(if maximum data is not available) + else + { + iApiProvider.UpdateNaviPaneL( iDataText ); + } + } + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::StartL() +// --------------------------------------------------------- +// +void CBrowserProgressIndicator::StartL() + { + if ( !iIsRunning ) + { + // clear progress bar data + iLastMaxEstimate = 0; + iLastReceivedData = 0; + + // progress animation should be shown + // only in content view (not in bookmarks) + if( iApiProvider.LastActiveViewId() == KUidBrowserContentViewId ) + { + //Start progress bar + NotifyProgress(); + + iInitialDownloadIndicatorState = ETrue; + iApiProvider.Display().UpdateFSDownloadInitialIndicator( ETrue ); + // Show initially 0 kB as downloaded size. + HBufC* kbUnit = HBufC::NewL( iMyKb->Length()+5 ); + TPtr ptr1( kbUnit->Des() ); + StringLoader::Format( ptr1, *iMyKb, -1, 0 ); + iDataText.Copy( ptr1 ); + delete kbUnit; + iApiProvider.Display().UpdateFSProgressDataL( iDataText ); + } + + iIsRunning = ETrue; + } + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::StopL() +// --------------------------------------------------------- +// +void CBrowserProgressIndicator::StopL() + { + if( iApiProvider.LastActiveViewId() == KUidBrowserContentViewId ) + { + ResetValues(); + if( iInitialDownloadIndicatorState ) + { + iInitialDownloadIndicatorState = EFalse; + iApiProvider.Display(). + UpdateFSDownloadInitialIndicator( EFalse ); + } + iApiProvider.Display().RestoreTitleL(); + } + iIsRunning = EFalse; + } + +// --------------------------------------------------------- +// CBrowserProgressIndicator::NotifyProgress() +// --------------------------------------------------------- +// +void CBrowserProgressIndicator::NotifyProgress() + { + // Unfortunately we could not eliminate TRAP. The Engine cannot + // support a leavable NotifyProgressL() function. + TRAP_IGNORE( EnquireStatusL() ); + } + +// End of File