diff -r 491b3ed49290 -r 65326cf895ed deviceencryption/DevEncUi/src/DevEncUiAppui.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/deviceencryption/DevEncUi/src/DevEncUiAppui.cpp Wed Sep 01 12:31:07 2010 +0100 @@ -0,0 +1,565 @@ +/* +* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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 CDevEncUiAppUi. +* +*/ + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include // Help launcher +#include // TBD: Needed? +#include +#include + +#include "DevEncLog.h" +#include "DevEnc.hrh" +#include "DevEncUi.pan" +#include "DevEncUiAppui.h" +#include "DevEncUiEncrView.h" +#include "DevEncUiEncryptionOperator.h" +#include "DevEncUiDecrView.h" + +#include "DevEncUiMainView.h" +#include "DevEncUiMemoryEntity.h" +#include "DevEncUids.hrh" + +#include + +//Local definitions +const TInt KDevEncUiConstructionDelay( 1000000 ); + +// ============================ MEMBER FUNCTIONS =============================== + +// -------------------------------------------------------------------------- +// CDevEncUiAppUi::ConstructL() +// Symbian 2nd phase constructor can leave. +// -------------------------------------------------------------------------- +// +void CDevEncUiAppUi::ConstructL() + { + // Initialise app UI with standard value. + BaseConstructL( EAknEnableSkin | EAknSingleClickCompatible ); + + DFLOG( ">>CDevEncUiAppUi::ConstructL" ); + + User::LeaveIfError( iFs.Connect() ); + + DFLOG( "CDevEncUiAppUi::ConstructL => Create drive path" ); + // Create private folder. TBD: Needed? + TInt error = iFs.CreatePrivatePath( EDriveC ); + if ( error == KErrAlreadyExists ) + { + error = KErrNone; + } + DFLOG( "CDevEncUiAppUi::ConstructL => Leave ?" ); + User::LeaveIfError( error ); + DFLOG( "CDevEncUiAppUi::ConstructL => No, constructing CR" ); + + // Central repository settings + iCrSettings = CRepository::NewL( TUid::Uid( KCRDevEncUiSettings ) ); + DFLOG( "CDevEncUiAppUi::ConstructL => Adding observer" ); + + // Create MMC observer + iObserver = CMmcObserver::NewL( this, &iFs ); + iObserver->StartObserver(); + + // Call the MMC callback function once to get the initial card status + MMCStatusChangedL(); + + DFLOG( "CDevEncUiAppUi::ConstructL => constructing mass memory" ); + + CDevEncUiMemoryEntity* massMemory = CDevEncUiMemoryEntity::NewLC( iEikonEnv, + EPhoneMemory ); + + DFLOG( "CDevEncUiAppUi::ConstructL => adding to mem entities" ); + iMemEntities.AppendL( massMemory ); + CleanupStack::Pop( massMemory ); + + DFLOG( "CDevEncUiAppUi::ConstructL => constructing memory card" ); + + CDevEncUiMemoryEntity* memoryCard = CDevEncUiMemoryEntity::NewLC( iEikonEnv, + EMemoryCard ); + + DFLOG( "CDevEncUiAppUi::ConstructL => adding to mem entities" ); + iMemEntities.AppendL( memoryCard ); + CleanupStack::Pop( memoryCard ); + + DFLOG( "CDevEncUiAppUi::ConstructL => constructing phone memory" ); + + CDevEncUiMemoryEntity* phoneMemory = CDevEncUiMemoryEntity::NewLC( iEikonEnv, + EPrimaryPhoneMemory ); + + DFLOG( "CDevEncUiAppUi::ConstructL => adding to mem entities" ); + iMemEntities.AppendL( phoneMemory ); + CleanupStack::Pop( phoneMemory ); + + DFLOG( "CDevEncUiAppUi::ConstructL() => Create enc operator" ); + + // Create encryption operator + iEncOperator = CDevEncUiEncryptionOperator::NewL( *iEikonEnv, + *this, + iCrSettings ); + + DFLOG( "CDevEncUiAppUi::ConstructL() => Create views" ); + + // Create views + iMainView = CDevEncUiMainView::NewL( iMemEntities, + iCrSettings, + iMmcStatus ); + + AddViewL( iMainView ); // transfer ownership + + iEncryptionView = CDevEncUiEncrView::NewL( iMemEntities ); + AddViewL( iEncryptionView ); // transfer ownership + + iDecryptionView = CDevEncUiDecrView::NewL( iMemEntities ); + AddViewL( iDecryptionView ); // transfer ownership + + SetDefaultViewL( *iMainView ); + + DFLOG( "ConstructL 6" ); + + iConstructionOnGoing = ETrue; + + iTimer = CDevEncUiTimer::NewL( this ); + iTimer->After( KDevEncUiConstructionDelay ); + + DFLOG( "<>CDevEncUiAppUi::~CDevEncUiAppUi" ); + delete iObserver; + iFs.Close(); + delete iEncOperator; + if (iMemEntities.Count()) + iMemEntities[ EMemoryCard ]->RemoveObserver( this ); + for ( TInt i = 0; i < iMemEntities.Count(); i++ ) + { + delete iMemEntities[i]; + } + iMemEntities.Close(); + delete iCrSettings; + delete iTimer; + } + +// -------------------------------------------------------------------------- +// CDevEncUiAppUi::HandleCommandL() +// Takes care of command handling. +// -------------------------------------------------------------------------- +// +void CDevEncUiAppUi::HandleCommandL( TInt aCommand ) + { + DFLOG( ">>CDevEncUiAppUi::HandleCommandL" ); + + switch( aCommand ) + { + // These commands are specific to the memory card + case EDevEncUiCommandEncryptWithoutSavingKey: // fall through + case EDevEncUiCommandEncryptAndSaveKey: + case EDevEncUiCommandEncryptWithRestoredKey: + { + // Pass the MMC memory entity to the operator, along with the command + iEncOperator->HandleMmcEncryptRequestL( iMemEntities[ EMemoryCard ], + aCommand ); + break; + } + + case EDevEncUiCommandDecrypt: // fall through + case EDevEncUiCommandDecryptAndTurnOffEncryption: + { + // Pass the MMC memory entity to the operator, along with the command + iEncOperator->HandleMmcDecryptRequestL( iMemEntities[ EMemoryCard ], + aCommand ); + break; + } + + case EDevEncUiCommandHelp: + { + DisplayHelpL(); + break; + } + + case EAknSoftkeyBack: + { + // Get the current view + TVwsViewId wsViewId; + TInt err = GetActiveViewId( wsViewId ); + if ( ( err != KErrNone ) || + ( wsViewId.iAppUid.iUid != KDevEncUiUid ) ) + { + User::Leave( err ); + } + + // Go to the main view from the encryption and decryption views + if ( wsViewId.iViewUid.iUid == EDevEncUiEncrViewId || + wsViewId.iViewUid.iUid == EDevEncUiDecrViewId ) + { + ActivateLocalViewL( TUid::Uid( EDevEncUiMainViewId ) ); + } + if ( wsViewId.iViewUid.iUid == EDevEncUiMainViewId ) + { + Exit(); + } + break; + } + + case EEikCmdExit: // fall through + case EAknSoftkeyExit: + { + Exit(); + break; + } + + default: + Panic( EDevEncUi ); + break; + } + } + +// -------------------------------------------------------------------------- +// Called by the framework when the app is moved to or from foreground. +// +// -------------------------------------------------------------------------- +// +void CDevEncUiAppUi::HandleForegroundEventL( TBool aForeground ) + { + DFLOG( "CDevEncUiAppUi::HandleForegroundEventL" ); + DFLOG2( "CDevEncUiAppUi::HandleForegroundEventL => aForeground = %d ", aForeground ); + CAknAppUi::HandleForegroundEventL( aForeground ); + + iForeground = aForeground; + + if( iConstructionOnGoing ) + { + DFLOG( "CDevEncUiAppUi::HandleForegroundEventL => Construction on going" ); + if( iTimer ) + { + iTimer->Cancel(); + } + iTimer->After( KDevEncUiConstructionDelay ); + } + } + +// -------------------------------------------------------------------------- +// Called by the framework before the options menu is shown. +// Sets the correct menu items. +// -------------------------------------------------------------------------- +// +void CDevEncUiAppUi::DynInitMenuPaneL( TInt /*aResourceId*/, + CEikMenuPane* /*aMenuPane*/ ) + { + } + +// -------------------------------------------------------------------------- +// Called by the framework before the context-sensitive help is shown. +// Sets the correct menu items. +// -------------------------------------------------------------------------- +// +//CArrayFix* CDevEncUiAppUi::HelpContextL() +// { +// TCoeHelpContext& aContext +// } + +// -------------------------------------------------------------------------- +// Called by the framework before the context-sensitive help is shown. +// Sets the correct menu items. +// -------------------------------------------------------------------------- +void CDevEncUiAppUi::DisplayHelpL() + { + CArrayFix* contexts = + new ( ELeave ) CArrayFixFlat( 1 ); + CleanupStack::PushL( contexts ); + TCoeHelpContext context; + context.iMajor = TUid::Uid( KDevEncUiUid ); + + // Get the currently active view + TVwsViewId wsViewId; + TInt err = GetActiveViewId( wsViewId ); + if ( ( err != KErrNone ) || + ( wsViewId.iAppUid.iUid != KDevEncUiUid ) ) + { + User::Leave( err ); + } + + // Set the help context for the current view + switch ( wsViewId.iViewUid.iUid ) + { + case EDevEncUiEncrViewId: + { + context.iContext = KES_HLP_ENCRYPTION_ENCRYPT; + } + break; + case EDevEncUiDecrViewId: + { + context.iContext = KES_HLP_ENCRYPTION_DECRYPT; + } + break; + default: // Main view + { + context.iContext = KES_HLP_ENCRYPTION_MAIN; + } + break; + } + + contexts->AppendL( context ); + CleanupStack::Pop( contexts ); + HlpLauncher::LaunchHelpApplicationL( iCoeEnv->WsSession(), contexts ); + } + +// -------------------------------------------------------------------------- +// Called by CDevEncMmcObserver when MMC status changes. +// +// -------------------------------------------------------------------------- +void CDevEncUiAppUi::MMCStatusChangedL() + { + DFLOG( "CDevEncUiAppUi::MMCStatusChangedL" ); + TVolumeInfo volInfo; + + TInt err = iFs.Volume( volInfo, /*EDriveE*/EDriveF ); + switch ( err ) + { + case KErrNone: + { + // Readable MMC inserted + DFLOG( "MMC inserted" ); + iMmcStatus = EMmcOk; + break; + } + + case KErrNotReady: + { + // MMC ejected + DFLOG( "MMC ejected" ); + iMmcStatus = EMmcNotPresent; + break; + } + + case KErrCorrupt: + { + // Corrupt or unformatted MMC, or wrong key + DFLOG( "MMC corrupt, unformatted or encrypted with other key" ); + iMmcStatus = EMmcNotReadable; + break; + } + + default: + { + DFLOG2( "RFs::Volume returned error %d", err ); + break; + } + } // switch + } + +// -------------------------------------------------------------------------- +// Called by memory entity when memory status changes. +// +// -------------------------------------------------------------------------- +void CDevEncUiAppUi::UpdateInfo( TDevEncUiMemoryType aType, + TUint aState, + TUint /*aProgress*/ ) + { + DFLOG( "CDevEncUiAppUi::UpdateInfo" ); + TInt error( KErrNone ); + TRAP( error, DoUpdateInfoL( aType, aState ) ); + DFLOG2( "CDevEncUiAppUi::DoUpdateInfo returned %d", error ); + } + +// -------------------------------------------------------------------------- +// Helper function called by UpdateInfo when memory status changes. +// +// -------------------------------------------------------------------------- +void CDevEncUiAppUi::DoUpdateInfoL( TDevEncUiMemoryType aType, + TUint aState ) + { + DFLOG( ">>CDevEncUiAppUi::DoUpdateInfoL" ); + if ( aType != EMemoryCard ) + { + return; + } + + // Prevent re-entry + if ( iStatusUpdateOngoing ) + { + return; + } + iStatusUpdateOngoing = ETrue; + + DFLOG3( "CDevEncUiAppUi::DoUpdateInfoL, type %d, state %d", + aType, aState ); + DFLOG2( "Mmc state %d", iMmcStatus ); + DFLOG2( "Enc state %d", iMmcEncState ); + + // Check encryption key status + TInt mmcKeyInDriver( 0 ); + iCrSettings->Get( KDevEncUserSettingMemoryCard, mmcKeyInDriver ); + + if ( ( iMmcStatus == EMmcOk ) && + ( iMmcEncState == EUnmounted ) && + ( aState == EDecrypted ) ) + { + // A readable memory card has just been inserted + + if ( mmcKeyInDriver ) + { + // We have a valid encryption key, but the newly inserted + // card is decrypted. Ask if the user wants to encrypt. + // (see UI spec 2.13) + iEncOperator->SuggestMmcEncryptionL( + iMemEntities[ EMemoryCard ] ); + } + } + + if ( ( iMmcStatus == EMmcNotReadable ) && + ( iMmcEncState == EUnmounted ) && + ( aState == ECorrupted ) ) + { + // An unreadable memory card has just been inserted + + if ( mmcKeyInDriver ) + { + // We seem to have the wrong encryption key in the driver. + // Inform the user that the card cannot be used. + // (see UI spec 2.16) + iEncOperator->ErrorNoteL( + R_DEVENCUI_TEXT_NOTE_INSERTON_UNUSEDMEMORYCARD ); + } + else + { + DFLOG( "CDevEncUiAppUi::DoUpdateInfoL => SuggestMmcDecryption" ); + // We have no encryption key in the driver. + // Ask if the user wants to import a key and decrypt. + // (see UI spec 2.17) + iEncOperator->SuggestMmcDecryptionL( + iMemEntities[ EMemoryCard ] ); + } + } + + iMmcEncState = aState; + iStatusUpdateOngoing = EFalse; + DFLOG( "< Construction completed" ); + //the construction is completed now + iConstructionOnGoing = EFalse; + // This class needs to observe memory card status changes. + // (This call results in a call to UpdateInfo, hence we need to be fully + // constructed before this.) + TRAP_IGNORE(iMemEntities[ EMemoryCard ]->AddObserverL( this )); + + } + } + +// ----------------------------------------------------------------------------- +// CDevEncUiAppUi::ProcessCommandParametersL +// From CEikAppUi +// ----------------------------------------------------------------------------- +// +TBool CDevEncUiAppUi::ProcessCommandParametersL( + TApaCommand /*aCommand*/, + TFileName& /*aDocumentName*/, + const TDesC8& /*aTail*/ ) + { + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CDevEncUiAppUi::OpenFileL +// ----------------------------------------------------------------------------- +// +void CDevEncUiAppUi::OpenFileL(const TDesC& /*aFilename*/) + { + DFLOG("CDevEncUiAppUi::OpenFileL"); + } + +// ----------------------------------------------------------------------------- +// CDevEncUiAppUi::OpenFileL() +// ----------------------------------------------------------------------------- +// +void CDevEncUiAppUi::OpenFileL(RFile& aFile) + { + _LIT(KTargetDir,"c:\\data\\others\\"); + TBuf16<100> destinationPath; + destinationPath.Copy( KTargetDir ); + TBuf16<250> sourcePath; + aFile.FullName( sourcePath ); + + // if the paths are the same, the copy operation will not be executed + if ( sourcePath.Left( destinationPath.Length() ).CompareF( destinationPath ) ) + { + // copy the file to Others folder + TRAPD(err, CopyL( sourcePath, destinationPath )); + + if( err == KErrNone ) + { + iEncOperator->InfoNoteL( R_DEVENCUI_TEXT_NOTE_SAVEINFO, ETrue ); + ActivateLocalViewL( TUid::Uid( EDevEncUiMainViewId ) ); + } + else + { + Exit(); + } + } + else + { + ActivateLocalViewL( TUid::Uid( EDevEncUiMainViewId ) ); + } + } + +// ----------------------------------------------------------------------------- +// CDevEncUiAppUi::Copy() +// ----------------------------------------------------------------------------- +// +void CDevEncUiAppUi::CopyL(const TDesC &anOld, const TDesC &aNew) + { + CFileMan* fileMan=CFileMan::NewL( iFs ); + CleanupStack::PushL( fileMan ); + + User::LeaveIfError(fileMan->Copy( anOld, aNew )); + + CleanupStack::PopAndDestroy( fileMan ); + } + +// End of File