--- /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 <AknAppUi.h>
+#include <e32math.h>
+#include <BrowserNG.rsg>
+#include <FeatMgr.h>
+#include <stringloader.h>
+
+// 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<TProgressData>( 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; i<TransActIdAmount(); ++i )
+ {
+ if( iProgressData->At( 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