widgets/widgetinstaller/src/WidgetUIHandler.cpp
changeset 0 dd21522fd290
child 16 a359256acfc6
--- /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