deviceencryption/DevEncUi/src/DevEncUiEncryptionOperator.cpp
changeset 0 6a9f87576119
child 5 1e73d2d04cbc
equal deleted inserted replaced
-1:000000000000 0:6a9f87576119
       
     1 /*
       
     2 * Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0""
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Implementation of CDevEncUiEncryptionOperator.
       
    15 *
       
    16 */
       
    17 
       
    18 // INCLUDE FILES
       
    19 #include <DevEncExternalCRKeys.h>
       
    20 // Class includes
       
    21 #include "DevEncLog.h"
       
    22 #include "DevEncUids.hrh"
       
    23 #include "DevEncUiEncryptionOperator.h"
       
    24 
       
    25 #include "DevEncUiFileManager.h"
       
    26 
       
    27 //System includes
       
    28 #include <aknmessagequerydialog.h>
       
    29 #include <aknViewAppUi.h>
       
    30 #include <AknWaitNoteWrapper.h>
       
    31 #include <aknnotewrappers.h> // for CAknErrorNote
       
    32 #include <bautils.h> // For BAFL, localized resource files
       
    33 #include <centralrepository.h>
       
    34 #include <coemain.h>
       
    35 #include <data_caging_path_literals.hrh> // for resource files dir
       
    36 #include <DevEncUi.rsg>
       
    37 #include <eikenv.h>
       
    38 #include <e32property.h>
       
    39 #include <etelmm.h>
       
    40 #include <f32file.h>
       
    41 #include <gsfwviewuids.h> // For general settings view UIDs (autolock)
       
    42 #include <hwrmpowerstatesdkpskeys.h> // For power state
       
    43 #include <SecUiSecuritySettings.h> // for autolock
       
    44 #include <SettingsInternalCRKeys.h>
       
    45 #include <StringLoader.h>
       
    46 #include <utf.h> // For character conversion
       
    47 #include <TerminalControl3rdPartyAPI.h>
       
    48 
       
    49 #include <DevEncKeyUtils.h>
       
    50 
       
    51 //User includes
       
    52 #include "DevEncLog.h"
       
    53 #include "DevEnc.hrh"
       
    54 #include "DevEncUiCreateKeyProcess.h"
       
    55 #include "DevEncDef.h"
       
    56 #include "DevEncUiMemoryEntity.h"
       
    57 #include "DevEncUiSecretMinMaxCodeQuery.h"
       
    58 //for KMaxAutolockPeriod = 20;
       
    59 #include "DevEncSession.h"
       
    60 
       
    61 // --------------------------------------------------------------------------
       
    62 // CDevEncUiEncryptionOperator::~CDevEncUiEncryptionOperator
       
    63 //
       
    64 // --------------------------------------------------------------------------
       
    65 //
       
    66 CDevEncUiEncryptionOperator::~CDevEncUiEncryptionOperator()
       
    67     {
       
    68     }
       
    69 
       
    70 // --------------------------------------------------------------------------
       
    71 // CDevEncUiEncryptionOperator::NewL
       
    72 //
       
    73 // --------------------------------------------------------------------------
       
    74 //
       
    75 CDevEncUiEncryptionOperator* CDevEncUiEncryptionOperator::NewL( CEikonEnv& aEikonEnv,
       
    76                                                                 CAknViewAppUi& aAppUi,
       
    77                                                                 CRepository*& aCrSettings )
       
    78     {
       
    79     CDevEncUiEncryptionOperator* self =
       
    80         CDevEncUiEncryptionOperator::NewLC( aEikonEnv,
       
    81                                             aAppUi,
       
    82                                             aCrSettings );
       
    83     CleanupStack::Pop( self );
       
    84     return self;
       
    85     }
       
    86 
       
    87 // --------------------------------------------------------------------------
       
    88 // CDevEncUiEncryptionOperator::NewLC
       
    89 //
       
    90 // --------------------------------------------------------------------------
       
    91 //
       
    92 CDevEncUiEncryptionOperator* CDevEncUiEncryptionOperator::NewLC( CEikonEnv& aEikonEnv,
       
    93                                                                  CAknViewAppUi& aAppUi,
       
    94                                                                  CRepository*& aCrSettings )
       
    95     {
       
    96     CDevEncUiEncryptionOperator* self =
       
    97         new ( ELeave ) CDevEncUiEncryptionOperator( aEikonEnv,
       
    98                                                     aAppUi,
       
    99                                                     aCrSettings );
       
   100     CleanupStack::PushL( self );
       
   101     self->ConstructL();
       
   102     return self;
       
   103     }
       
   104 
       
   105 // --------------------------------------------------------------------------
       
   106 // CDevEncUiEncryptionOperator::CDevEncUiEncryptionOperator
       
   107 //
       
   108 // --------------------------------------------------------------------------
       
   109 //
       
   110 CDevEncUiEncryptionOperator::CDevEncUiEncryptionOperator( CEikonEnv& aEikonEnv,
       
   111                                                           CAknViewAppUi& aAppUi,
       
   112                                                           CRepository*& aCrSettings )
       
   113     : iEikEnv( aEikonEnv ),
       
   114     iAppUi( aAppUi ),
       
   115     iCrSettings( aCrSettings )
       
   116     {
       
   117     }
       
   118 
       
   119 // --------------------------------------------------------------------------
       
   120 // CDevEncUiEncryptionOperator::ConstructL
       
   121 //
       
   122 // --------------------------------------------------------------------------
       
   123 //
       
   124 void CDevEncUiEncryptionOperator::ConstructL()
       
   125     {
       
   126     }
       
   127 
       
   128 // --------------------------------------------------------------------------
       
   129 // CDevEncUiEncryptionOperator::HandlePhoneMemEncryptRequestL()
       
   130 // --------------------------------------------------------------------------
       
   131 //
       
   132 void CDevEncUiEncryptionOperator::HandlePhoneMemEncryptRequestL( CDevEncUiMemoryEntity* aMem, CDevEncUiMemoryEntity* aPrimaryMem )
       
   133     {
       
   134     // Check the battery level first
       
   135     if ( ! CheckBatteryL() )
       
   136         {
       
   137         // The battery level is too low and no charger is connected.
       
   138         // Show a note to the user.
       
   139         ErrorNoteL( R_DEVENCUI_TEXT_BATTERY_LOW );
       
   140         User::Leave( KErrNotReady );
       
   141         }
       
   142 
       
   143     if ( (aMem->State() == EDecrypted) || (aPrimaryMem && (aPrimaryMem->State() == EDecrypted)) )
       
   144         {
       
   145         // Encryption is off -> encrypt
       
   146         if ( PrepareEncryptionL() )
       
   147             {
       
   148             if ( aMem->State() == EDecrypted )
       
   149             	{
       
   150             	DFLOG( "Starting Mass Storage encryption" );
       
   151             	aMem->StartEncryptionL();
       
   152             	}
       
   153             if( aPrimaryMem && (aPrimaryMem->State() == EDecrypted) )
       
   154             	{
       
   155             	DFLOG( "Starting phone memory encryption" );
       
   156             	aPrimaryMem->StartEncryptionL();
       
   157                 }
       
   158             }
       
   159         else
       
   160             {
       
   161             DFLOG( "Encryption cancelled" );
       
   162             }
       
   163         }
       
   164     else if ( (aMem->State() == EEncrypted) || (aPrimaryMem && (aPrimaryMem->State() == EEncrypted)) )
       
   165         {
       
   166         if ( PrepareDecryptionL() )
       
   167             {
       
   168             if ( aMem->State() == EEncrypted )
       
   169             	{
       
   170             	DFLOG( "Starting Mass Storage decryption" );
       
   171             	aMem->StartDecryptionL();
       
   172             	}
       
   173             if( aPrimaryMem && (aPrimaryMem->State() == EEncrypted) )
       
   174                 {
       
   175                 DFLOG( "Starting phone memory decryption" );
       
   176                 aPrimaryMem->StartDecryptionL();
       
   177                 }
       
   178             }
       
   179         else
       
   180             {
       
   181             DFLOG( "Decryption cancelled" );
       
   182             }
       
   183         }
       
   184     else
       
   185         {
       
   186         DFLOG2( "Phone memory busy, state = %d, no action", aMem->State() );
       
   187         }
       
   188 
       
   189     // Depending on the user's selection, the memory may be in the same
       
   190     // state as before or in a new state. This call will let all observers
       
   191     // know what state the memory ended up in.
       
   192     aMem->UpdateMemoryInfo();
       
   193     }
       
   194 
       
   195 // --------------------------------------------------------------------------
       
   196 // CDevEncUiEncryptionOperator::PrepareEncryptionL()
       
   197 // --------------------------------------------------------------------------
       
   198 //
       
   199 TBool CDevEncUiEncryptionOperator::PrepareEncryptionL()
       
   200     {
       
   201     TBool result( EFalse );
       
   202 
       
   203     // Show the confirmation query about autolock
       
   204     CAknMessageQueryDialog* yesNoQuery = new ( ELeave ) CAknMessageQueryDialog;
       
   205     if ( ! yesNoQuery->ExecuteLD( R_DEVENCUI_ENCRYPT_CONFIRMATION_QUERY_DIALOG ) )
       
   206         {
       
   207         // User answered no. Do nothing
       
   208         DFLOG( "User cancelled after autolock warning. No action." );
       
   209         return result;
       
   210         }
       
   211 
       
   212     // Autolock must be on before encryption can be enabled.
       
   213     // Get the current autolock status and the current max autolock period
       
   214     TInt lockTime = 0;
       
   215     TBuf8<21> autoLockPeriodBuf;
       
   216     
       
   217     RTerminalControl terminalCtrl;
       
   218     TInt ctrlConnect = terminalCtrl.Connect();
       
   219     DFLOG2( "DEVENC: terminal control connected %d", ctrlConnect );
       
   220     
       
   221     RTerminalControl3rdPartySession session;
       
   222     TInt retValue = session.Open( terminalCtrl );
       
   223     DFLOG2( "DEVENC: terminal control session open %d", retValue );
       
   224 
       
   225     TInt err2 = session.GetDeviceLockParameter( RTerminalControl3rdPartySession::ETimeout, autoLockPeriodBuf );
       
   226     DFLOG2( "DEVENC: max value get returned value %d", err2 );
       
   227     
       
   228     TLex8 lexAutolock( autoLockPeriodBuf );          
       
   229     lexAutolock.Val( lockTime );
       
   230     DFLOG2( "lockTime = %d", lockTime );
       
   231     
       
   232     //Get current max autolock period
       
   233     TBuf8<21> oldMaxPeriodBuf;
       
   234     TInt maxperioderr = session.GetDeviceLockParameter( RTerminalControl3rdPartySession::EMaxTimeout, oldMaxPeriodBuf );
       
   235     DFLOG2( "DEVENC: max value set returned value %d", maxperioderr );
       
   236 
       
   237 #ifndef __WINS__
       
   238     // Setting the autolock works only in target
       
   239 
       
   240     if ( lockTime == 0 )
       
   241         {
       
   242         // Autolock disabled. Go to the autolock settings
       
   243         DFLOG( "Autolock currently disabled, going to settings" );
       
   244 
       
   245         // Create the filename of the SecUi resource file
       
   246         _LIT( KFileDrive, "z:" );
       
   247         _LIT( KSecUiResourceFileName, "SecUi.rsc" );
       
   248         TFileName filename;
       
   249         filename += KFileDrive;
       
   250         filename += KDC_RESOURCE_FILES_DIR;
       
   251         filename += KSecUiResourceFileName;
       
   252 
       
   253         // Convert to a localized resource filename if possible
       
   254         RFs fs;
       
   255         User::LeaveIfError( fs.Connect() );
       
   256         BaflUtils::NearestLanguageFile( fs, filename );
       
   257 
       
   258         // Load the SecUi resource file
       
   259         TInt rfileOffset( 0 );
       
   260         TRAPD( err, rfileOffset = iEikEnv.AddResourceFileL( filename ) );
       
   261         if ( err )
       
   262             {
       
   263             DFLOG2( "Add resource file error %d", err );
       
   264             }
       
   265         User::LeaveIfError( err );
       
   266         
       
   267         // Set maximum autolock period
       
   268         
       
   269         TBuf8<21> maxPeriodBuf;
       
   270         maxPeriodBuf.AppendNum( KMaxAutolockPeriod );
       
   271         TInt err3 = session.SetDeviceLockParameter( RTerminalControl3rdPartySession::EMaxTimeout, maxPeriodBuf );
       
   272         DFLOG2( "DEVENC: max value set returned value %d", err3 );
       
   273 
       
   274         // Let the user set an autolock period
       
   275         CSecuritySettings* secSett = CSecuritySettings::NewL();
       
   276         CleanupStack::PushL( secSett );
       
   277         TInt newLockTime = secSett->ChangeAutoLockPeriodL( lockTime );
       
   278         CleanupStack::PopAndDestroy( secSett );
       
   279 
       
   280         iEikEnv.DeleteResourceFile( rfileOffset );
       
   281         
       
   282         if ( newLockTime == 0 )
       
   283             {
       
   284             // User cancelled or set autolock off -> do nothing
       
   285             DFLOG( "User selected not to enable autolock. No action." );
       
   286             
       
   287             //restore the old maximum period value
       
   288             TInt err3 = session.SetDeviceLockParameter( RTerminalControl3rdPartySession::EMaxTimeout, oldMaxPeriodBuf );
       
   289             DFLOG2( "DEVENC: max value set returned value %d", err3 );
       
   290             
       
   291             //the autolock period is now at KMaxAutolockPeriod( =20 ) so we have to set it as it was previously
       
   292             err3 = session.SetDeviceLockParameter( RTerminalControl3rdPartySession::ETimeout, autoLockPeriodBuf );
       
   293             DFLOG2( "DEVENC: max value set returned value %d", err3 );
       
   294             
       
   295             session.Close();
       
   296             terminalCtrl.Close();
       
   297             return result;
       
   298             }
       
   299         
       
   300         TBuf8<21> newLockTimeBuf;
       
   301         newLockTimeBuf.AppendNum( newLockTime );
       
   302         
       
   303         TInt setResult = session.SetDeviceLockParameter( RTerminalControl3rdPartySession::ETimeout, newLockTimeBuf );
       
   304         if ( setResult )
       
   305             {
       
   306             // TBI: Log the failure and leave with error
       
   307             DFLOG2( "ERROR: session.SetDeviceLockParameter( RTerminalControl3rdPartySession::ETimeout, .. ) returned %d", setResult );
       
   308             session.Close();
       
   309             terminalCtrl.Close();
       
   310             return result;
       
   311             }
       
   312         lockTime = newLockTime;
       
   313         }
       
   314     else
       
   315     	{    	
       
   316     	DFLOG( "Autolock already enabled. Set only the current maximum period" );
       
   317     	
       
   318     	//By setting the max autolock period the autolock period is set to max if it was greater than that
       
   319     	TBuf8<21> maxPeriodBuf;
       
   320         maxPeriodBuf.AppendNum( KMaxAutolockPeriod );
       
   321         TInt err3 = session.SetDeviceLockParameter( RTerminalControl3rdPartySession::EMaxTimeout, maxPeriodBuf );
       
   322         DFLOG2( "DEVENC: max value set returned value %d", err3 );
       
   323         }
       
   324 #endif // __WINS__
       
   325 
       
   326     DFLOG2( "Autolock time is %d", lockTime );
       
   327 
       
   328     // Autolock is now enabled, so we can proceed with the encryption
       
   329     // Warn the user about the long encryption process
       
   330     if ( MessageQueryL( R_DEVENCUI_TEXT_NOTE_ENCRYPTING ) )
       
   331         {
       
   332         result = ETrue;
       
   333         DFLOG( "Starting encryption" );
       
   334         }
       
   335     else
       
   336         {
       
   337         DFLOG( "Encryption cancelled" );
       
   338         //the encryption was cancelled. Let's set the old autolock values
       
   339         //restore the old maximum period value
       
   340         TInt err3 = session.SetDeviceLockParameter( RTerminalControl3rdPartySession::EMaxTimeout, oldMaxPeriodBuf );
       
   341         DFLOG2( "DEVENC: max value set returned value %d", err3 );
       
   342         
       
   343         //the autolock period is now at KMaxAutolockPeriod( =20 ) so we have to set it as it was previously
       
   344         err3 = session.SetDeviceLockParameter( RTerminalControl3rdPartySession::ETimeout, autoLockPeriodBuf );
       
   345         DFLOG2( "DEVENC: max value set returned value %d", err3 );
       
   346         }
       
   347     
       
   348     session.Close();
       
   349     terminalCtrl.Close();
       
   350     
       
   351     return result;
       
   352     }
       
   353 
       
   354 // --------------------------------------------------------------------------
       
   355 // CDevEncUiEncryptionOperator::PrepareDecryptionL()
       
   356 // --------------------------------------------------------------------------
       
   357 //
       
   358 TBool CDevEncUiEncryptionOperator::PrepareDecryptionL()
       
   359     {
       
   360     // Warn the user about the long decryption process
       
   361     return MessageQueryL( R_DEVENCUI_TEXT_NOTE_PHONE_DECRYPTING );
       
   362     }
       
   363 
       
   364 // --------------------------------------------------------------------------
       
   365 // CDevEncUiEncryptionOperator::MessageQueryL()
       
   366 // --------------------------------------------------------------------------
       
   367 //
       
   368 TBool CDevEncUiEncryptionOperator::MessageQueryL( TInt aResourceId,
       
   369                                                   TInt aSoftKeysId )
       
   370     {
       
   371     TBool result( EFalse );
       
   372 
       
   373     // Show a message query with OK and Cancel buttons and the specified text
       
   374     CAknMessageQueryDialog* query =
       
   375         new ( ELeave ) CAknMessageQueryDialog;
       
   376     query->PrepareLC( R_DEVENCUI_ENCRYPT_CONFIRMATION_QUERY_DIALOG );
       
   377     query->ButtonGroupContainer().SetCommandSetL( aSoftKeysId );
       
   378     HBufC* prompt = StringLoader::LoadLC( aResourceId, &iEikEnv );
       
   379     query->SetMessageTextL( *prompt );
       
   380     CleanupStack::PopAndDestroy( prompt );
       
   381     if ( query->RunLD() )
       
   382         {
       
   383         result = ETrue;
       
   384         }
       
   385     return result;
       
   386     }
       
   387 
       
   388 // --------------------------------------------------------------------------
       
   389 // CDevEncUiEncryptionOperator::QueryDialog()
       
   390 // --------------------------------------------------------------------------
       
   391 //
       
   392 TBool CDevEncUiEncryptionOperator::QueryDialogL( TInt aResourceId,
       
   393                                                  TInt aSoftKeysId )
       
   394     {
       
   395     TBool result( EFalse );
       
   396     CAknQueryDialog* query = CAknQueryDialog::NewL();
       
   397     query->PrepareLC( R_DEVENCUI_CONFIRMATION_QUERY ); // CleanupStack OK
       
   398     HBufC* prompt = StringLoader::LoadLC( aResourceId, &iEikEnv );
       
   399     query->SetPromptL( *prompt );
       
   400     query->ButtonGroupContainer().SetCommandSetL( aSoftKeysId );
       
   401     
       
   402     CleanupStack::PopAndDestroy( prompt );
       
   403     if ( query->RunLD() )
       
   404         {
       
   405         result = ETrue;
       
   406         }
       
   407     return result;
       
   408     }
       
   409 
       
   410 // --------------------------------------------------------------------------
       
   411 // CDevEncUiEncryptionOperator::DataQueryDialogL()
       
   412 // --------------------------------------------------------------------------
       
   413 //
       
   414 TBool CDevEncUiEncryptionOperator::DataQueryDialogL( TDes& aResult,
       
   415                                                      TInt aPromptResourceId,
       
   416                                                      TInt aMaxLength )
       
   417     {
       
   418     // The descriptor contained the prompt text for the query. The prompt
       
   419     // text can also be defined in the resource structure of the query
       
   420     HBufC* prompt = StringLoader::LoadLC( aPromptResourceId, &iEikEnv );
       
   421 
       
   422     // create dialog instance
       
   423     CAknTextQueryDialog* dlg =
       
   424         new( ELeave ) CAknTextQueryDialog( aResult, *prompt );
       
   425 
       
   426     CleanupStack::PopAndDestroy( prompt );
       
   427 
       
   428     // Sets the maximum length of the text editor
       
   429     dlg->SetMaxLength( aMaxLength );
       
   430 
       
   431     // Prepares the dialog, constructing it from the specified resource
       
   432     dlg->PrepareLC( R_DEVENCUI_DATA_QUERY );
       
   433 
       
   434     // Launch the dialog
       
   435     return dlg->RunLD();
       
   436     }
       
   437 
       
   438 // --------------------------------------------------------------------------
       
   439 // CDevEncUiEncryptionOperator::HandleMmcEncryptRequestL()
       
   440 // --------------------------------------------------------------------------
       
   441 //
       
   442 void CDevEncUiEncryptionOperator::HandleMmcEncryptRequestL( CDevEncUiMemoryEntity* aMem,
       
   443                                                             TInt aCommand )
       
   444     {
       
   445     // Check the battery level first
       
   446     if ( ! CheckBatteryL() )
       
   447         {
       
   448         // The battery level is too low and no charger is connected.
       
   449         // Show a note to the user.
       
   450         ErrorNoteL( R_DEVENCUI_TEXT_BATTERY_LOW );
       
   451         User::Leave( KErrNotReady );
       
   452         }
       
   453 
       
   454     TBool proceed( EFalse );
       
   455     switch ( aCommand )
       
   456         {
       
   457         case EDevEncUiCommandEncryptWithRestoredKey:
       
   458             {
       
   459             DFLOG( "Encrypt with restored key selected" );
       
   460             proceed = LoadAndSetKeyL(); // No cleanup stack needed
       
   461             break;
       
   462             }
       
   463 
       
   464         case EDevEncUiCommandEncryptAndSaveKey:
       
   465             {
       
   466             DFLOG( "Encrypt and save key selected" );
       
   467             proceed = CreateAndSaveKeyL(); // No cleanup stack needed
       
   468             if( proceed )
       
   469                 {
       
   470                 InfoNoteL( R_DEVENCUI_TEXT_NOTE_SAVEINFO, ETrue );
       
   471                 DFLOG( "Key saved succesfully" );
       
   472                 }
       
   473             break;
       
   474             }
       
   475 
       
   476         case EDevEncUiCommandEncryptWithoutSavingKey:
       
   477             {
       
   478             DFLOG( "Encrypt without saving key selected" );
       
   479             // Create an encryption key and take it in use
       
   480             // The key will remain in the driver until the next key is set,
       
   481             // and it can not be retrieved.
       
   482             proceed = CreateKeyL(); // No cleanup stack needed
       
   483             break;
       
   484             }
       
   485 
       
   486         case EDevEncUiCommandEncryptWithCurrentKey:
       
   487             {
       
   488             DFLOG( "Encrypt with current key selected" );
       
   489             proceed = ETrue;
       
   490             }
       
   491             
       
   492         default:
       
   493             {
       
   494             DFLOG( "Invalid command" );
       
   495             break;
       
   496             }
       
   497         }
       
   498 
       
   499     if ( aMem->State() == EUnmounted )
       
   500         {
       
   501         if( !proceed )
       
   502         	{
       
   503             // The encryption operation was cancelled, just go back to encryption view
       
   504             DFLOG( "No Mmc present and operation was cancelled -> no encryption" );
       
   505             }
       
   506         else
       
   507         	{
       
   508         	// The encryption operation was succesfull, go back to main view
       
   509             iAppUi.ActivateLocalViewL( TUid::Uid( EDevEncUiMainViewId ) );
       
   510         	proceed = EFalse;
       
   511             DFLOG( "No Mmc present -> no encryption" );
       
   512             }
       
   513         }
       
   514 
       
   515     if ( aMem->State() == ECorrupted )
       
   516         {
       
   517         if( !proceed )
       
   518         	{
       
   519         	DFLOG( "Mmc probably enc with another key -> wait for remount" );
       
   520             }
       
   521         else
       
   522         	{
       
   523         	// Mmc was probably encrypted with another key. We have just set a
       
   524             // new key, so now we have to wait until the state changes and hope
       
   525             // that the card is readable. If it is, a note will be shown to the
       
   526             // user. (See UI spec 2.7)
       
   527             InfoNoteL( R_DEVENCUI_TEXT_NOTE_MEMORYCARD_ENCRYPTED, ETrue );
       
   528             iAppUi.ActivateLocalViewL( TUid::Uid( EDevEncUiMainViewId ) );
       
   529             proceed = EFalse;
       
   530             DFLOG( "Mmc probably enc with another key -> wait for remount" );
       
   531             RemountMmcL();
       
   532             }
       
   533         }
       
   534     
       
   535     if ( proceed )
       
   536         {
       
   537         TInt encrypt( 0 );
       
   538         
       
   539         // Check DM admin status
       
   540         TInt dmControlSetting( 0 );
       
   541         iCrSettings->Get( KDevEncUiDmControl, dmControlSetting );
       
   542         
       
   543         if( ( dmControlSetting & KDmControlsMemoryCard ) && ( aCommand == EDevEncUiCommandEncryptWithCurrentKey ) )
       
   544         	{
       
   545         	//if the DM admin is controlling the encryption, encrypt straight away
       
   546         	encrypt = ETrue;
       
   547         	}
       
   548         else
       
   549         	{
       
   550         	encrypt = MessageQueryL( R_DEVENCUI_TEXT_NOTE_ENCRYPTING );
       
   551             }
       
   552         
       
   553         // Warn the user about the long encryption process
       
   554         if ( encrypt )
       
   555             {
       
   556             // Start the encryption
       
   557             DFLOG( "Starting encryption" );
       
   558             aMem->StartEncryptionL();
       
   559             // Go back to main view
       
   560             iAppUi.ActivateLocalViewL( TUid::Uid( EDevEncUiMainViewId ) );
       
   561             }
       
   562         else
       
   563             {
       
   564             DFLOG( "Encryption cancelled" );
       
   565             // Stay in the Encryption view
       
   566             // Show a note to the user about that the new key is in use,
       
   567             // but the card is still decrypted (UI spec 2.3)
       
   568             InfoNoteL( R_DEVENCUI_TEXT_NOTE_ENCRYPTIONINTERRUPT, ETrue );
       
   569             iAppUi.ActivateLocalViewL( TUid::Uid( EDevEncUiMainViewId ) );
       
   570             }
       
   571         }
       
   572 
       
   573     // Depending on the user's selection, the memory may be in the same
       
   574     // state as before or in a new state. This call will let all observers
       
   575     // know what state the memory ended up in.
       
   576     aMem->UpdateMemoryInfo();
       
   577     }
       
   578 
       
   579 // --------------------------------------------------------------------------
       
   580 // CDevEncUiEncryptionOperator::CreateKeyL()
       
   581 // --------------------------------------------------------------------------
       
   582 //
       
   583 TBool CDevEncUiEncryptionOperator::CreateKeyL()
       
   584     {
       
   585     TBool proceed( EFalse );
       
   586     CDevEncKeyUtils* utils = new ( ELeave ) CDevEncKeyUtils;
       
   587     CleanupStack::PushL( utils );
       
   588 //    User::LeaveIfError(utils->Connect());
       
   589     TRequestStatus status;
       
   590     utils->CreateSetKey( status, KEncryptionKeyLength );
       
   591     User::WaitForRequest( status );
       
   592 //    utils->Close();
       
   593     CleanupStack::PopAndDestroy( utils );
       
   594     if ( ! status.Int() )
       
   595         {
       
   596         // Save the Mmc encryption key status
       
   597         User::LeaveIfError( iCrSettings->Set( KDevEncUserSettingMemoryCard,
       
   598                                               ETrue ) );
       
   599         proceed = ETrue;
       
   600         }
       
   601     return proceed;
       
   602     }
       
   603 
       
   604 // --------------------------------------------------------------------------
       
   605 // CDevEncUiEncryptionOperator::CreateAndSaveKeyL()
       
   606 // --------------------------------------------------------------------------
       
   607 //
       
   608 TBool CDevEncUiEncryptionOperator::CreateAndSaveKeyL()
       
   609     {
       
   610     TBool proceed( EFalse );
       
   611     
       
   612     TBool passwordOk( EFalse );
       
   613     TBool keyFileNameOk( EFalse );
       
   614     TBool keyCreated( EFalse );
       
   615     TBool keySaved( EFalse );
       
   616     CFileStore* file( NULL );
       
   617     HBufC* keyFileName = HBufC::NewLC( KMaxFilenameLength );
       
   618     
       
   619     // Get the key password from the user
       
   620     HBufC8* password = HBufC8::NewLC( KMaxPasswordLength );
       
   621     TPtr8 passwordPtr = password->Des();
       
   622     passwordOk = PasswordQueryL( R_DEVENCUI_TEXT_PASSPHRASE_PROTECT,
       
   623                                  passwordPtr );
       
   624 
       
   625     CDevEncUiFileManager* fm = new ( ELeave ) CDevEncUiFileManager;
       
   626     CleanupStack::PushL( fm );
       
   627     fm->ConstructL();
       
   628 
       
   629     HBufC8* pkcs5Key( NULL );
       
   630 
       
   631     if ( passwordOk )
       
   632         {
       
   633         DFLOG( "Password entered" );
       
   634         // The user entered the correct password
       
   635 
       
   636         // Construct file path
       
   637         _LIT( KDevEncKeyFileExtension, ".pk5");
       
   638         TBuf<KMaxFileName> filePath;
       
   639         User::LeaveIfError( fm->KeyFolder( filePath ) );
       
   640         TInt pathLen( filePath.Length() );
       
   641 
       
   642         // Get the key file name from the user
       
   643         TBool filenameEntered( EFalse );
       
   644         TBool cancelPressed( EFalse );
       
   645         TPtr16 keyFileNamePtr = keyFileName->Des();
       
   646         while ( ( ! cancelPressed ) && ( ! file ) )
       
   647             {
       
   648             filenameEntered = DataQueryDialogL( keyFileNamePtr,
       
   649                     R_DEVENCUI_TEXT_FILENAME,
       
   650                     KMaxFilenameLength );
       
   651             if ( !filenameEntered )
       
   652                 {
       
   653                 // User pressed cancel, stop here
       
   654                 cancelPressed = ETrue;
       
   655                 }
       
   656             else
       
   657                 {
       
   658                 // User entered a file name. Try to open a file store
       
   659                 filePath.Append( keyFileNamePtr );
       
   660                 filePath.Append( KDevEncKeyFileExtension );
       
   661                 TInt openError = fm->OpenFileStore( filePath,
       
   662                                                     file );
       
   663                 if ( openError )
       
   664                     {
       
   665                     DFLOG2( "Error opening file: %d", openError );
       
   666 
       
   667                     // Notify the user that something went wrong
       
   668                     if ( openError == KErrAlreadyExists )
       
   669                         {
       
   670                         ErrorNoteL( R_DEVENCUI_TEXT_FILE_EXISTS );
       
   671                         }
       
   672                     else
       
   673                         {
       
   674                         ErrorNoteL( R_DEVENCUI_TEXT_BAD_NAME );
       
   675                         }
       
   676                     
       
   677                     // Remove the file name from the path and try again
       
   678                     filePath.Delete( pathLen, filePath.Length() - pathLen );
       
   679                     }
       
   680                 else
       
   681                     {
       
   682                     DFLOG( "File opened:" );
       
   683                     DFLOGBUF( filePath );
       
   684                     keyFileNameOk = ETrue;
       
   685                     CleanupStack::PushL( file );
       
   686                     }
       
   687                 }
       
   688             } // end of while
       
   689         }
       
   690     else
       
   691         {
       
   692         DFLOG( "Password incorrect" );
       
   693         }
       
   694     
       
   695     if ( keyFileNameOk )
       
   696         {
       
   697         // Create the encryption key
       
   698         CDevEncKeyUtils* utils = new ( ELeave ) CDevEncKeyUtils;
       
   699         CleanupStack::PushL( utils );
       
   700 //        User::LeaveIfError(utils->Connect());
       
   701 
       
   702         TRequestStatus status;
       
   703         utils->CreateSetKey( status, pkcs5Key, *password, KEncryptionKeyLength );
       
   704         User::WaitForRequest( status );
       
   705 //        utils->Close();
       
   706         CleanupStack::PopAndDestroy( utils );
       
   707         
       
   708         if ( status.Int() )
       
   709             {
       
   710             DFLOG2( "Error creating key: %d", status.Int() );
       
   711             }
       
   712         else
       
   713             {
       
   714             keyCreated = ETrue;
       
   715             CleanupStack::PushL( pkcs5Key );
       
   716             // Save the Mmc encryption key status
       
   717             User::LeaveIfError( iCrSettings->Set( KDevEncUserSettingMemoryCard,
       
   718                                                   ETrue ) );
       
   719             }
       
   720         }
       
   721 
       
   722     if ( keyCreated )
       
   723         {
       
   724         // Save the key
       
   725         fm->SaveKeyL( file, *pkcs5Key );
       
   726         CleanupStack::PopAndDestroy( pkcs5Key );
       
   727         keySaved = ETrue;
       
   728         }
       
   729 
       
   730     if ( keySaved )
       
   731         {
       
   732         // Finally, start the encryption
       
   733         proceed = ETrue;
       
   734         }
       
   735 
       
   736     // Cleanup on demand
       
   737     if ( file )
       
   738         {
       
   739         CleanupStack::PopAndDestroy( file );
       
   740         }
       
   741     if ( fm )
       
   742         {
       
   743         CleanupStack::PopAndDestroy( fm );
       
   744         }
       
   745     if ( password )
       
   746         {
       
   747         CleanupStack::PopAndDestroy( password );
       
   748         }
       
   749     if ( keyFileName )
       
   750         {
       
   751         CleanupStack::PopAndDestroy( keyFileName );
       
   752         }
       
   753     
       
   754     return proceed;
       
   755     }
       
   756 
       
   757 // --------------------------------------------------------------------------
       
   758 // CDevEncUiEncryptionOperator::LoadAndSetKeyL()
       
   759 // --------------------------------------------------------------------------
       
   760 //
       
   761 TBool CDevEncUiEncryptionOperator::LoadAndSetKeyL()
       
   762     {
       
   763     TBool proceed( EFalse );
       
   764 
       
   765     TBool keySelected( EFalse );
       
   766     TBool passwordOk( EFalse );
       
   767     TBool askPassword( ETrue );
       
   768     HBufC8* pkcs5Key( NULL );
       
   769     TBuf8<KMaxPasswordLength> password8;
       
   770 
       
   771     // Get a list of existing keys in the private directory
       
   772     CDevEncUiFileManager* fm = new ( ELeave ) CDevEncUiFileManager;
       
   773     CleanupStack::PushL( fm );
       
   774     fm->ConstructL();
       
   775     CDir* dir( NULL );
       
   776     fm->GetKeyListL( dir );
       
   777 
       
   778     DFLOG2( "Found %d keys", dir->Count() );
       
   779     
       
   780     if ( dir->Count() <= 0 )
       
   781         {
       
   782         ErrorNoteL( R_DEVENCUI_TEXT_NO_KEYS_FOUND );
       
   783         User::Leave( KErrNotReady );
       
   784         }
       
   785     
       
   786     // Create a list for the query
       
   787     iListQueryItemArray = new ( ELeave ) CDesCArrayFlat( dir->Count() );
       
   788     for ( TInt i = 0; i < dir->Count(); i++ )
       
   789         {
       
   790         TEntry entry( (*dir)[i] );
       
   791         HBufC* tmpFileName = entry.iName.AllocLC();
       
   792         iListQueryItemArray->AppendL( entry.iName );
       
   793         CleanupStack::PopAndDestroy( tmpFileName );
       
   794         }
       
   795 
       
   796     // Let the user select which key to load
       
   797     TInt index( 0 ); // the index of the selected item
       
   798     CAknListQueryDialog* query =
       
   799         new ( ELeave ) CAknListQueryDialog( &index );
       
   800     query->PrepareLC( R_DEVENCUI_LIST_QUERY );
       
   801     query->ButtonGroupContainer().SetCommandSetL( R_AVKON_SOFTKEYS_OK_BACK );
       
   802     query->SetItemTextArray( iListQueryItemArray );
       
   803     // Keep ownership of the item array
       
   804     query->SetOwnershipType( ELbmDoesNotOwnItemArray );
       
   805     if ( query->RunLD() )
       
   806         {
       
   807         DFLOG2( "User selected key %d", index );
       
   808         DFLOGBUF( ( *dir )[index].iName );
       
   809         // Load the key file.
       
   810 
       
   811         // Construct file path
       
   812         TBuf<KMaxFileName> filePath;
       
   813         DFLOG("Start find key folder");
       
   814         User::LeaveIfError( fm->KeyFolder( filePath ) );
       
   815         DFLOG("Stop find key folder");
       
   816     
       
   817         TFileName filename;
       
   818         filename.Append( filePath );
       
   819         filename.Append( ( *dir )[index].iName );
       
   820         fm->LoadKeyL( filename,
       
   821                       pkcs5Key );
       
   822         CleanupStack::PushL( pkcs5Key );
       
   823         keySelected = ETrue;
       
   824         DFLOG( "Key loaded" );
       
   825         }
       
   826     else
       
   827         {
       
   828         // User cancelled the query
       
   829         DFLOG( "Key file query cancelled by user, stopping here" );
       
   830         }
       
   831     
       
   832     while ( askPassword )
       
   833     	{
       
   834         if ( keySelected )
       
   835             {
       
   836             // Get the key password from the user
       
   837             passwordOk = PasswordQueryL( R_DEVENCUI_TEXT_PASSPHRASE_ASK,
       
   838                                          password8 );
       
   839             }
       
   840         else
       
   841         	{
       
   842         	//The user pressed back. Do not ask the password
       
   843         	askPassword = EFalse;
       
   844         	}
       
   845 
       
   846         if ( passwordOk )
       
   847             {
       
   848             DFLOG( "Password ok, setting key" );
       
   849             CDevEncKeyUtils* utils = new ( ELeave ) CDevEncKeyUtils;
       
   850             CleanupStack::PushL( utils );
       
   851 //            User::LeaveIfError(utils->Connect());
       
   852 
       
   853             TRequestStatus status;
       
   854             utils->SetKey( status, *pkcs5Key, password8 );
       
   855             User::WaitForRequest( status );
       
   856 //            utils->Close();
       
   857             CleanupStack::PopAndDestroy( utils );
       
   858             if ( status.Int() )
       
   859                 {
       
   860                 const TInt KErrBadPassphrase( -11000 );
       
   861                 DFLOG2( "Error taking key in use: %d", status.Int() );
       
   862                 if ( status.Int() == KErrBadPassphrase )
       
   863                     {
       
   864                     DFLOG( "Invalid password" );
       
   865                     ErrorNoteL( R_DEVENCUI_TEXT_INVALID_PASSWORD );
       
   866                     }
       
   867                 else
       
   868                     {
       
   869                     DFLOG2( "Key read error %d", status.Int() );
       
   870                     ErrorNoteL( R_DEVENCUI_TEXT_KEY_ERROR );
       
   871                     askPassword = EFalse;
       
   872                     }
       
   873                 }
       
   874             else
       
   875                 {
       
   876                 DFLOG( "New key is now in use" );
       
   877                 // Save the Mmc encryption key status
       
   878                 User::LeaveIfError( iCrSettings->Set( KDevEncUserSettingMemoryCard,
       
   879                                                       ETrue ) );
       
   880                 proceed = ETrue;
       
   881                 askPassword = EFalse;
       
   882                 }
       
   883             }
       
   884         else
       
   885             {
       
   886             askPassword = EFalse;
       
   887             }
       
   888         }
       
   889     // Cleanup on demand
       
   890     if ( pkcs5Key )
       
   891         {
       
   892         CleanupStack::PopAndDestroy( pkcs5Key );
       
   893         }
       
   894     if ( fm )
       
   895         {
       
   896         CleanupStack::PopAndDestroy( fm );
       
   897         }
       
   898 
       
   899     return proceed;
       
   900     }
       
   901     
       
   902 
       
   903 // --------------------------------------------------------------------------
       
   904 // CDevEncUiEncryptionOperator::PasswordQueryL()
       
   905 // --------------------------------------------------------------------------
       
   906 //
       
   907 TBool CDevEncUiEncryptionOperator::PasswordQueryL( TInt aPromptResourceId,
       
   908                                                    TDes8& aResult )
       
   909     {
       
   910     TBool passwordOk( EFalse );
       
   911     TBuf<KMaxPasswordLength> password;
       
   912     TBuf8<KMaxPasswordLength> password8;
       
   913     CDevEncUiSecretMinMaxCodeQuery* query =
       
   914         new ( ELeave ) CDevEncUiSecretMinMaxCodeQuery( password,
       
   915                                                    KMinPasswordLength,
       
   916                                                    KMaxPasswordLength );
       
   917 
       
   918     HBufC* prompt = StringLoader::LoadLC( aPromptResourceId, &iEikEnv );
       
   919     query->SetPromptL( *prompt );
       
   920     CleanupStack::PopAndDestroy( prompt );
       
   921 
       
   922     // Prompt the user for the key password
       
   923     if ( ( query->ExecuteLD( R_DEVENCUI_CODE_QUERY ) ) )
       
   924         {
       
   925         // This indicates that the user filled in some password and
       
   926         // pressed OK.
       
   927         passwordOk = ETrue;
       
   928         }
       
   929     else
       
   930         {
       
   931         DFLOG( "Key password dialog cancelled" );
       
   932         }
       
   933 
       
   934     if ( passwordOk )
       
   935         {
       
   936         // Convert the password to UTF-8
       
   937         if ( CnvUtfConverter::ConvertFromUnicodeToUtf8( password8,
       
   938                                                         password ) )
       
   939             {
       
   940             DFLOG( "Password conversion failed" );
       
   941             passwordOk = EFalse;
       
   942             }
       
   943         else
       
   944             {
       
   945             aResult.Copy( password8 );
       
   946             }
       
   947         }
       
   948     
       
   949     return passwordOk;
       
   950     }
       
   951 
       
   952 // --------------------------------------------------------------------------
       
   953 // CDevEncUiEncryptionOperator::HandleMmcDecryptRequestL()
       
   954 // --------------------------------------------------------------------------
       
   955 //
       
   956 void CDevEncUiEncryptionOperator::HandleMmcDecryptRequestL( CDevEncUiMemoryEntity* aMem,
       
   957                                                             TInt aCommand )
       
   958     {
       
   959     // Check the battery level first
       
   960     if ( ! CheckBatteryL() )
       
   961         {
       
   962         // The battery level is too low and no charger is connected.
       
   963         // Show a note to the user.
       
   964         ErrorNoteL( R_DEVENCUI_TEXT_BATTERY_LOW );
       
   965         User::Leave( KErrNotReady );
       
   966         }
       
   967 
       
   968     TBool proceed( EFalse );
       
   969     switch ( aCommand )
       
   970         {
       
   971         case EDevEncUiCommandDecrypt:
       
   972             {
       
   973             DFLOG( "Decrypt selected" );
       
   974             // Warn the user about the long decryption process
       
   975             proceed = MessageQueryL( R_DEVENCUI_TEXT_NOTE_DECRYPTING );
       
   976             break;
       
   977             }
       
   978         case EDevEncUiCommandDecryptAndTurnOffEncryption:
       
   979             {
       
   980             DFLOG( "Decrypt and turn off selected" );
       
   981             // Warn the user about the long decryption process,
       
   982             // and that the key will be destroyed
       
   983             proceed = MessageQueryL( R_DEVENCUI_TEXT_NOTE_DECRYPTINGDESTROY );
       
   984             // Save the Mmc encryption key status
       
   985             User::LeaveIfError( iCrSettings->Set( KDevEncUserSettingMemoryCard,
       
   986                                                   EFalse ) );
       
   987             // The key will actually be destroyed in the DevEncStarter
       
   988             // component, because the user may exit from the UI at any time.
       
   989             // By saving the encryption key status in the central repository,
       
   990             // we ensure that the Starter knows that it's supposed to destroy
       
   991             // the key when the operation is complete
       
   992             // TBI: Destroy the key in Starter after decryption is complete.
       
   993             break;
       
   994             }
       
   995         default:
       
   996             {
       
   997             break;
       
   998             }
       
   999         }
       
  1000 
       
  1001     if ( aMem->State() == EUnmounted )
       
  1002         {
       
  1003         // Just go back to main view, no decryption operation
       
  1004         iAppUi.ActivateLocalViewL( TUid::Uid( EDevEncUiMainViewId ) );
       
  1005         proceed = EFalse;
       
  1006         DFLOG( "No Mmc present -> no decryption" );
       
  1007         }
       
  1008     
       
  1009     if ( proceed )
       
  1010         {
       
  1011         // Start the decryption
       
  1012         DFLOG( "Starting decryption" );
       
  1013         aMem->StartDecryptionL();
       
  1014         // Go back to main view
       
  1015         iAppUi.ActivateLocalViewL( TUid::Uid( EDevEncUiMainViewId ) );
       
  1016         }
       
  1017     else
       
  1018         {
       
  1019         DFLOG( "Decryption cancelled" );
       
  1020         // Stay in the decryption view
       
  1021         }
       
  1022 
       
  1023     // Depending on the user's selection, the memory may be in the same
       
  1024     // state as before or in a new state. This call will let all observers
       
  1025     // know what state the memory ended up in.
       
  1026     aMem->UpdateMemoryInfo();
       
  1027     }
       
  1028 
       
  1029 // ---------------------------------------------------------------------------
       
  1030 // CDevEncUiEncryptionOperator::CheckBatteryL()
       
  1031 // Checks if there's enough battery power to update
       
  1032 // ---------------------------------------------------------------------------
       
  1033 //
       
  1034 TBool CDevEncUiEncryptionOperator::CheckBatteryL()
       
  1035     {
       
  1036 #ifdef __WINS__
       
  1037 
       
  1038     // In the emulator, the battery level is always 0 and the charger is never
       
  1039     // connected, so just return ETrue.
       
  1040     return ETrue;
       
  1041 
       
  1042 #else // __WINS__
       
  1043 
       
  1044     // Running on target. Check the real battery and charger status
       
  1045 
       
  1046     TInt chargingstatus( EChargingStatusError );
       
  1047     TInt batterylevel( 1 );
       
  1048     TBool enoughPower( EFalse );
       
  1049 
       
  1050     // Read battery
       
  1051     DFLOG( "CDevEncUiEncryptionOperator::CheckBatteryL" );
       
  1052     RProperty pw;
       
  1053     User::LeaveIfError( pw.Attach( KPSUidHWRMPowerState, KHWRMBatteryLevel ) );
       
  1054     User::LeaveIfError( pw.Get( batterylevel ) );
       
  1055     pw.Close();
       
  1056 
       
  1057     User::LeaveIfError( pw.Attach( KPSUidHWRMPowerState, KHWRMChargingStatus ) );
       
  1058     User::LeaveIfError( pw.Get( chargingstatus ));
       
  1059     pw.Close();
       
  1060 
       
  1061     // Too low battery, power insufficient
       
  1062     if ( batterylevel >= EBatteryLevelLevel4 )
       
  1063         {
       
  1064         enoughPower = ETrue;
       
  1065         }
       
  1066     // But charger is connected, power sufficient
       
  1067     if ( ( chargingstatus != EChargingStatusError ) &&
       
  1068          ( chargingstatus != EChargingStatusNotConnected ) )
       
  1069         {
       
  1070         enoughPower = ETrue;
       
  1071         }
       
  1072 
       
  1073     DFLOG3( "Battery level: %d  (0..7), chargingstatus %d",
       
  1074            batterylevel, chargingstatus );
       
  1075     DFLOG2( "CheckBatteryL %d", ( enoughPower ? 1 : 0 ) );
       
  1076     return enoughPower;
       
  1077 
       
  1078 #endif // __WINS__
       
  1079     }
       
  1080 
       
  1081 // --------------------------------------------------------------------------
       
  1082 // CDevEncUiEncryptionOperator::ErrorNoteL()
       
  1083 // --------------------------------------------------------------------------
       
  1084 //
       
  1085 void CDevEncUiEncryptionOperator::ErrorNoteL( TInt aResourceId,
       
  1086                                               TBool aWaitingNote )
       
  1087     {
       
  1088     HBufC* message = StringLoader::LoadLC( aResourceId );
       
  1089     CAknErrorNote* errorNote = new ( ELeave ) CAknErrorNote( aWaitingNote );
       
  1090     errorNote->ExecuteLD( *message );
       
  1091     CleanupStack::PopAndDestroy( message );
       
  1092     }
       
  1093 
       
  1094 // --------------------------------------------------------------------------
       
  1095 // CDevEncUiEncryptionOperator::InfoNoteL()
       
  1096 // --------------------------------------------------------------------------
       
  1097 //
       
  1098 void CDevEncUiEncryptionOperator::InfoNoteL( TInt aResourceId,
       
  1099                                              TBool aWaitingNote )
       
  1100     {
       
  1101     HBufC* message = StringLoader::LoadLC( aResourceId );
       
  1102     CAknInformationNote* note = new ( ELeave ) CAknInformationNote( aWaitingNote );
       
  1103     note->ExecuteLD( *message );
       
  1104     CleanupStack::PopAndDestroy( message );
       
  1105     }
       
  1106 
       
  1107 // --------------------------------------------------------------------------
       
  1108 // CDevEncUiEncryptionOperator::DestroyKeyQueryL()
       
  1109 //
       
  1110 // --------------------------------------------------------------------------
       
  1111 void CDevEncUiEncryptionOperator::DestroyKeyQueryL( TBool aShowMmcNote )
       
  1112     {
       
  1113     TBool destroy = QueryDialogL( R_DEVENCUI_TEXT_NOTE_DECRYPT_NOMEMRYCARD, R_AVKON_SOFTKEYS_YES_NO );
       
  1114     if ( destroy )
       
  1115         {
       
  1116         DestroyKeyL();
       
  1117         if ( aShowMmcNote )
       
  1118             {
       
  1119             InfoNoteL( R_DEVENCUI_TEXT_NOTE_MEMORYCARD_UNENCRYPTED );
       
  1120             }
       
  1121         }
       
  1122     else
       
  1123         {
       
  1124         DFLOG( "User cancelled destroy key query" );
       
  1125         }
       
  1126     }
       
  1127 
       
  1128 // --------------------------------------------------------------------------
       
  1129 // CDevEncUiEncryptionOperator::DestroyKeyL()
       
  1130 //
       
  1131 // --------------------------------------------------------------------------
       
  1132 void CDevEncUiEncryptionOperator::DestroyKeyL()
       
  1133     {
       
  1134     DFLOG( "CDevEncUiEncryptionOperator::DestroyKeyL" );
       
  1135     CDevEncKeyUtils* utils = new ( ELeave ) CDevEncKeyUtils;
       
  1136     CleanupStack::PushL( utils );
       
  1137 //    User::LeaveIfError(utils->Connect());
       
  1138 
       
  1139     TRequestStatus status;
       
  1140     utils->ResetKey( status );
       
  1141     User::WaitForRequest( status );
       
  1142 //    utils->Close();
       
  1143     CleanupStack::PopAndDestroy( utils );
       
  1144     if ( status.Int() )
       
  1145         {
       
  1146         DFLOG2( "DestroyKeyL error %d", status.Int() );
       
  1147         }
       
  1148     else
       
  1149         {
       
  1150         DFLOG( "DestroyKeyL done" );
       
  1151         // We no longer have a key in the driver. Update the user setting.
       
  1152         iCrSettings->Set( KDevEncUserSettingMemoryCard, 0 );
       
  1153         }
       
  1154     User::LeaveIfError( status.Int() );
       
  1155     }
       
  1156 
       
  1157 // --------------------------------------------------------------------------
       
  1158 // CDevEncUiEncryptionOperator::SuggestMmcEncryptionL()
       
  1159 //
       
  1160 // --------------------------------------------------------------------------
       
  1161 void CDevEncUiEncryptionOperator::SuggestMmcEncryptionL(
       
  1162                                                 CDevEncUiMemoryEntity* aMem )
       
  1163     {
       
  1164     TInt encrypt( 0 );
       
  1165     
       
  1166     // Check DM admin status
       
  1167     TInt dmControlSetting( 0 );
       
  1168     iCrSettings->Get( KDevEncUiDmControl, dmControlSetting );
       
  1169     
       
  1170     if( dmControlSetting & KDmControlsMemoryCard )
       
  1171     	{
       
  1172     	//The admin is controlling the encryption, encrypt straight away without questions
       
  1173     	encrypt = ETrue;
       
  1174     	}
       
  1175     else
       
  1176     	{
       
  1177     	encrypt = MessageQueryL( R_DEVENCUI_TEXT_NOTE_INSERTUNENCRYPTED,
       
  1178                 R_AVKON_SOFTKEYS_YES_NO );
       
  1179         }
       
  1180     
       
  1181     if ( encrypt )
       
  1182         {
       
  1183         HandleMmcEncryptRequestL( aMem,
       
  1184                                   EDevEncUiCommandEncryptWithCurrentKey );
       
  1185         }
       
  1186     else
       
  1187         {
       
  1188         DFLOG( "User selected not to encrypt the card" );
       
  1189         }
       
  1190     }
       
  1191 
       
  1192 // --------------------------------------------------------------------------
       
  1193 // CDevEncUiEncryptionOperator::SuggestMmcDecryptionL()
       
  1194 //
       
  1195 // --------------------------------------------------------------------------
       
  1196 void CDevEncUiEncryptionOperator::SuggestMmcDecryptionL( CDevEncUiMemoryEntity* aMem )
       
  1197     {
       
  1198     TBool decrypt = MessageQueryL( R_DEVENCUI_TEXT_NOTE_INSERTENCRYPTED,
       
  1199                                    R_AVKON_SOFTKEYS_YES_NO );
       
  1200     if ( decrypt )
       
  1201         {
       
  1202         SuggestMmcImportKeyL( aMem, ETrue );
       
  1203         }
       
  1204     else
       
  1205         {
       
  1206         ErrorNoteL( R_DEVENCUI_TEXT_NOTE_INSERTOFF_UNUSEDMEMORYCARD );
       
  1207         }
       
  1208     }
       
  1209 
       
  1210 // --------------------------------------------------------------------------
       
  1211 // CDevEncUiEncryptionOperator::SuggestMmcImportKeyL()
       
  1212 //
       
  1213 // --------------------------------------------------------------------------
       
  1214 void CDevEncUiEncryptionOperator::SuggestMmcImportKeyL(
       
  1215                                                 CDevEncUiMemoryEntity* /*aMem*/,
       
  1216                                                 TBool aFirstAttempt )
       
  1217     {
       
  1218     DFLOG( "CDevEncUiEncryptionOperator::SuggestMmcImportKeyL" );
       
  1219     TBool import( ETrue );
       
  1220     if ( aFirstAttempt )
       
  1221         {
       
  1222         DFLOG( "CDevEncUiEncryptionOperator::SuggestMmcImportKeyL => firstAttempt" );
       
  1223         import = MessageQueryL( R_DEVENCUI_TEXT_NOTE_DECRYPT_LOADKEY,
       
  1224                                 R_AVKON_SOFTKEYS_YES_NO );
       
  1225         }
       
  1226     
       
  1227     if ( import )
       
  1228         {
       
  1229         TBool reloadKey = ETrue; 
       
  1230         // Loop while user chooses correct key or cancels operation 
       
  1231         while ( reloadKey ) 
       
  1232             { 
       
  1233             TBool keySet = LoadAndSetKeyL(); 
       
  1234             if ( !keySet ) 
       
  1235                 { 
       
  1236                 ErrorNoteL( R_DEVENCUI_TEXT_NOTE_UNUSEDMEMORYCARD ); 
       
  1237                 reloadKey = EFalse; 
       
  1238                 } 
       
  1239             else 
       
  1240                 { 
       
  1241                 // New key is in use, now we need to remount the mmc 
       
  1242                 RemountMmcL(); 
       
  1243                 
       
  1244                 // Check that key is valid 
       
  1245                 TInt err = CheckMMCStatus();              
       
  1246 
       
  1247                 if( err == KErrCorrupt )
       
  1248                 	{
       
  1249                 	ErrorNoteL( R_DEVENCUI_TEXT_NOTE_WRONGKEYFILE );
       
  1250                 	reloadKey = ETrue;
       
  1251                 	}
       
  1252                 else
       
  1253                 	{
       
  1254                 	reloadKey = EFalse;
       
  1255                 	}
       
  1256                 } 
       
  1257             }
       
  1258         }
       
  1259     }
       
  1260 
       
  1261 // --------------------------------------------------------------------------
       
  1262 // CDevEncUiEncryptionOperator::CheckMMCStatus()
       
  1263 //
       
  1264 // --------------------------------------------------------------------------
       
  1265 TInt CDevEncUiEncryptionOperator::CheckMMCStatus()
       
  1266     {
       
  1267     TVolumeInfo volInfo; 
       
  1268     RFs fs; 
       
  1269     TInt err =  fs.Connect(); 
       
  1270     if (err == KErrNone)
       
  1271         {
       
  1272         fs.Volume( volInfo, EDriveF );
       
  1273         fs.Close();
       
  1274         }
       
  1275     return err;
       
  1276     }
       
  1277 
       
  1278 // --------------------------------------------------------------------------
       
  1279 // CDevEncUiEncryptionOperator::RemountMmc()
       
  1280 //
       
  1281 // --------------------------------------------------------------------------
       
  1282 void CDevEncUiEncryptionOperator::RemountMmcL()
       
  1283     {
       
  1284     CDevEncUiFileManager* fm = new ( ELeave ) CDevEncUiFileManager;
       
  1285     CleanupStack::PushL( fm );
       
  1286     fm->ConstructL();
       
  1287     TInt error = fm->RemountMmc();
       
  1288     CleanupStack::PopAndDestroy( fm );
       
  1289     if ( error )
       
  1290         {
       
  1291         DFLOG2( "Mmc remount failed, error %d", error );
       
  1292         User::Leave( error );
       
  1293         }
       
  1294     else
       
  1295         {
       
  1296         DFLOG( "Mmc remounted" );
       
  1297         }
       
  1298     }
       
  1299 
       
  1300 // --------------------------------------------------------------------------
       
  1301 // CDevEncUiEncryptionOperator::ShowWrongKeyNoteL()
       
  1302 //
       
  1303 // --------------------------------------------------------------------------
       
  1304 void CDevEncUiEncryptionOperator::ShowWrongKeyNoteL()
       
  1305     {
       
  1306     ErrorNoteL( R_DEVENCUI_TEXT_NOTE_INSERTON_UNUSEDMEMORYCARD );
       
  1307     }
       
  1308 
       
  1309 // --------------------------------------------------------------------------
       
  1310 // CDevEncUiEncryptionOperator::CheckNotesWithHeaderL()
       
  1311 //
       
  1312 // --------------------------------------------------------------------------
       
  1313 void CDevEncUiEncryptionOperator::CheckNotesWithHeaderL()
       
  1314     {
       
  1315     MessageQueryL( R_DEVENCUI_TEXT_NOTE_DECRYPT_LOADKEY );
       
  1316     MessageQueryL( R_DEVENCUI_TEXT_NOTE_DECRYPT_NOMEMRYCARD );
       
  1317     MessageQueryL( R_DEVENCUI_TEXT_NOTE_DECRYPTING );
       
  1318     MessageQueryL( R_DEVENCUI_TEXT_NOTE_DECRYPTINGDESTROY );
       
  1319     MessageQueryL( R_DEVENCUI_TEXT_NOTE_ENCRYPTING );
       
  1320     MessageQueryL( R_DEVENCUI_TEXT_NOTE_ENCRYPTIONINTERRUPT );
       
  1321     MessageQueryL( R_DEVENCUI_TEXT_NOTE_INSERTENCRYPTED );
       
  1322     MessageQueryL( R_DEVENCUI_TEXT_NOTE_INSERTOFF_UNUSEDMEMORYCARD );
       
  1323     MessageQueryL( R_DEVENCUI_TEXT_NOTE_INSERTON_UNUSEDMEMORYCARD );
       
  1324     MessageQueryL( R_DEVENCUI_TEXT_NOTE_INSERTUNENCRYPTED );
       
  1325     MessageQueryL( R_DEVENCUI_TEXT_NOTE_LOCK );
       
  1326     MessageQueryL( R_DEVENCUI_TEXT_NOTE_PHONE_DECRYPTING );
       
  1327     }
       
  1328 
       
  1329 // --------------------------------------------------------------------------
       
  1330 // CDevEncUiEncryptionOperator::CheckNotesL()
       
  1331 // --------------------------------------------------------------------------
       
  1332 //
       
  1333 void CDevEncUiEncryptionOperator::CheckNotesL()
       
  1334     {
       
  1335     QueryDialogL( R_DEVENCUI_TEXT_NOTE_DECRYPT_LOADKEY );
       
  1336     QueryDialogL( R_DEVENCUI_TEXT_NOTE_DECRYPT_NOMEMRYCARD );
       
  1337     QueryDialogL( R_DEVENCUI_TEXT_NOTE_DECRYPTING );
       
  1338     QueryDialogL( R_DEVENCUI_TEXT_NOTE_DECRYPTINGDESTROY );
       
  1339     QueryDialogL( R_DEVENCUI_TEXT_NOTE_ENCRYPTING );
       
  1340     QueryDialogL( R_DEVENCUI_TEXT_NOTE_ENCRYPTIONINTERRUPT );
       
  1341     QueryDialogL( R_DEVENCUI_TEXT_NOTE_INSERTENCRYPTED );
       
  1342     QueryDialogL( R_DEVENCUI_TEXT_NOTE_INSERTOFF_UNUSEDMEMORYCARD );
       
  1343     QueryDialogL( R_DEVENCUI_TEXT_NOTE_INSERTON_UNUSEDMEMORYCARD );
       
  1344     QueryDialogL( R_DEVENCUI_TEXT_NOTE_INSERTUNENCRYPTED );
       
  1345     QueryDialogL( R_DEVENCUI_TEXT_NOTE_LOCK );
       
  1346     QueryDialogL( R_DEVENCUI_TEXT_NOTE_PHONE_DECRYPTING );
       
  1347     }
       
  1348 
       
  1349 // END OF FILE