browserutilities/browserdialogsprovider/Src/BrowserUploadProgressNote.cpp
changeset 0 dd21522fd290
child 25 0ed94ceaa377
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/browserdialogsprovider/Src/BrowserUploadProgressNote.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,258 @@
+/*
+* 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: 
+*     This class creates a progress dialog, which shows the progress of an upload
+*     
+*
+*/
+
+
+// INCLUDES
+#include "BrowserUploadProgressNote.h"
+#include "BrowserDialogsProviderObserver.h"
+
+#include <BrowserDialogsProvider.rsg>
+#include <StringLoader.h>
+
+// ----------------------------------------------------------------------------
+// CBrowserUploadProgressNote::CBrowserUploadProgressNote
+// ----------------------------------------------------------------------------
+//
+CBrowserUploadProgressNote::CBrowserUploadProgressNote( 
+                            TInt aMaxValue,
+                            MBrowserDialogsProviderObserver* aObserver,
+                            CEikDialog** aSelfPtr ) :
+    CAknProgressDialog( aSelfPtr, ETrue ), // should use EFalse, but doesn't work!
+    iMaxValue( aMaxValue ),
+    iObserver( aObserver )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CBrowserUploadProgressNote::~CBrowserUploadProgressNote
+// ----------------------------------------------------------------------------
+//
+CBrowserUploadProgressNote::~CBrowserUploadProgressNote( )
+    {
+	delete iStrUploaded;
+	delete iStrUnit;
+    }
+
+// ----------------------------------------------------------------------------
+// CBrowserUploadProgressNote::NewL
+// ----------------------------------------------------------------------------
+//
+CBrowserUploadProgressNote* CBrowserUploadProgressNote::NewL( 
+                            TInt aMaxValue,
+                            MBrowserDialogsProviderObserver* aObserver,
+                            CEikDialog** aSelfPtr )
+    {
+    CBrowserUploadProgressNote* self = NewLC( aMaxValue, aObserver, aSelfPtr );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CBrowserUploadProgressNote::NewLC
+// ----------------------------------------------------------------------------
+//
+CBrowserUploadProgressNote* CBrowserUploadProgressNote::NewLC( 
+                            TInt aMaxValue,
+                            MBrowserDialogsProviderObserver* aObserver,
+                            CEikDialog** aSelfPtr )
+    {	
+    CBrowserUploadProgressNote* self = 
+                            new ( ELeave ) CBrowserUploadProgressNote( 
+                            aMaxValue, aObserver, aSelfPtr );
+    CleanupStack::PushL( self );
+    self->ConstructL( );
+    return self;	
+    }
+
+// ----------------------------------------------------------------------------
+// CBrowserUploadProgressNote::UpdateL
+// ----------------------------------------------------------------------------
+//
+void CBrowserUploadProgressNote::UpdateL( TInt aChunkSize )
+	{ 
+    iUploaded+=aChunkSize; // Set the uploaded size.
+
+    // ...Length() + 20 because if we substitute the uploaded, 
+    // and the max upload strings into the
+    // "Uploaded:\ %U / %U" string, there should be enough space in the buffer.
+    // The max length of the substituted strings is not more than 8 characters, 
+    // so 20 characters should be enough, and won`t cause errors, if the size 
+    // of the substituted strings slightly changes.
+	TInt length = iStrUploaded->Des( ).Length() + iStrUnit->Des().Length() + 20;
+
+    // The final string that will be displayed on the progress note.
+	HBufC* progressNoteText = HBufC::NewLC( length );
+
+    // Temporary buffer for formatting.
+    HBufC* tempProgressNoteText = HBufC::NewLC( length );
+
+    // Temporary pointer needed, for using StringLoader::Format.
+    TPtr progressNoteTextPtr = progressNoteText->Des();
+
+	// If we are showing data in kB Units.
+	if ( iMaxValue < 1000 )
+		{
+        // Convert the uploaded, and max upload size to string.
+        TBuf<3> strMax,strUploaded;
+        strMax.AppendNum( iMaxValue );
+        strUploaded.AppendNum( iUploaded );
+        
+        // Substitute the first index in the string from .loc file.
+        StringLoader::Format( progressNoteTextPtr,iStrUploaded->Des(),
+                                                                0,strUploaded );
+
+        // Substitute the second index in the string from .loc file.
+        tempProgressNoteText->Des( ).Copy( progressNoteTextPtr ); // Copy to a temporary buffer.
+        // Format and put the fully formatted string into progressNoteText
+        StringLoader::Format( progressNoteTextPtr,tempProgressNoteText->Des(),
+                                                                    1,strMax );
+        }
+	// If we are showing data in MB Units.
+	else 
+		{
+        // Convert the uploaded, and max upload size to MB units.
+		HBufC* strMax = DivisionL( iMaxValue,1000 );
+        CleanupStack::PushL( strMax );
+		HBufC* strUploaded = DivisionL( iUploaded,1000 );
+        CleanupStack::PushL( strUploaded );
+
+        // Substitute the first index in the string from .loc file.
+        StringLoader::Format( progressNoteTextPtr,iStrUploaded->Des(),
+                                                        0,strUploaded->Des() );
+
+        // Substitute the second index in the string from .loc file.
+        tempProgressNoteText->Des().Copy( progressNoteTextPtr ); // Copy to a temporary buffer.
+        // Format and put the fully formatted string into progressNoteText
+        StringLoader::Format( progressNoteTextPtr,tempProgressNoteText->Des(),
+                                                            1,strMax->Des() );
+
+		CleanupStack::PopAndDestroy( 2 ); // strMax, struploaded
+		}
+
+    progressNoteText->Des().Append( iStrUnit->Des() ); // Append the unit.        
+	/*iProgressDlg->*/SetTextL( progressNoteText->Des() ); // Set the text of the note.
+	iProgressInfo->SetAndDraw( iUploaded ); 
+    CleanupStack::PopAndDestroy( 2 ); //progressNoteText, tempProgressNoteText
+	}
+
+
+// ----------------------------------------------------------------------------
+// CBrowserUploadProgressNote::ConstructL
+// ----------------------------------------------------------------------------
+//
+void CBrowserUploadProgressNote::ConstructL( )
+    {
+    // TO DO: Param should be EFalse, but it fails....
+	/*iProgressDlg = new( ELeave ) CAknProgressDialog( 
+                        ( REINTERPRET_CAST ( CEikDialog**, &iProgressDlg) ), ETrue );*/
+	
+    iStrUploaded = StringLoader::LoadL( 
+                                R_QTN_BROWSER_UPLOAD_PROGRESSNOTE_UPLOADED );
+
+    // If "kB" unit is needed...
+	if ( iMaxValue<1000 )
+		{
+		iStrUnit = CCoeEnv::Static()->AllocReadResourceL( 
+                                R_QTN_BROWSER_UPLOAD_PROGRESSNOTE_UNIT_KBYTE );
+		}
+	else
+		{
+		iStrUnit = CCoeEnv::Static()->AllocReadResourceL( 
+                                R_QTN_BROWSER_UPLOAD_PROGRESSNOTE_UNIT_MB );
+		}
+
+	PrepareLC( R_UPLOAD_PROGRESSNOTE );
+    
+    iProgressInfo = GetProgressInfoL( );
+	iProgressInfo->SetFinalValue( iMaxValue );
+	
+	// Set callback for when dialog is dismissed, handled in DialogDismissedL()
+	SetCallback( this );
+	
+	// Show the dialog
+	RunLD();
+    }
+
+// ----------------------------------------------------------------------------
+// CBrowserUploadProgressNote::DivisionL
+// ----------------------------------------------------------------------------
+//
+HBufC* CBrowserUploadProgressNote::DivisionL( TInt aNumerator,TInt aDenominator )
+	{
+    TLocale locale;
+	TInt reminder = aNumerator%aDenominator;
+    // Temporary buffer for the result of the division.
+	HBufC* tempString = HBufC::NewLC( 50 );
+
+    // Copy the integer part of the division.
+	tempString->Des().AppendNum( aNumerator / aDenominator );
+    //Copy the decimal separator.
+    tempString->Des().Append( locale.DecimalSeparator() );
+ 
+    // Copy the fraction part, we need 3 decimal fractions.
+    // Example: 2.00 or 3.50...
+    for ( TInt i=0;i<3;i++ )
+        {
+        TInt newReminder = ( reminder * 10 ) % aDenominator;
+        reminder = ( reminder * 10 ) / aDenominator;
+        tempString->Des().AppendNum( reminder );
+        reminder = newReminder;
+        }
+
+    HBufC* returnString = HBufC::NewLC( 4 );
+
+    // Only 3 numbers needed in the string. So, if the integer part is bigger
+    // than 99.9, we chop the reminder part...
+    // Example 100.342 will be 100 , 158.654 will be 158, 
+    // because of the specification.
+
+    //If the integer value is bigger than 99, then chop...
+    if ( ( TChar )tempString->Des()[3] == locale.DecimalSeparator() )
+        {
+        returnString->Des().Copy( tempString->Des().Left( 3 ) );
+        }
+    // Or simply copy to the result...
+    else
+        {
+        returnString->Des().Copy( tempString->Des().Left( 4 ) );
+        }
+
+    CleanupStack::Pop(); // returnString
+    CleanupStack::PopAndDestroy(); // tempString
+    return returnString;
+	}
+
+// ----------------------------------------------------------------------------
+// CBrowserUploadProgressNote::DialogDismissedL
+// ----------------------------------------------------------------------------
+//
+void CBrowserUploadProgressNote::DialogDismissedL( TInt aButtonId )
+    {
+    if ( aButtonId == EAknSoftkeyCancel )
+        {
+        if ( iObserver )
+            {
+            // Indicate to observer that the dialog is now dismissed
+            iObserver->ReportDialogEventL( 
+                MBrowserDialogsProviderObserver::EUploadProgress, KErrCancel );
+            }
+        }
+    }
+
+//  END OF FILE