--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/widgets/widgetinstaller/src/WidgetUIHandler.cpp Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,563 @@
+/*
+* 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 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 file contains the header file of the CMidletUI class.
+*
+* This class implements the ECom SWInstUIPluginAPI interface
+* for midlet installation.
+*
+*/
+
+#include <Avkon.rsg>
+#include <WidgetInstallerUI.rsg>
+#include <stringloader.h>
+#include <PathInfo.h>
+#include <aknnotewrappers.h>
+#include "SWInstWidgetUid.h"
+#include "WidgetInstallerInternalCRKeys.h"
+#include "WidgetUIHandler.h"
+
+
+// CONSTANTS
+const TInt KB = 1024;
+
+using namespace SwiUI;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ============================================================================
+// CWidgetUIHandler::NewL()
+// two-phase constructor
+//
+// @since 3.1
+// ============================================================================
+//
+CWidgetUIHandler* CWidgetUIHandler::NewL( TInstallMode aMode,
+ MWidgetUICancelObserver* aCancelObserver )
+ {
+ CWidgetUIHandler* self = new( ELeave ) CWidgetUIHandler( aMode, aCancelObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ============================================================================
+// CWidgetUIHandler:CWidgetUIHandler()
+// C++ default constructor
+//
+// @since 3.1
+// ============================================================================
+//
+CWidgetUIHandler::CWidgetUIHandler( TInstallMode aMode,
+ MWidgetUICancelObserver* aCancelObserver )
+ :iCancelObserver( aCancelObserver ),
+ iMode( aMode )
+ {
+ }
+
+// ============================================================================
+// CWidgetUIHandler:ConstructL()
+// Symbian default constructor
+//
+// @since 3.1
+// ============================================================================
+//
+void CWidgetUIHandler::ConstructL()
+ {
+ iCommonDialogs = CommonUI::CCUIDialogs::NewL();
+ if ( iMode == EModeInstall )
+ {
+ iProgressNumbers = new ( ELeave ) CArrayFixFlat<TInt>( 2 );
+ iProgressNumbers->ResizeL( 2 );
+ iCommonDialogs->ShowWaitDialogL( R_WIDGETUI_PREPARE, this, R_AVKON_SOFTKEYS_EMPTY );
+ }
+ }
+
+// ============================================================================
+// CWidgetUIHandler::~CWidgetUIHandler()
+// destructor
+//
+// @since 3.1
+// ============================================================================
+//
+CWidgetUIHandler::~CWidgetUIHandler()
+ {
+ delete iProgressNumbers;
+ delete iCommonDialogs;
+ }
+
+
+// ============================================================================
+// CWidgetUIHandler::DisplayInstallL()
+// Displays a dialog at the beginning of an installation
+//
+// @since 3.1
+// ============================================================================
+//
+TBool CWidgetUIHandler::DisplayInstallL(
+ const TDesC& aWidgetName
+ )
+ {
+ iShowingDialog = ETrue;
+
+ // Close the preparing wait dialog
+ iCommonDialogs->CloseWaitDialogL();
+
+ TBool result( EFalse );
+
+ HBufC* prompt = StringLoader::LoadLC( R_WIDGETUI_INSTALL_PROMPT, aWidgetName );
+ if ( iCommonDialogs->ShowConfirmationQueryL( *prompt, R_AVKON_SOFTKEYS_YES_NO ) )
+ {
+ result = ETrue;
+ }
+ else
+ {
+ // Make sure no notes are shown after this
+ iShownFinalNote = ETrue;
+ }
+
+ CleanupStack::PopAndDestroy( prompt );
+
+ iShowingDialog = EFalse;
+ return result;
+ }
+
+// ============================================================================
+// CWidgetUIHandler::DisplayOverwriteL()
+// Displays a dialog at the beginning of an update
+//
+// @since 3.1
+// ============================================================================
+//
+TBool CWidgetUIHandler::DisplayOverwriteL(
+ const TDesC& aWidgetName
+ )
+ {
+ iShowingDialog = ETrue;
+
+ // Close the preparing wait dialog
+ iCommonDialogs->CloseWaitDialogL();
+
+ TBool result( EFalse ); // false means user says no/cancel/stop
+
+ HBufC* prompt = StringLoader::LoadLC( R_WIDGETUI_OVERWRITE_PROMPT, aWidgetName );
+ if ( iCommonDialogs->ShowConfirmationQueryL( *prompt, R_AVKON_SOFTKEYS_YES_NO ) )
+ {
+ result = ETrue;
+ }
+ else
+ {
+ // Make sure no notes are shown after this
+ iShownFinalNote = ETrue;
+ }
+
+ CleanupStack::PopAndDestroy( prompt );
+
+ iShowingDialog = EFalse;
+ return result;
+ }
+
+
+// ============================================================================
+// CWidgetUIHandler::DisplayUpgradeL()
+// Displays a dialog asking whether we want to upgrade an application present on the device.
+//
+// @since 3.1
+// ============================================================================
+//
+TBool CWidgetUIHandler::DisplayUpgradeL( const Swi::CAppInfo& /*aAppInfo*/,
+ const Swi::CAppInfo& /*aExistingAppInfo*/ )
+ {
+ return ETrue;
+ }
+
+// ============================================================================
+// CWidgetUIHandler::DisplayUninstallL()
+// Displays a dialog at the start of the uninstallation with
+// information about the application to be uninstalled.
+//
+// @since 3.1
+// ============================================================================
+//
+TBool CWidgetUIHandler::DisplayUninstallL( const TDesC& aWidgetName )
+ {
+ iShowingDialog = ETrue;
+
+ // Close the preparing wait dialog
+ iCommonDialogs->CloseWaitDialogL();
+
+ TBool result( EFalse );
+
+ HBufC* prompt = StringLoader::LoadLC( R_WIDGETUI_UNINSTALL_PROMPT, aWidgetName );
+ if ( iCommonDialogs->ShowConfirmationQueryL( *prompt, R_AVKON_SOFTKEYS_YES_NO ) )
+ {
+ result = ETrue;
+ }
+ else
+ {
+ // Make sure no notes are shown after this
+ iShownFinalNote = ETrue;
+ }
+
+ CleanupStack::PopAndDestroy( prompt );
+
+ iShowingDialog = EFalse;
+ return result;
+ }
+
+// ============================================================================
+// CWidgetUIHandler::DisplayTextL()
+// Displays a dialog with given text
+//
+// @since 3.1
+// ============================================================================
+//
+TBool CWidgetUIHandler::DisplayTextL( const TDesC& /*aText*/ )
+ {
+ return ETrue;
+ }
+
+// ============================================================================
+// CWidgetUIHandler::DisplayErrorL()
+// Displays a dialog with given error
+//
+// @since 3.1
+// ============================================================================
+//
+void CWidgetUIHandler::DisplayErrorL( TInt aErr )
+ {
+ iShowingDialog = ETrue;
+ HBufC* prompt = NULL;
+
+ switch ( aErr )
+ {
+ case KErrNotSupported:
+ prompt = StringLoader::LoadLC( R_WIDGETUI_UNSUPPORTED );
+ break;
+ case KErrCorrupt:
+ prompt = StringLoader::LoadLC( R_WIDGETUI_CORRUPTED );
+ break;
+ case KErrNoMemory:
+ prompt = StringLoader::LoadLC( R_WIDGETUI_NO_MEMORY );
+ break;
+ case KErrInUse:
+ prompt = StringLoader::LoadLC( R_WIDGETUI_ERR_INUSE );
+ break;
+ default:
+ prompt = StringLoader::LoadLC( R_WIDGETUI_ERR_GENERAL );
+ break;
+ }
+
+ iCommonDialogs->ShowErrorNoteL( prompt->Des() );
+ CleanupStack::PopAndDestroy(); // prompt
+
+ iShowingDialog = EFalse;
+ }
+
+// ============================================================================
+// CWidgetUIHandler::DisplayApplicationsInUseL()
+// Displays a dialog with information that the widget is already in use
+//
+// @since 3.1
+// ============================================================================
+//
+TBool CWidgetUIHandler::DisplayApplicationsInUseL( const Swi::CAppInfo& /*aAppInfo*/,
+ const RPointerArray<TDesC>& /*aAppNames*/ )
+ {
+ return ETrue;
+ }
+
+// ============================================================================
+// CWidgetUIHandler::HandleDialogExitL()
+// when user click softkey during progress dialog
+//
+// @since 3.1
+// ============================================================================
+//
+TBool CWidgetUIHandler::HandleDialogExitL( TInt aButtonId )
+ {
+ TBool result( EFalse );
+
+ if ( aButtonId == EAknSoftkeyCancel )
+ {
+ result = ETrue;
+ iCancelObserver->UserCancelL( EFalse );
+ }
+
+ return result;
+ }
+
+// ============================================================================
+// CWidgetUIHandler::UpdateProgessDialogL
+// Increments installation progress
+//
+// @since 3.1
+// ============================================================================
+//
+void CWidgetUIHandler::UpdateProgressDialogL( TInt aSize )
+{
+ iInstalledSize += aSize;
+
+ // rest just updates strings showing kilobytes processed
+ if ( KB < iUncompressedSize ) // if less than 1K then dialog is meaningless
+ {
+ iCommonDialogs->UpdateProgressDialogValueL( aSize );
+ (*iProgressNumbers)[0] = iInstalledSize / KB;
+ HBufC* displayString = StringLoader::LoadLC( R_WIDGETUI_PROGRESS, *iProgressNumbers );
+ iCommonDialogs->ShowProgressDialogL( *displayString, this ); // just updates size strings
+ CleanupStack::PopAndDestroy(); // displayString
+ }
+}
+
+// ============================================================================
+// CWidgetUIHandler::DisplayProgessDialogL
+// Starts installation progress dialog display
+//
+// @since 3.1
+// ============================================================================
+//
+void CWidgetUIHandler::DisplayProgressDialogL()
+ {
+ iInstalledSize = 0;
+
+ if ( KB < iUncompressedSize ) // if less than 1K then dialog is meaningless
+ {
+ (*iProgressNumbers)[0] = 0;
+ (*iProgressNumbers)[1] = iUncompressedSize / KB;
+ HBufC* displayString = StringLoader::LoadLC( R_WIDGETUI_PROGRESS, *iProgressNumbers );
+ iCommonDialogs->ShowProgressDialogL( *displayString, this );
+ iCommonDialogs->SetProgressDialogFinalValueL( iUncompressedSize );
+ CleanupStack::PopAndDestroy(); // displayString
+ }
+}
+
+
+// ============================================================================
+// CWidgetUIHandler::SelectDriveL
+// Asks the UI for a drive to select.
+// (other items were commented in a header).
+//
+// @since 3.1
+// ============================================================================
+//
+TBool CWidgetUIHandler::SelectDriveL( RFs& aFs,
+ TDriveUnit& aDrive,
+ TBool& aSufficientSpace,
+ TInt aTotalSize)
+ {
+ aSufficientSpace = EFalse;
+ TBool result( EFalse );
+
+ iShowingDialog = ETrue;
+ iUncompressedSize = aTotalSize;
+
+ TInt error = KErrNone;
+
+ // List of all possible installation detination drives
+ RArray<TDriveUnit> driveUnits;
+ CleanupClosePushL( driveUnits );
+ // and free memory space in those drives
+ RArray<TInt64> driveSpaces;
+ CleanupClosePushL( driveSpaces );
+
+ // List all drives in the system
+ TDriveList driveList;
+ User::LeaveIfError( aFs.DriveList(driveList) );
+
+ // Check all drives
+ for ( TInt driveNumber = EDriveA; driveNumber <= EDriveZ; driveNumber++ )
+ {
+ if ( EDriveD == driveNumber)
+ {
+ // The drive is not suitable for installation
+ continue;
+ }
+
+ if ( !driveList[driveNumber] )
+ {
+ // Not a recognised drive
+ continue;
+ }
+
+ TVolumeInfo volInfo;
+ if ( aFs.Volume( volInfo, driveNumber ) != KErrNone )
+ {
+ // The volume is not usable (e.g. no media card inserted)
+ continue;
+ }
+
+ if ( volInfo.iDrive.iType==EMediaNotPresent ||
+ volInfo.iDrive.iType==EMediaRom ||
+ volInfo.iDrive.iType==EMediaRemote )
+ {
+ // Exclude drives not suitable for installation
+ continue;
+ }
+
+ // Exclude read only and substituted drives
+ if ( volInfo.iDrive.iDriveAtt & KDriveAttRom ||
+ volInfo.iDrive.iDriveAtt & KDriveAttSubsted )
+ {
+ continue;
+ }
+
+ // Check whether the drive is usable for installation! E.g. not a
+ // temporary ram drive. This is vendor-implemented function which is
+ // device-specific.
+// PlpVariant library doesn't have any implementation for DriveStatusL() yet
+// if (PlpVariant::DriveStatusL(static_cast<TDriveNumber>(driveNumber)) !=
+// static_cast<TUint32> (KErrNone))
+
+ TInt64 volSpace = volInfo.iFree; // bytes
+ User::LeaveIfError( driveUnits.Append( TDriveUnit( driveNumber ) ) );
+ User::LeaveIfError( driveSpaces.Append( volSpace / KB ) );
+ }
+
+ TInt selection( 0 );
+
+ error = iCommonDialogs->ShowDriveSelectionDialogL( aTotalSize,
+ driveUnits,
+ driveSpaces,
+ selection );
+ if ( error == KErrNoMemory )
+ {
+ // The engine will call us with proper ota status ( no memory )
+ aSufficientSpace = EFalse;
+ result = ETrue;
+ }
+ else if ( error == KErrCancel )
+ {
+ // User cancelled the query
+ aSufficientSpace = ETrue;
+ result = EFalse;
+ }
+ else
+ {
+ // OK To install
+ result = ETrue;
+ aDrive = driveUnits[selection];
+ aSufficientSpace = ETrue;
+ }
+
+ CleanupStack::PopAndDestroy( 2 ); // &driveSpaces, &driveUnits
+
+ iShowingDialog = EFalse;
+
+ return result;
+ }
+
+// ============================================================================
+// CWidgetUIInstallHandler::DisplayCompleteL()
+// Display install completed information
+//
+// @since 3.1
+// ============================================================================
+//
+void CWidgetUIHandler::DisplayCompleteL()
+ {
+ if ( !iShownFinalNote )
+ {
+ HBufC* string = NULL;
+ if ( iMode == EModeInstall )
+ {
+ string = StringLoader::LoadLC( R_WIDGETUI_INSTALL_COMPLETED );
+ }
+ else
+ {
+ string = StringLoader::LoadLC( R_WIDGETUI_UNINSTALL_COMPLETED );
+ }
+
+ CAknConfirmationNote* note = new (ELeave) CAknConfirmationNote( ETrue );
+ note->ExecuteLD( *string );
+ CleanupStack::PopAndDestroy( string );
+ }
+
+ iShownFinalNote = ETrue;
+ }
+
+// ============================================================================
+// CWidgetUIInstallHandler::DisplayCancelL()
+// Display install canceled information
+//
+// @since 3.1
+// ============================================================================
+//
+void CWidgetUIHandler::DisplayCancelL()
+{
+ HBufC* string = NULL;
+ if ( iMode == EModeInstall )
+ {
+ string = StringLoader::LoadLC( R_WIDGETUI_INSTALL_CANCELED );
+ }
+ else
+ {
+ string = StringLoader::LoadLC( R_WIDGETUI_UNINSTALL_CANCELED );
+ }
+
+ CAknConfirmationNote* note = new ( ELeave ) CAknConfirmationNote( ETrue );
+ note->ExecuteLD( *string );
+ CleanupStack::PopAndDestroy( string );
+}
+
+// ============================================================================
+// CWidgetUIInstallHandler::DisplayFinalizeDialogL()
+// Display the finalize dialog
+//
+// @since 3.1
+// ============================================================================
+//
+void CWidgetUIHandler::DisplayFinalizeDialogL()
+ {
+ iCommonDialogs->ShowWaitDialogL( R_WIDGETUI_FINALIZE_INSTALL,
+ this, R_AVKON_SOFTKEYS_EMPTY );
+ }
+
+// ============================================================================
+// CWidgetUIInstallHandler::DisplayUninstallInProgressL()
+// Display the finalize dialog
+//
+// @since 5.0
+// ============================================================================
+//
+void CWidgetUIHandler::DisplayUninstallInProgressL()
+ {
+ iCommonDialogs->ShowWaitDialogL( R_WIDGETUI_UNINSTALL_PROGRESS,
+ this, R_AVKON_SOFTKEYS_EMPTY );
+ }
+
+// ============================================================================
+// CWidgetUIInstallHandler::DisplayUntrustedSecurityDialogL()
+// Display the untrusted widget dialog
+//
+// @since 5.0
+// ============================================================================
+//
+TBool CWidgetUIHandler::DisplayUntrustedSecurityDialogL()
+ {
+ // Untrusted Widget Installation dialog
+ TInt securityPrompt(0);
+ TBool resp(ETrue);
+ TRAP_IGNORE(
+ CRepository* rep = CRepository::NewL( TUid::Uid( KSWInstWidgetUIUid ) );
+ rep->Get( KWidgetSecurityPromptUntrustedInstall, securityPrompt );
+ delete rep; );
+
+ if (securityPrompt)
+ {
+ resp = iCommonDialogs->ShowSecurityWarningDialogL();
+ }
+ return resp;
+ }
+
+// End of File