devencdiskutils/DevEncStarter/src/DevEncStarterMemoryEntity.cpp
changeset 0 164170e6151a
equal deleted inserted replaced
-1:000000000000 0:164170e6151a
       
     1 /*
       
     2 * Copyright (c) 2007 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 CDevEncUiMemoryEntity
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "DevEncLog.h"
       
    20 #include "DevEncStarterMemoryEntity.h"
       
    21 #include "DevEncUiMemInfoObserver.h"
       
    22 
       
    23 #include <DevEncDiskUtils.h>
       
    24 #include <DevEncSession.h>
       
    25 #include <f32file.h> // for TDriveNumer
       
    26 #include <DevEncEngineConstants.h>
       
    27 
       
    28 // Local definitions
       
    29 const TInt KPercent100( 100 );
       
    30 const TTimeIntervalMicroSeconds32 KProgressInterval( 500000 ); // ms, 0.5 seconds
       
    31 const TTimeIntervalMicroSeconds32 KPollInterval( 2000000 ); // ms, 2 seconds
       
    32 
       
    33 // --------------------------------------------------------------------------
       
    34 // CDevEncStarterMemoryEntity::CDevEncStarterMemoryEntity()
       
    35 // 
       
    36 // --------------------------------------------------------------------------
       
    37 CDevEncStarterMemoryEntity::CDevEncStarterMemoryEntity(
       
    38                         TDevEncUiMemoryType aType )
       
    39     : iType( aType )
       
    40     {
       
    41     // TBI: Get the real states from the underlying SW levels
       
    42 	iState = EDecrypted;
       
    43     }
       
    44 
       
    45 
       
    46 // --------------------------------------------------------------------------
       
    47 // CDevEncStarterMemoryEntity::~CDevEncStarterMemoryEntity()
       
    48 // 
       
    49 // --------------------------------------------------------------------------
       
    50 CDevEncStarterMemoryEntity::~CDevEncStarterMemoryEntity()
       
    51     {
       
    52     if ( iPeriodic )
       
    53         {
       
    54         iPeriodic->Cancel();
       
    55         delete iPeriodic;
       
    56         }
       
    57 
       
    58     iObservers.Close();
       
    59     delete iSession;
       
    60     delete iDiskStatusObserver;
       
    61     }
       
    62 
       
    63 // --------------------------------------------------------------------------
       
    64 // CDevEncStarterMemoryEntity::NewL()
       
    65 // 
       
    66 // --------------------------------------------------------------------------
       
    67 CDevEncStarterMemoryEntity* CDevEncStarterMemoryEntity::NewL(
       
    68                                 TDevEncUiMemoryType aType )
       
    69 	{
       
    70 	CDevEncStarterMemoryEntity* self =
       
    71 	    CDevEncStarterMemoryEntity::NewLC( aType );
       
    72 	CleanupStack::Pop( self );
       
    73 	return self;
       
    74 	}
       
    75 
       
    76 // --------------------------------------------------------------------------
       
    77 // CDevEncStarterMemoryEntity::NewLC()
       
    78 // 
       
    79 // --------------------------------------------------------------------------
       
    80 CDevEncStarterMemoryEntity* CDevEncStarterMemoryEntity::NewLC(
       
    81                                 TDevEncUiMemoryType aType )
       
    82 	{
       
    83 	CDevEncStarterMemoryEntity* self =
       
    84 	    new ( ELeave ) CDevEncStarterMemoryEntity( aType );
       
    85 	CleanupStack::PushL( self );
       
    86 	self->ConstructL();
       
    87 	return self;
       
    88 	}
       
    89 
       
    90 // --------------------------------------------------------------------------
       
    91 // CDevEncStarterMemoryEntity::ConstructL()
       
    92 // 
       
    93 // --------------------------------------------------------------------------
       
    94 void CDevEncStarterMemoryEntity::ConstructL()
       
    95 	{
       
    96     DFLOG( ">>CDevEncStarterMemoryEntity::ConstructL" );
       
    97     switch( iType )
       
    98         	{
       
    99         	case EPhoneMemory: iSession = new ( ELeave ) CDevEncSession( /*EDriveC*/EDriveE );
       
   100                                iDiskStatusObserver = CDiskStatusObserver::NewL( this, /*EDriveC*/EDriveE ); 
       
   101         		               break;
       
   102         		               
       
   103         	case EPrimaryPhoneMemory: iSession = new ( ELeave ) CDevEncSession( EDriveC );
       
   104                               iDiskStatusObserver = CDiskStatusObserver::NewL( this, EDriveC );
       
   105         	    		      break;
       
   106         	    		      
       
   107         	case EMemoryCard: iSession = new ( ELeave ) CDevEncSession( /*EDriveE*/EDriveF );
       
   108                               iDiskStatusObserver = CDiskStatusObserver::NewL( this, /*EDriveE*/EDriveF );
       
   109         	    		      break;    	    		               
       
   110             }
       
   111    
       
   112     User::LeaveIfError( iSession->Connect() );
       
   113 
       
   114     // Get initial memory state
       
   115     TInt nfeDiskStatus( EUnmounted );
       
   116 #ifndef __WINS__
       
   117     TInt err = iSession->DiskStatus( nfeDiskStatus );
       
   118     if ( err )
       
   119         {
       
   120         DFLOG2( "DevEncStarter: Could not get disk status, error %d", err );
       
   121         nfeDiskStatus = EDecrypted;
       
   122         //User::Leave( err );
       
   123         }
       
   124 #else
       
   125     nfeDiskStatus = EDecrypted;
       
   126 #endif
       
   127     SetState( nfeDiskStatus );
       
   128 
       
   129     if ( ( iState == EEncrypting ) ||
       
   130          ( iState == EDecrypting ) )
       
   131         {
       
   132         // If the app was started in the middle of an ongoing operation,
       
   133         // start polling the progress
       
   134         StartPolling( KProgressInterval );
       
   135         }
       
   136     else
       
   137         {
       
   138         // Otherwise poll every once in a while to see if the status changes
       
   139         //StartPolling( KPollInterval );
       
   140         }
       
   141 
       
   142     DFLOG( "<<CDevEncStarterMemoryEntity::ConstructL" );
       
   143 	}
       
   144 
       
   145 // --------------------------------------------------------------------------
       
   146 // CDevEncStarterMemoryEntity::AddObserverL()
       
   147 // 
       
   148 // --------------------------------------------------------------------------
       
   149 void CDevEncStarterMemoryEntity::AddObserverL( MDevEncUiMemInfoObserver* aInfoObserver )
       
   150     {
       
   151     DFLOG( "CDevEncStarterMemoryEntity::AddObserverL" );
       
   152     if ( !aInfoObserver )
       
   153         {
       
   154         User::Leave( KErrArgument );
       
   155         }
       
   156     iObservers.AppendL( aInfoObserver );
       
   157 
       
   158     // The new observer probably wants to know the current states
       
   159     UpdateMemoryInfo();
       
   160     }
       
   161 
       
   162 // --------------------------------------------------------------------------
       
   163 // CDevEncStarterMemoryEntity::RemoveObserver()
       
   164 // 
       
   165 // --------------------------------------------------------------------------
       
   166 void CDevEncStarterMemoryEntity::RemoveObserver( MDevEncUiMemInfoObserver* aInfoObserver )
       
   167     {
       
   168     if ( !aInfoObserver )
       
   169         {
       
   170         return;
       
   171         }
       
   172     TInt index( iObservers.Find( aInfoObserver ) );
       
   173     if ( index != KErrNotFound )
       
   174         {
       
   175         iObservers.Remove( index );
       
   176         }
       
   177     }
       
   178 
       
   179 // --------------------------------------------------------------------------
       
   180 // CDevEncStarterMemoryEntity::StartPolling()
       
   181 // Starts a timer to periodically update the memory state in the UI
       
   182 // --------------------------------------------------------------------------
       
   183 void CDevEncStarterMemoryEntity::StartPolling(
       
   184                                       TTimeIntervalMicroSeconds32 aInterval )
       
   185     {
       
   186     DFLOG( "CDevEncStarterMemoryEntity::StartPolling" );
       
   187     TInt error( KErrNone );
       
   188     TRAP( error, DoStartPollingL( aInterval ) );
       
   189     DFLOG2( "CDevEncUiMemoryEntity::StartPolling result %d", error );
       
   190     }
       
   191 
       
   192 // --------------------------------------------------------------------------
       
   193 // CDevEncStarterMemoryEntity::DoStartPollingL()
       
   194 // Starts a timer to periodically update the memory state in the UI
       
   195 // --------------------------------------------------------------------------
       
   196 void CDevEncStarterMemoryEntity::DoStartPollingL(
       
   197                                       TTimeIntervalMicroSeconds32 aInterval )
       
   198     {
       
   199     DFLOG( "CDevEncStarterMemoryEntity::DoStartPollingL" );
       
   200     TCallBack pollCallBack( PollTick, static_cast<TAny*>( this ) );
       
   201     TCallBack progressCallBack( ProgressTick, static_cast<TAny*>( this ) );
       
   202 
       
   203     if ( !iPeriodic )
       
   204         {
       
   205         iPeriodic = CPeriodic::NewL( EPriorityNormal );
       
   206         }
       
   207     iPeriodic->Cancel();
       
   208 
       
   209     if ( aInterval == KProgressInterval )
       
   210         {
       
   211         iPeriodic->Start( 0, aInterval, progressCallBack );
       
   212         }
       
   213     else
       
   214         {
       
   215         iPeriodic->Start( 0, aInterval, pollCallBack );
       
   216         }
       
   217     }
       
   218 
       
   219 // --------------------------------------------------------------------------
       
   220 // CDevEncStarterMemoryEntity::ProgressTick()
       
   221 // 
       
   222 // --------------------------------------------------------------------------
       
   223 TInt CDevEncStarterMemoryEntity::ProgressTick( TAny* aPtr )
       
   224     {
       
   225     CDevEncStarterMemoryEntity* self = static_cast<CDevEncStarterMemoryEntity*>( aPtr );
       
   226     self->DoProgressTick();
       
   227     return 0;
       
   228     }
       
   229 
       
   230 // --------------------------------------------------------------------------
       
   231 // CDevEncStarterMemoryEntity::DoProgressTick()
       
   232 // 
       
   233 // --------------------------------------------------------------------------
       
   234 void CDevEncStarterMemoryEntity::DoProgressTick()
       
   235     {
       
   236     CheckProgress();
       
   237     }
       
   238 
       
   239 // --------------------------------------------------------------------------
       
   240 // CDevEncStarterMemoryEntity::PollTick()
       
   241 // 
       
   242 // --------------------------------------------------------------------------
       
   243 TInt CDevEncStarterMemoryEntity::PollTick( TAny* aPtr )
       
   244     {
       
   245     CDevEncStarterMemoryEntity* self = static_cast<CDevEncStarterMemoryEntity*>( aPtr );
       
   246     self->DoPollTick();
       
   247     return 0;
       
   248     }
       
   249 
       
   250 // --------------------------------------------------------------------------
       
   251 // CDevEncStarterMemoryEntity::DoPollTick()
       
   252 // 
       
   253 // --------------------------------------------------------------------------
       
   254 void CDevEncStarterMemoryEntity::DoPollTick()
       
   255     {
       
   256     TInt nfeDiskStatus( EUnmounted );
       
   257     TInt err = iSession->DiskStatus( nfeDiskStatus );
       
   258     if ( err )
       
   259         {
       
   260         DFLOG2( "DevEncStarter: Could not get disk status, error %d", err );
       
   261         // Ignore error
       
   262         return;
       
   263         }
       
   264     if ( ( nfeDiskStatus == EEncrypting ) ||
       
   265          ( nfeDiskStatus == EDecrypting ) )
       
   266         {
       
   267         // Some other component has started an encryption operation.
       
   268         // Indicate this to the UI and start polling the progress.
       
   269         SetState( nfeDiskStatus );
       
   270         StartPolling( KProgressInterval );
       
   271         }
       
   272     else
       
   273         {
       
   274         if ( iState != nfeDiskStatus )
       
   275             {
       
   276             // The Mmc status has changed, but we are not in the middle of
       
   277             // any operation. Just set the new state.
       
   278             SetState( nfeDiskStatus );
       
   279             }
       
   280         }
       
   281     }
       
   282 
       
   283 // --------------------------------------------------------------------------
       
   284 // CDevEncStarterMemoryEntity::SetState()
       
   285 // 
       
   286 // --------------------------------------------------------------------------
       
   287 void CDevEncStarterMemoryEntity::SetState( TUint aState )
       
   288     {
       
   289     DFLOG3( "CDevEncStarterMemoryEntity::SetState, prev %d, new %d",
       
   290             iState, aState );
       
   291     iState = aState;
       
   292     UpdateMemoryInfo();
       
   293     }
       
   294 
       
   295 // --------------------------------------------------------------------------
       
   296 // CDevEncStarterMemoryEntity::CheckProgress()
       
   297 // 
       
   298 // --------------------------------------------------------------------------
       
   299 void CDevEncStarterMemoryEntity::CheckProgress()
       
   300     {
       
   301     ASSERT( iSession );
       
   302     ASSERT( iSession->Connected() );
       
   303 
       
   304     TInt err = iSession->Progress( iPercentDone );
       
   305     
       
   306     DFLOG( "CDevEncStarterMemoryEntity::CheckProgress" );
       
   307     
       
   308     if ( err )
       
   309         {
       
   310         DFLOG( "DevEncStarter: Could not get progress" );
       
   311         iPeriodic->Cancel();
       
   312         }
       
   313     else if ( iPercentDone >= KPercent100 )
       
   314         {
       
   315         DFLOG( "DevEncStarter: Operation complete" );
       
   316         iPeriodic->Cancel();
       
   317         iPercentDone = 0;
       
   318       
       
   319         if( iSession->DriveNumber() == EDriveC )
       
   320         	{
       
   321             // Finalize the phone memory
       
   322         	DFLOG( "DevEncStarter: DiskFinalize" );
       
   323             err = CDevEncDiskUtils::DiskFinalize( iSession->DriveNumber() );
       
   324             if ( err )
       
   325                 {
       
   326                 DFLOG2( "DevEncStarter: Finalization failed, error %d", err );
       
   327                 }
       
   328             }
       
   329 
       
   330         // Restart the polling at a slower pace
       
   331         // StartPolling( KPollInterval );
       
   332         }
       
   333     else // Not yet finished...
       
   334         {
       
   335         UpdateMemoryInfo();
       
   336         }
       
   337     }
       
   338 
       
   339 // --------------------------------------------------------------------------
       
   340 // CDevEncStarterMemoryEntity::UpdateMemoryInfo()
       
   341 // 
       
   342 // --------------------------------------------------------------------------
       
   343 void CDevEncStarterMemoryEntity::UpdateMemoryInfo()
       
   344     {
       
   345     DFLOG( "CDevEncStarterMemoryEntity::UpdateMemoryInfo()" );
       
   346     for ( TInt i = 0; i < iObservers.Count(); i++ )
       
   347         {
       
   348         iObservers[i]->UpdateInfo( iType, iState, iPercentDone );
       
   349         }
       
   350     }
       
   351 
       
   352 // --------------------------------------------------------------------------
       
   353 // CDevEncStarterMemoryEntity::State()
       
   354 // 
       
   355 // --------------------------------------------------------------------------
       
   356 TUint CDevEncStarterMemoryEntity::State() const
       
   357     {
       
   358     return iState;
       
   359     }
       
   360 
       
   361 // --------------------------------------------------------------------------
       
   362 // CDevEncStarterMemoryEntity::DiskStatusChangedL()
       
   363 // From MDiskStatusObserver
       
   364 // --------------------------------------------------------------------------
       
   365 void CDevEncStarterMemoryEntity::DiskStatusChangedL( TInt aNfeStatus )
       
   366     {
       
   367     if ( ( aNfeStatus == EEncrypting ) ||
       
   368          ( aNfeStatus == EDecrypting ) )
       
   369         {
       
   370         // Some other component has started an encryption operation.
       
   371         // Indicate this to the UI and start polling the progress.
       
   372         DFLOG2( "CDevEncStarterMemoryEntity::DiskStatusChangedL => status = %d",
       
   373         		aNfeStatus );
       
   374         SetState( aNfeStatus );
       
   375         StartPolling( KProgressInterval );
       
   376         }
       
   377     else
       
   378         {        
       
   379         DFLOG2( "CDevEncStarterMemoryEntity::DiskStatusChangedL => status = %d",
       
   380             	 aNfeStatus );
       
   381         
       
   382         if( iState != aNfeStatus )
       
   383         	{
       
   384         	DFLOG2( "CDevEncStarterMemoryEntity::DiskStatusChangedL => status changed, iState was %d", iState );
       
   385             SetState( aNfeStatus );
       
   386         	}
       
   387         }
       
   388     }
       
   389 
       
   390 // End of File
       
   391 
       
   392 
       
   393