--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/browserdialogsprovider/Src/BrowserDialogsProvider.cpp Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,1288 @@
+/*
+* 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: Implementation of the CBrowserDialogsProvider class.
+*
+*/
+
+
+// INCLUDE Files
+
+// User includes
+#include "BrowserDialogsProvider.h" // Class header
+#include "BrowserDialogsProvider.hrh"
+#include "BrowserAuthenticationDialog.h"
+#include "BrowserDialogsProviderConstants.h"
+#include "BrowserDialogsProviderObserver.h" //obs
+
+// Browser as a Plugin - own classes
+#include "BrowserViewImagesPopup.h" // For DialogDisplayPageImagesL
+#include "BrowserScriptPromptDialog.h" // For DialogPromptLC
+#include "BrowserSelectElementDlg.h" // For DialogFileSelectLC
+#include "BrowserUploadProgressNote.h" // For UploadProgressNoteL
+
+// System Includes
+#include <aknLists.h> // for Object Element Dialog
+#include <aknmessagequerydialog.h> // DialogAlertL
+#include <CAknFileSelectionDialog.h> // File Selection Dialog
+
+#ifdef RD_MULTIPLE_DRIVE
+#include <driveinfo.h>
+#include <CAknMemorySelectionDialogMultiDrive.h>
+#include <AknCommonDialogsDynMem.h>
+#else
+#include <CAknMemorySelectionDialog.h>
+#include <AknCommonDialogs.h> // File Selection Dialog
+#endif
+
+#include <aknnotewrappers.h>
+#include <AknInfoPopupNoteController.h> // tooltip
+#include <PathConfiguration.hrh>
+#include <FeatMgr.h>
+#include <MGFetch.h> // Media Fetch
+// General
+#include <StringLoader.h> // strings
+#include <f32file.h>
+#include <THttpFields.h>
+
+// Resources
+#include <coneresloader.h>
+#include <BrowserDialogsProvider.rsg>
+#include <ErrorRes.rsg>
+
+// Data Caging
+#include <data_caging_path_literals.hrh>
+
+// CONSTANTS
+const TInt KBrCtlObjectElementMaxLength = 50;
+const TInt KBrCtlMBFormat = 4;
+const TInt KBrCtlGBFormat = 10;
+const TInt KBrCtlMegabyte = 1000; // although 1MB=1024 kB, treat as 1000kb for user simplicity
+
+// DLL resource file name with path
+_LIT( KBrowserDialogsProviderDirAndFile, "z:BrowserDialogsProvider.rsc" );// resource
+_LIT( KErrorResDirAndFile, "z:ErrorRes.rsc" ); // error resource
+
+//Mime Types
+_LIT( KMimeTypeImage, "image/*" );
+_LIT( KMimeTypeAudio, "audio/*" );
+_LIT( KMimeTypeVideo, "video/*" );
+
+// MACROS
+#define JAPANESE ( FeatureManager::FeatureSupported( KFeatureIdJapanese ) )
+
+
+//-----------------------------------------------------------------------------
+/*
+*/
+//-----------------------------------------------------------------------------
+CBrowserDialogsProvider::CBrowserDialogsProvider(
+ MBrowserDialogsProviderObserver* aObserver )
+: iCoeEnv( *CCoeEnv::Static() ),
+ iObserver( aObserver ),
+ iResourceLoader( iCoeEnv ),
+ iResourceOpened( EFalse ),
+ iErrResourceLoader( iCoeEnv ),
+ iErrResourceOpened( EFalse )
+ {
+ }
+
+//-----------------------------------------------------------------------------
+// CBrowserDialogsProvider* CBrowserDialogsProvider::NewL
+//
+//-----------------------------------------------------------------------------
+EXPORT_C CBrowserDialogsProvider* CBrowserDialogsProvider::NewL(
+ MBrowserDialogsProviderObserver* aObserver )
+ {
+ CBrowserDialogsProvider* self =
+ new (ELeave) CBrowserDialogsProvider( aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL( );
+ CleanupStack::Pop( self ); // self
+ return self;
+ }
+
+//-----------------------------------------------------------------------------
+// CBrowserDialogsProvider::ConstructL()
+//
+//-----------------------------------------------------------------------------
+void CBrowserDialogsProvider::ConstructL()
+ {
+ // Load resource file
+ AssureResourceL();
+
+ // Tooltip
+ iTooltip = CAknInfoPopupNoteController::NewL();
+ }
+
+//-----------------------------------------------------------------------------
+// CBrowserDialogsProvider::~CBrowserDialogsProvider()
+//
+//-----------------------------------------------------------------------------
+CBrowserDialogsProvider::~CBrowserDialogsProvider()
+ {
+ iResourceLoader.Close();
+ iErrResourceLoader.Close();
+
+ // Delete any dialogs
+ CancelAll();
+
+ // Clean up tooltip
+ if ( iTooltip )
+ {
+ iTooltip->HideInfoPopupNote();
+ }
+ delete iTooltip;
+ }
+
+//-----------------------------------------------------------------------------
+// CBrowserDialogsProvider::DialogNotifyErrorL( TInt aErrCode )
+//
+//-----------------------------------------------------------------------------
+EXPORT_C void CBrowserDialogsProvider::DialogNotifyErrorL( TInt aErrCode )
+ {
+ TInt httpErr = KBrCtlHttpErrorsOffset - aErrCode;
+
+ switch ( httpErr )
+ {
+ case EHttpMultipleChoices:
+ case EHttpMovedPermanently:
+ case EHttpMovedTemporarily:
+ case EHttpTemporaryRedirect:
+ {
+ // Handle the redirect error dialog
+ HBufC* msg = NULL;
+ msg = StringLoader::LoadLC( R_NW_STAT_TOO_MANY_REDIRECTS );
+ DialogNoteL( *msg );
+ CleanupStack::PopAndDestroy(); // msg
+ break;
+ }
+ default:
+ {
+ // Handle all others as system error dialog
+ iCoeEnv.HandleError( aErrCode );
+ break;
+ }
+ } // end of switch
+
+ if ( iObserver )
+ {
+ iObserver->ReportDialogEventL(
+ MBrowserDialogsProviderObserver::ENotifyError,
+ aErrCode );
+ }
+ }
+
+
+//-----------------------------------------------------------------------------
+// CBrowserDialogsProvider::DialogNotifyHttpErrorL(
+// TInt aErrCode, const TDesC& /*aUri*/ )
+//-----------------------------------------------------------------------------
+EXPORT_C void CBrowserDialogsProvider::DialogNotifyHttpErrorL(
+ TInt aErrCode, const TDesC& /*aUri*/ )
+ {
+ TInt httpErr = KBrCtlHttpErrorsOffset - aErrCode;
+
+ switch ( httpErr )
+ {
+ case EHttpMultipleChoices:
+ case EHttpMovedPermanently:
+ case EHttpMovedTemporarily:
+ case EHttpTemporaryRedirect:
+ {
+ // Handle the redirect error dialog
+ HBufC* msg = NULL;
+ msg = StringLoader::LoadLC( R_NW_STAT_TOO_MANY_REDIRECTS );
+ DialogNoteL( *msg );
+ CleanupStack::PopAndDestroy(); // msg
+ break;
+ }
+ default:
+ {
+ // Handle all others as system error dialog
+ iCoeEnv.HandleError( aErrCode );
+ break;
+ }
+ } // end of switch
+
+ if ( iObserver )
+ {
+ iObserver->ReportDialogEventL(
+ MBrowserDialogsProviderObserver::ENotifyHttpError,
+ KBrCtlHttpErrorsOffset - aErrCode );
+ }
+ }
+
+//CBrowserDialogsProvider::DialogFileSelectLC(
+// const TDesC& aStartPath,
+// const TDesC& aRootPath,
+// HBufC*& aSelectedFileName )
+//-----------------------------------------------------------------------------
+
+
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+
+EXPORT_C TBool CBrowserDialogsProvider::DialogFileSelectLC(
+ const TDesC& aStartPath,
+ const TDesC&/*aRootPath*/,
+ HBufC*& aSelectedFileName )
+ {
+ // Launch the AVKON dialog that will use existing path.
+ TBool selected( EFalse );
+
+ HBufC* buf = NULL;
+ buf = HBufC::NewLC( KMaxFileName );
+ TPtr ptr ( buf->Des() );
+
+ // If a recent path exists, use that as the starting point.
+ if ( aStartPath.Length() )
+ {
+
+ TParsePtrC fileNameParser( aStartPath );
+ // Copy drive into the buffer as a way to pass it to AVKON dialog.
+ TPtrC ptrDrive( fileNameParser.Drive() );
+ // Get phone memory root
+ TPtrC8 tempPtrC8((const TUint8*)text_phone_memory_root_path);
+
+ // Unicode data will be <= in length to ASCII
+ HBufC* rootBuf = HBufC::NewLC(tempPtrC8.Length() + 1);
+
+ rootBuf->Des().Copy(tempPtrC8);
+ rootBuf->Des().ZeroTerminate();
+
+ TPtr rootPtr( rootBuf->Des() );
+ // Compare phone memory drive with drive from aStartPath
+ if( rootPtr.Length() && (rootPtr[0] == ptrDrive[0] ))
+ {
+ // we are on the phone memory
+ TPtrC ptrPath( fileNameParser.DriveAndPath() );
+ ptr.Copy(rootPtr);
+ if ( ptrPath.Length() )
+
+ {// make ptrPath directory relative to a phone root directory
+ // remove "C:\\Data\\" from ptrPath
+ if(aStartPath.Match(rootBuf->Des() ))
+ {
+ ptrPath.Set( ptrPath.Right( ptrPath.Length() - rootPtr.Length() ) );
+ }
+ } // for current configuration ptr is "C:\\Data\\", ptrPath is something like
+ // "images//" etc
+ selected = CAknFileSelectionDialog::RunDlgLD(ptr,ptrPath);
+ }
+ else
+ {
+ TBuf<KMaxPath> rootPath;
+ rootPath.Copy( ptrDrive );
+ ptr.Copy( rootPath );
+
+ // Remove leading backslash; required for AVKON dialog.
+ TPtrC ptrPath( fileNameParser.Path() );
+
+ if ( ptrPath.Length() )
+ {
+ if ( ptrPath[0] == '\\' )
+ {
+ ptrPath.Set( ptrPath.Right( ptrPath.Length() - 1 ) );
+ }
+ }
+
+ selected = CAknFileSelectionDialog::RunDlgLD( ptr, ptrPath);
+ }
+ CleanupStack:: PopAndDestroy(rootBuf);
+
+ if( !selected )
+ {
+ // if mmc present launch memory selection dialog
+ FeatureManager::InitializeLibL();
+ TBool mmcSupported( FeatureManager::FeatureSupported( KFeatureIdMmc ) );
+ FeatureManager::UnInitializeLib();
+
+ TInt driveInfo( KErrNone );
+
+#ifdef RD_MULTIPLE_DRIVE
+ TDriveNumber selectedMemory;
+ User::LeaveIfError(
+ DriveInfo::GetDefaultDrive( DriveInfo::EDefaultPhoneMemory,
+ ( TInt& )selectedMemory ) );
+#else
+ CAknMemorySelectionDialog::TMemory selectedMemory(
+ CAknMemorySelectionDialog::EPhoneMemory );
+#endif
+
+ if ( mmcSupported )
+ {
+#ifdef RD_MULTIPLE_DRIVE
+ TDriveNumber defaultRMS;
+ User::LeaveIfError(
+ DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRemovableMassStorage,
+ ( TInt& )defaultRMS ) );
+ TUint status;
+ RFs& fs = CCoeEnv::Static()->FsSession();
+ driveInfo = DriveInfo::GetDriveStatus( fs, ( TInt& )defaultRMS, status );
+#else
+ driveInfo = DriveReady( TDriveNumber( EDriveE ) );
+#endif
+ }
+ // Temp variable
+ HBufC* defaultFolder = HBufC::NewLC( KMaxPath );
+ TPtr ptrDefaultFolder = defaultFolder->Des();
+ HBufC* defaultPath = HBufC::NewLC( KMaxPath );
+ TPtr ptrDefaultPath = defaultPath->Des();
+
+ if ( ( driveInfo == KErrNone ) && mmcSupported )
+ {
+ // Run MEMORY SELECTION DIALOG
+#ifdef RD_MULTIPLE_DRIVE
+ CAknMemorySelectionDialogMultiDrive* memoryDialog =
+ CAknMemorySelectionDialogMultiDrive::NewL( ECFDDialogTypeSelect,
+ R_MEMORY_SELECTION_DIALOG,
+ EFalse );
+#else
+ CAknMemorySelectionDialog* memoryDialog =
+ CAknMemorySelectionDialog::NewL( ECFDDialogTypeSelect,
+ R_MEMORY_SELECTION_DIALOG,
+ EFalse );
+#endif
+ CleanupStack::PushL( memoryDialog );
+ selected = memoryDialog->ExecuteL( selectedMemory,
+ &ptrDefaultPath,
+ &ptrDefaultFolder );
+ CleanupStack::PopAndDestroy(); // memoryDialog
+ }
+
+ if ( selected )
+ {
+ selected = CAknFileSelectionDialog::RunDlgLD( ptrDefaultPath,
+ ptrDefaultFolder );
+ if ( selected )
+ {
+ ptr.Copy( ptrDefaultPath );
+ }
+ }
+ CleanupStack::PopAndDestroy(defaultPath); //defaultPath
+ CleanupStack::PopAndDestroy(defaultFolder); //defaultFolder
+ }
+ }
+ else
+ {
+ // aStartPath is NULL
+ ptr.Copy( aStartPath );
+#ifdef RD_MULTIPLE_DRIVE
+ selected = AknCommonDialogsDynMem::RunSelectDlgLD( AknCommonDialogsDynMem::EMemoryTypePhone|
+ AknCommonDialogsDynMem::EMemoryTypeInternalMassStorage|
+ AknCommonDialogsDynMem::EMemoryTypeMMCExternal|
+ AknCommonDialogsDynMem::EMemoryTypeRemote,
+ ptr, R_MEMORY_SELECTION_DIALOG );
+#else
+ selected = AknCommonDialogs::RunSelectDlgLD( ptr,
+ R_MEMORY_SELECTION_DIALOG );
+#endif
+ }
+
+ // return fully qualified file name
+ if ( selected )
+ {
+ aSelectedFileName = buf;
+ }
+
+ if ( iObserver )
+ {
+ iObserver->ReportDialogEventL(
+ MBrowserDialogsProviderObserver::EFileSelect,
+ ( TInt ) selected );
+ }
+ return selected;
+ }
+
+
+
+//-----------------------------------------------------------------------------
+// CBrowserDialogsProvider::DialogSelectOptionL(
+// const TDesC& aTitle,
+// TBrCtlSelectOptionType aBrCtlSelectOptionType,
+// CArrayFix<TBrCtlSelectOptionData>& aOptions )
+//-----------------------------------------------------------------------------
+EXPORT_C TBool CBrowserDialogsProvider::DialogSelectOptionL(
+ const TDesC& aTitle,
+ TBrCtlSelectOptionType aBrCtlSelectOptionType,
+ CArrayFix<TBrCtlSelectOptionData>& aOptions )
+ {
+ CBrowserSelectElementDlg* dlg = CBrowserSelectElementDlg::NewL( aTitle,
+ aBrCtlSelectOptionType,
+ aOptions );
+
+
+ iDialogs.Append( dlg ); // Store a pointer to the dialog for CancelAll()
+
+ TInt result = dlg->ExecuteLD();
+
+ RemoveDialogFromArray();
+
+ if ( iObserver )
+ {
+ iObserver->ReportDialogEventL(
+ MBrowserDialogsProviderObserver::ESelectOption,
+ ( TInt ) result );
+ }
+
+ return result;
+ }
+
+
+//-----------------------------------------------------------------------------
+// CBrowserDialogsProvider::DialogUserAuthenticationLC(
+// const TDesC& /*aUrl**/,
+// const TDesC& /*aRealm*/,
+// const TDesC& aDefaultUserName,
+// HBufC*& aReturnedUserName,
+// HBufC*& aReturnedPasswd,
+// TBool aBasicAuthentication )
+//-----------------------------------------------------------------------------
+EXPORT_C TBool CBrowserDialogsProvider::DialogUserAuthenticationLC(
+ const TDesC& /*aUrl**/,
+ const TDesC& /*aRealm*/,
+ const TDesC& aDefaultUserName,
+ HBufC*& aReturnedUserName,
+ HBufC*& aReturnedPasswd,
+ TBool /*aBasicAuthentication*/ )
+ {
+ TBuf<KBrowserDialogsProviderMaxUsername> username;
+ TBuf<KBrowserDialogsProviderMaxPassword> password;
+ TBool bTryAgain = ETrue;
+ TBool cancelled = ETrue;
+
+ // Fill in default username and notify that previous authentication failed
+ if ( aDefaultUserName.Length() )
+ {
+ username.Copy( aDefaultUserName );
+ bTryAgain = ( ConfirmQueryDialogL( R_BROWSER_DLGPROV_AUTH_FAIL_RETRY_QUERY ) != 0 );
+ }
+
+ // Show Authentication dialog
+ if( bTryAgain )
+ {
+ switch (GetUserPasswordL( username, password ))
+ {
+ case EAknSoftkeyOk:
+ {
+ cancelled = EFalse;
+ break;
+ }
+ case EAknSoftkeyCancel:
+ default:
+ {
+ cancelled = ETrue;
+ }
+ }
+ }
+
+ aReturnedUserName = username.AllocLC();
+ aReturnedPasswd = password.AllocLC();
+
+ if ( iObserver )
+ {
+ iObserver->ReportDialogEventL(
+ MBrowserDialogsProviderObserver::EUserAuthentication,
+ ( TInt ) cancelled );
+ }
+
+ return !cancelled;
+ }
+
+
+//-----------------------------------------------------------------------------
+// CBrowserDialogsProvider::DialogNoteL( const TDesC& aMessage )
+//
+//-----------------------------------------------------------------------------
+EXPORT_C void CBrowserDialogsProvider::DialogNoteL( const TDesC& aMessage )
+ {
+ CAknNoteDialog* dialog = new (ELeave) CAknNoteDialog
+ ( REINTERPRET_CAST( CEikDialog**, &dialog ) );
+
+ iDialogs.Append( dialog ); // Set pointer for CancelAll()
+ dialog->PrepareLC( R_DIALOGSPROVIDER_OK_NOTE ) ;
+ dialog->SetCurrentLabelL( EGeneralNote, aMessage );
+ dialog->RunDlgLD( CAknNoteDialog::ELongTimeout, CAknNoteDialog::ENoTone );
+
+ RemoveDialogFromArray();
+
+ if ( iObserver )
+ {
+ iObserver->ReportDialogEventL(
+ MBrowserDialogsProviderObserver::ENote,
+ NULL );
+ }
+ }
+
+
+//-----------------------------------------------------------------------------
+// CBrowserDialogsProvider::DialogAlertL( const TDesC& aTitle,
+// const TDesC& aMessage )
+//-----------------------------------------------------------------------------
+EXPORT_C void CBrowserDialogsProvider::DialogAlertL( const TDesC& aTitle,
+ const TDesC& aMessage )
+ {
+ // Taken from CBrowserAppUi::WmlScriptDlgAlertL()
+ HBufC* messagebody = HBufC::NewLC( aMessage.Length()+2 );
+ messagebody->Des().Append( aMessage );
+ messagebody->Des().Append( _L("\n\n"));
+
+ HBufC* header = HBufC::NewLC( aTitle.Length() );
+ header->Des().Append( aTitle );
+
+ CAknMessageQueryDialog* dialog =
+ CAknMessageQueryDialog::NewL( *messagebody );
+
+ // Store a pointer to the dialog for CancelAll()
+ iDialogs.Append( dialog );
+
+ dialog->PrepareLC( R_BROWSER_MESSAGE_QUERY_DIALOG );
+ dialog->ButtonGroupContainer().MakeCommandVisible(
+ EAknSoftkeyCancel, EFalse );
+
+ dialog->QueryHeading()->SetTextL( *header );
+
+ dialog->RunLD();
+
+ RemoveDialogFromArray();
+ CleanupStack::PopAndDestroy( 2 ); // header , messagebody
+
+ if ( iObserver )
+ {
+ iObserver->ReportDialogEventL(
+ MBrowserDialogsProviderObserver::EAlert,
+ NULL );
+ }
+ }
+
+
+//-----------------------------------------------------------------------------
+// CBrowserDialogsProvider::DialogConfirmL( const TDesC& aTitle,
+// const TDesC& aMessage,
+// const TDesC& aYesMessage,
+// const TDesC& aNoMessage )
+//-----------------------------------------------------------------------------
+EXPORT_C TBool CBrowserDialogsProvider::DialogConfirmL( const TDesC& aTitle,
+ const TDesC& aMessage,
+ const TDesC& aYesMessage,
+ const TDesC& aNoMessage )
+ {
+ TBool retVal;
+
+ // CAknMessageQueryDialog must have title text, for the message text to be shown
+ if ( aTitle.Length() )
+ {
+ CAknMessageQueryDialog* dialog =
+ CAknMessageQueryDialog::NewL( (TDesC&) aMessage );
+
+
+ iDialogs.Append( dialog ); // Store a pointer to the dialog for CancelAll()
+
+ dialog->PrepareLC( R_BROWSER_MESSAGE_QUERY_DIALOG );
+
+ dialog->QueryHeading()->SetTextL( aTitle );
+
+ if( aYesMessage.Length() )
+ {
+ dialog->ButtonGroupContainer().SetCommandL( EAknSoftkeyOk, aYesMessage );
+ }
+
+ if( aNoMessage.Length() )
+ {
+ dialog->ButtonGroupContainer().SetCommandL( EAknSoftkeyCancel, aNoMessage );
+ }
+
+ if ( !dialog->RunLD() )
+ {
+ retVal = EFalse;
+ }
+ else
+ {
+ retVal = ETrue;
+ }
+
+ RemoveDialogFromArray();
+ }
+ else
+ {
+ // This dialog has an animation question mark.
+ CAknQueryDialog* dialog = new (ELeave) CAknQueryDialog();
+
+ iDialogs.Append( dialog ); // Store dialog pointer for CancelAll()
+
+ dialog->PrepareLC( R_BROWSER_CONFIRM_QUERY );
+
+ dialog->SetPromptL( aMessage );
+
+ if( aYesMessage.Length() )
+ {
+ dialog->ButtonGroupContainer().SetCommandL( EAknSoftkeyYes, aYesMessage );
+ }
+
+ if( aNoMessage.Length() )
+ {
+ dialog->ButtonGroupContainer().SetCommandL( EAknSoftkeyNo, aNoMessage );
+ }
+
+ if ( !dialog->RunLD() )
+ {
+ retVal = EFalse;
+ }
+ else
+ {
+ retVal = ETrue;
+ }
+ RemoveDialogFromArray();
+ }
+
+ if ( iObserver )
+ {
+ iObserver->ReportDialogEventL(
+ MBrowserDialogsProviderObserver::EConfirm,
+ ( TInt ) retVal );
+ }
+ return retVal;
+ }
+
+//-----------------------------------------------------------------------------
+// CBrowserDialogsProvider::DialogPromptLC( const TDesC& aTitle,
+// const TDesC& aMessage,
+// const TDesC& aDefaultInput,
+// HBufC*& aReturnedInput )
+//-----------------------------------------------------------------------------
+EXPORT_C TBool CBrowserDialogsProvider::DialogPromptLC( const TDesC& aTitle,
+ const TDesC& aMessage,
+ const TDesC& aDefaultInput,
+ HBufC*& aReturnedInput )
+ {
+ TBool retVal;
+
+ // defInput is not modified by the dialog.
+ TPtr defInput( (TUint16*) aDefaultInput.Ptr(), aDefaultInput.Length(),
+ KMaxAltTextLength );
+
+ CBrowserScriptPromptDialog* dialog =
+ new (ELeave) CBrowserScriptPromptDialog( defInput, aReturnedInput );
+
+ iDialogs.Append( dialog ); // Store a pointer to the dialog for CancelAll()
+
+ dialog->PrepareLC( R_DATA_QUERY_WITH_HEADING );
+ dialog->SetHeaderTextL( aTitle );
+ dialog->SetPromptL( aMessage );
+
+ if ( !dialog->RunLD() )
+ {
+ retVal = EFalse;
+ }
+ else
+ {
+ retVal = ETrue;
+ }
+
+ RemoveDialogFromArray();
+ CleanupStack::PushL( aReturnedInput );
+
+ if ( iObserver )
+ {
+ iObserver->ReportDialogEventL(
+ MBrowserDialogsProviderObserver::EPrompt,
+ (TInt) retVal );
+ }
+
+ return retVal;
+ }
+
+//-----------------------------------------------------------------------------
+// CBrowserDialogsProvider::DialogDownloadObjectL(
+// CBrCtlObjectInfo* aBrCtlObjectInfo )
+//
+//-----------------------------------------------------------------------------
+EXPORT_C TBool CBrowserDialogsProvider::DialogDownloadObjectL(
+ CBrCtlObjectInfo* aBrCtlObjectInfo )
+ {
+ HBufC* header; // holds the header text
+ HBufC* message; // a buffer holding the text for each list item
+ HBufC* buf; // a buffer for strings
+ TInt ret; // general variable for return values
+
+ //-------------------------------------------
+ // Query object info
+ //
+ CEikFormattedCellListBox* listBox = new ( ELeave )
+ CAknDoublePopupMenuStyleListBox;
+ CleanupStack::PushL( listBox );
+
+ // If supported show OK & Cancel buttons, otherwise just CANCEL
+ CAknPopupList* popupList;
+ if ( aBrCtlObjectInfo->AppSupported() ||
+ aBrCtlObjectInfo->PluginSupported() )
+ {
+ popupList = CAknPopupList::NewL(listBox, R_AVKON_SOFTKEYS_OK_CANCEL__OK,
+ AknPopupLayouts::EMenuDoubleWindow);
+ }
+ else
+ {
+ popupList = CAknPopupList::NewL(listBox, R_AVKON_SOFTKEYS_CANCEL,
+ AknPopupLayouts::EMenuDoubleWindow);
+ }
+
+ CleanupStack::PushL( popupList );
+
+ TInt flags = CEikListBox::EDisableHighlight;
+ listBox->ConstructL( popupList, flags );
+ listBox->CreateScrollBarFrameL( ETrue );
+ listBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff,
+ CEikScrollBarFrame::EAuto );
+
+ MDesCArray* itemList = listBox->Model()->ItemTextArray();
+ CDesCArray* itemArray = ( CDesCArray* ) itemList;
+
+ //-------------------------------------------
+ // Header
+ //
+ header = StringLoader::LoadLC( R_BROWSER_DLGPROV_OBJ_DOWNLOAD_TITLE );
+ popupList->SetTitleL( *header );
+ CleanupStack::PopAndDestroy(); // header
+ header = NULL;
+
+ //-------------------------------------------
+ // Supported?
+ //
+ if ( !( aBrCtlObjectInfo->AppSupported()
+ || aBrCtlObjectInfo->PluginSupported()) ) // Object is "Not Supported"
+ {
+ HBufC* supported = StringLoader::LoadLC( R_BROWSER_DLGPROV_OBJ_DOWNLOAD_NOT_SUPPORTED );
+ itemArray->AppendL( *supported );
+ CleanupStack::PopAndDestroy(); // supported
+ }
+
+ //-------------------------------------------
+ // Application Size
+ //
+ message = HBufC::NewLC( KBrCtlObjectElementMaxLength );
+ buf = StringLoader::LoadLC( R_BROWSER_DLGPROV_OBJ_DOWNLOAD_SIZE ); // first line - bold text
+ message->Des().Append( *buf );
+ message->Des().Append( TChar( '\t' ) );
+
+ if ( aBrCtlObjectInfo->Size().Length() ) // second line - normal text
+ {
+ HBufC* size;
+ const TPtrC sizeString = aBrCtlObjectInfo->Size();
+ // convert size to int
+ TLex sizeLex( sizeString );
+ TInt sizeInt = 0;
+
+ ret = sizeLex.Val( sizeInt );
+ __ASSERT_DEBUG( !ret , User::Panic( _L("BrowserDialogsProvider"), EInvalidSizeValue ) ) ;
+
+ // KB
+ if ( sizeInt < KBrCtlMegabyte )
+ {
+ // %N KB
+ size = StringLoader::LoadLC( R_BROWSER_DLGPROV_UNIT_KB, sizeInt );
+ }
+ // MB - up to 999MB
+ else if ( sizeInt < ( KBrCtlMegabyte * 1000 ) )
+ {
+ HBufC* mbString = HBufC::NewLC( KBrCtlMBFormat );
+ HBufC* decimalSeparator = StringLoader::LoadLC( R_WML_DECIMAL_SEPARATOR );
+ TInt mb = sizeInt / KBrCtlMegabyte;
+ TInt remainder = sizeInt % KBrCtlMegabyte;
+
+ // Size shown in 3 numbers
+ mbString->Des().AppendNum( mb );
+ if ( mb < 10 )
+ {
+ // show 2 decimal places
+ mbString->Des().Append( *decimalSeparator );
+
+ // Add leading zeroes if necessary
+ if ( remainder < ( KBrCtlMegabyte / 10 ) )
+ {
+ // One leading zero needed
+ mbString->Des().AppendNum( 0 );
+ }
+
+ mbString->Des().AppendNum( ( remainder * 100 ) / KBrCtlMegabyte );
+ }
+ else if ( mb < 100 )
+ {
+ // show 1 decimal place
+ mbString->Des().Append( *decimalSeparator );
+ mbString->Des().AppendNum( ( remainder * 10 ) / KBrCtlMegabyte );
+ }
+
+ CleanupStack::PopAndDestroy(); // decimalSeparator
+
+ // %U MB
+ size = StringLoader::LoadLC( R_BROWSER_DLGPROV_UNIT_MB, *mbString );
+ CleanupStack::Pop();//size
+ CleanupStack::PopAndDestroy(); // mbString
+ CleanupStack::PushL( size );
+ }
+ // GB
+ else
+ {
+ HBufC* gb = HBufC::NewLC( KBrCtlGBFormat );
+ gb->Des().AppendNum( sizeInt / KBrCtlMegabyte );
+ size = StringLoader::LoadLC( R_BROWSER_DLGPROV_UNIT_MB, *gb );
+ CleanupStack::Pop();//size
+ CleanupStack::PopAndDestroy(); // gb
+ CleanupStack::PushL( size );
+ }
+ message->Des().Append( *size );
+ CleanupStack::PopAndDestroy(); // size
+ }
+ else
+ {
+ HBufC* sizeString = StringLoader::LoadLC( R_BROWSER_DLGPROV_OBJ_DOWNLOAD_UNKNOWN );
+ message->Des().Append( *sizeString );
+ CleanupStack::PopAndDestroy(); // sizeString
+ }
+ itemArray->AppendL( *message );
+ CleanupStack::PopAndDestroy(2); // buf , message
+ buf = NULL;
+ message = NULL;
+
+ //-------------------------------------------
+ // Application Name - only show if Supported
+ //
+ if ( aBrCtlObjectInfo->AppSupported()
+ || aBrCtlObjectInfo->PluginSupported() )
+ {
+ message = HBufC::NewLC( KBrCtlObjectElementMaxLength );
+ HBufC* appName = StringLoader::LoadLC( R_BROWSER_DLGPROV_OBJ_DOWNLOAD_OPENWITH );
+ message->Des().Append( *appName );
+ message->Des().Append( TChar( '\t' ) );
+ message->Des().Append( aBrCtlObjectInfo->AppName() );
+ itemArray->AppendL( *message );
+ CleanupStack::PopAndDestroy(2); // appName , message
+ appName = NULL;
+ message = NULL;
+ }
+
+ //-------------------------------------------
+ // (MIME) File Type
+ //
+ message = HBufC::NewLC( KBrCtlObjectElementMaxLength );
+ buf = StringLoader::LoadLC( R_BROWSER_DLGPROV_OBJ_DOWNLOAD_FILETYPE );
+ message->Des().Append( *buf );
+ message->Des().Append( TChar( '\t' ) );
+
+ if ( aBrCtlObjectInfo->FileType().Length() )
+ {
+ message->Des().Append( aBrCtlObjectInfo->FileType() );
+ }
+ else
+ {
+ HBufC* fileName = StringLoader::LoadLC( R_BROWSER_DLGPROV_OBJ_DOWNLOAD_UNKNOWN );
+ message->Des().Append( *fileName );
+ CleanupStack::PopAndDestroy(); // fileName
+ fileName = NULL;
+ }
+ itemArray->AppendL( *message );
+ CleanupStack::PopAndDestroy(2); // buf , message
+ buf = NULL;
+ message = NULL;
+
+ CleanupStack::Pop(); // popupList
+
+ iDialogs.Append( popupList ); // store ptr to dlg
+
+ // Show Dialog
+ if ( !popupList->ExecuteLD() )
+ {
+ ret = EFalse;
+ }
+ else
+ {
+ ret = ETrue;
+ }
+
+ // cleanup
+ RemoveDialogFromArray();
+ CleanupStack::PopAndDestroy(); // listBox
+ listBox = NULL;
+
+ if ( iObserver )
+ {
+ iObserver->ReportDialogEventL(
+ MBrowserDialogsProviderObserver::EDownloadObject,
+ (TInt) ret );
+ }
+
+ return ret;
+ }
+
+//-----------------------------------------------------------------------------
+//CBrowserDialogsProvider::DialogDisplayPageImagesL(
+// CArrayFixFlat<TBrCtlImageCarrier>& aPageImages )
+//-----------------------------------------------------------------------------
+EXPORT_C void CBrowserDialogsProvider::DialogDisplayPageImagesL(
+ CArrayFixFlat<TBrCtlImageCarrier>& aPageImages )
+ {
+ if (aPageImages.Count() > 1)
+ {
+ CBrowserViewImagesPopup* dialog = new (ELeave) CBrowserViewImagesPopup();
+ CleanupStack::PushL( dialog );
+ dialog->ConstructL( aPageImages );
+
+ iDialogs.Append( dialog ); // add dialog ptr to array
+ CleanupStack::Pop();
+ dialog->ExecuteLD();
+ RemoveDialogFromArray();
+ }
+ else if (aPageImages.Count() == 1)
+ {
+ CBrowserViewImagesPopup::PhotoOperationL(aPageImages[0]);
+ }
+ if ( iObserver )
+ {
+ iObserver->ReportDialogEventL(
+ MBrowserDialogsProviderObserver::EDisplayPageImages,NULL );
+ }
+ }
+
+
+//-----------------------------------------------------------------------------
+// CBrowserDialogsProvider::CancelAll()
+//
+//-----------------------------------------------------------------------------
+//
+EXPORT_C void CBrowserDialogsProvider::CancelAll()
+ {
+ // Empty the array
+ iDialogs.ResetAndDestroy();
+ }
+
+//-----------------------------------------------------------------------------
+// CBrowserDialogsProvider::RemoveDialogFromArray()
+//
+//-----------------------------------------------------------------------------
+//
+void CBrowserDialogsProvider::RemoveDialogFromArray()
+ {
+ // Do not try to remove a dialog if CancelAll() has been called
+ if ( iDialogs.Count() )
+ {
+ iDialogs.Remove( iDialogs.Count() - 1 ); // remove dialog ptr to array
+ }
+ }
+
+//-----------------------------------------------------------------------------
+// New functions
+//
+
+// ----------------------------------------------------------------------------
+// CBrowserDialogsProvider::ShowTooltip
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CBrowserDialogsProvider::ShowTooltipL( const TDesC& aText,
+ TInt aDuration,
+ TInt aDelay )
+ {
+ iTooltip->SetTextL( aText );
+ iTooltip->SetTimeDelayBeforeShow( aDelay );
+ iTooltip->SetTimePopupInView( aDuration );
+ iTooltip->ShowInfoPopupNote();
+ }
+
+
+// ----------------------------------------------------------------------------
+// CBrowserDialogsProvider::UploadProgressNoteL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CBrowserDialogsProvider::UploadProgressNoteL(
+ TInt32 aTotalSize,
+ TInt32 aChunkSize,
+ TBool aIsLastChunk,
+ MBrowserDialogsProviderObserver* aObserver )
+ {
+ // If the download is finished.
+ if( aIsLastChunk )
+ {
+ if( iUploadProgressNote )
+ {
+ // Delete progress note.
+ delete iUploadProgressNote;
+ iUploadProgressNote = NULL;
+ }
+ }
+ else
+ {
+ // If the download just started.
+ if ( !iUploadProgressNote )
+ {
+ // Create progress note.
+ iUploadProgressNote = CBrowserUploadProgressNote::NewL(
+ aTotalSize,
+ aObserver,
+ REINTERPRET_CAST ( CEikDialog**, &iUploadProgressNote ) );
+
+ iUploadProgressNote->UpdateL( aChunkSize );
+ }
+ // If the download is in progress, and needs to update.
+ else
+ {
+ // Update progress note.
+ iUploadProgressNote->UpdateL( aChunkSize );
+ }
+ }
+ }
+
+//-----------------------------------------------------------------------------
+//CBrowserDialogsProvider::DialogMimeFileSelectLC(
+// HBufC*& aSelectedFileName,
+// const TDesC& aMimeType )
+//-----------------------------------------------------------------------------
+
+EXPORT_C TBool CBrowserDialogsProvider::DialogMimeFileSelectLC(
+ HBufC*& aSelectedFileName,
+ const TDesC& aMimeType )
+ {
+ TBool selected( EFalse );
+
+ TMediaFileType mediaFileType(ENoMediaFile);
+
+ if (aMimeType.FindF(KMimeTypeImage) != KErrNotFound)
+ {
+ mediaFileType = EImageFile;
+ }
+ else if (aMimeType.FindF(KMimeTypeAudio) != KErrNotFound)
+ {
+ mediaFileType = EAudioFile;
+ }
+ else if (aMimeType.FindF(KMimeTypeVideo) != KErrNotFound)
+ {
+ mediaFileType = EVideoFile;
+ }
+
+ // if mime type not supported then use default file selector
+ if (mediaFileType == ENoMediaFile)
+ {
+ return DialogFileSelectLC(KNullDesC(), KNullDesC(), aSelectedFileName);
+ }
+
+ HBufC* buf = NULL;
+ buf = HBufC::NewLC( KMaxFileName );
+ TPtr ptr ( buf->Des() );
+
+ CDesCArrayFlat *selectedFiles = new (ELeave) CDesCArrayFlat(1);
+ CleanupStack::PushL(selectedFiles);
+
+ selected = MGFetch::RunL( *selectedFiles,
+ mediaFileType,
+ EFalse,
+ this );
+
+ if ( selected && selectedFiles->Count()>0)
+ {
+ ptr.Copy( (*selectedFiles)[0] );
+ }
+ selectedFiles->Reset();
+ CleanupStack::PopAndDestroy();//selectedFiles
+
+
+ // return fully qualified file name
+ if ( selected )
+ {
+ aSelectedFileName = buf;
+ }
+
+ if ( iObserver )
+ {
+ iObserver->ReportDialogEventL(
+ MBrowserDialogsProviderObserver::EFileSelect,
+ ( TInt ) selected );
+ }
+ return selected;
+ }
+
+TBool CBrowserDialogsProvider::VerifySelectionL
+ (const MDesCArray* aSelectedFiles)
+ {
+ return (aSelectedFiles && aSelectedFiles->MdcaCount() > 0)? ETrue: EFalse;
+ }
+
+// ----------------------------------------------------------------------------
+// CBrowserDialogsProvider::ConfirmQueryDialogL
+// ----------------------------------------------------------------------------
+//
+TInt CBrowserDialogsProvider::ConfirmQueryDialogL( const TInt aPromptResourceId,
+ TInt aResId,
+ TInt aAnimation )
+ {
+ HBufC* prompt = StringLoader::LoadLC( aPromptResourceId );
+ TInt ret = ConfirmQueryDialogL( *prompt, aResId, aAnimation );
+ CleanupStack::PopAndDestroy(); // prompt
+ return ret;
+ }
+
+// ----------------------------------------------------------------------------
+// CBrowserDialogsProvider::ConfirmQueryDialogL
+// ----------------------------------------------------------------------------
+//
+TInt CBrowserDialogsProvider::ConfirmQueryDialogL( const TDesC& aPrompt,
+ TInt aResId,
+ TInt aAnimation )
+ {
+ TInt ret;
+ CAknQueryDialog* dialog = new (ELeave) CAknQueryDialog();
+
+ // Store dialog pointer for CancelAll()
+ iDialogs.Append( dialog );
+
+ dialog->PrepareLC( R_BROWSER_CONFIRM_QUERY );
+ // passing prompt text in constructor is deprecated according to
+ // AknQueryDialog.h
+ dialog->SetPromptL( aPrompt );
+ if( aResId )
+ {
+ dialog->ButtonGroupContainer().SetCommandSetL( aResId );
+ }
+
+ if( aAnimation )
+ {
+ CAknQueryControl* control = STATIC_CAST( CAknQueryControl*, dialog->Control(EGeneralQuery) );
+ control->SetAnimationL( aAnimation );
+ }
+ ret = dialog->RunLD();
+ RemoveDialogFromArray();
+ return ret;
+ }
+
+
+// ---------------------------------------------------------
+// CBrowserDialogsProvider::GetUserPasswordL
+// ---------------------------------------------------------
+//
+TInt CBrowserDialogsProvider::GetUserPasswordL( TDes& aUsername, TDes& aPassword )
+ {
+ TInt ret;
+ CBrowserAuthenticationDialog* dialog =
+ CBrowserAuthenticationDialog::NewL( aUsername, aPassword );
+
+ iDialogs.Append( dialog ); // Store pointer for CancelAll()
+ if (JAPANESE)
+ {
+ ret = dialog->ExecuteLD( R_WB_SCRIPT_USERPASSWD_LINES_JAPAN );
+ }
+ else
+ {
+ ret = dialog->ExecuteLD( R_WB_SCRIPT_USERPASSWD_LINES_NON_JAPAN );
+ }
+ RemoveDialogFromArray();
+ return ret;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CBrowserDialogsProvider::AssureResourceL
+// -----------------------------------------------------------------------------
+//
+void CBrowserDialogsProvider::AssureResourceL()
+ {
+ if ( !iResourceOpened )
+ {
+ // Add resource file.
+ TParse* fp = new(ELeave) TParse();
+
+ TInt err = fp->Set( KBrowserDialogsProviderDirAndFile,
+ &KDC_RESOURCE_FILES_DIR,
+ NULL );
+ if ( err != KErrNone)
+ {
+ User::Leave( err );
+ }
+
+ TFileName resourceFileName = fp->FullName();
+ delete fp;
+
+ TRAPD( error, iResourceLoader.OpenL( resourceFileName ) );
+ if ( !error )
+ {
+ iResourceOpened = ETrue;
+ }
+ else
+ {
+ User::Leave( error );
+ }
+ }
+
+ if ( !iErrResourceOpened )
+ {
+ // Add error resource file.
+ TParse* errfp = new(ELeave) TParse();
+
+ TInt err = errfp->Set( KErrorResDirAndFile,
+ &KDC_RESOURCE_FILES_DIR,
+ NULL );
+ if ( err != KErrNone)
+ {
+ User::Leave( err );
+ }
+
+ TFileName errResourceFileName = errfp->FullName();
+ delete errfp;
+
+ TRAPD( error, iErrResourceLoader.OpenL( errResourceFileName ) );
+ if ( !error )
+ {
+ iErrResourceOpened = ETrue;
+ }
+ else
+ {
+ User::Leave( error );
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CBrowserDialogsProvider::DriveReady
+// -----------------------------------------------------------------------------
+//
+TInt CBrowserDialogsProvider::DriveReady( TDriveNumber aDrive )
+ {
+ RFs& fs = CCoeEnv::Static()->FsSession();
+ _LIT( KFat, "Fat" );
+ // Check if the drive is already mounted
+ TFullName name;
+ TInt error( fs.FileSystemName( name, aDrive ) );
+ if ( error )
+ {
+ return KErrNotReady;
+ }
+ else
+ {
+ // check if MMC already mounted
+ if ( name.Length() == 0 )
+ {
+ // MMC drive isnt mounted at present, so try it now....
+ error = fs.MountFileSystem( KFat, aDrive );
+
+ // If it's a locked MMC and the password is already known it'll be
+ // unlocked automatically when it's mounted., otherwise the mount will
+ // return with KErrLocked.....
+ if ( error == KErrLocked )
+ {
+ return KErrLocked;
+ }
+ }
+ }
+ return KErrNone;
+ }
+
+// END OF FILE