memspyui/source/MemSpyExportBitmapsToMemoryCardDialog.cpp
branchRCL_3
changeset 19 b3cee849fa46
parent 18 48060abbbeaf
child 20 fad26422216a
equal deleted inserted replaced
18:48060abbbeaf 19:b3cee849fa46
     1 /*
       
     2 * Copyright (c) 2009 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:
       
    15 *
       
    16 */
       
    17 
       
    18 #include "MemSpyExportBitmapsToMemoryCardDialog.h"
       
    19 
       
    20 // System includes
       
    21 #include <eikprogi.h>
       
    22 #include <AknWaitDialog.h>
       
    23 #include <AknQueryDialog.h>
       
    24 #include <coemain.h>
       
    25 #include <eikenv.h>
       
    26 #include <avkon.hrh>
       
    27 #include <memspyui.rsg>
       
    28 
       
    29 // Engine includes
       
    30 #include <memspy/engine/memspyengine.h>
       
    31 #include <memspy/engine/memspyengineobjectthread.h>
       
    32 #include <memspy/engine/memspyengineobjectprocess.h>
       
    33 #include <memspy/engine/memspyengineobjectcontainer.h>
       
    34 #include <memspy/engine/memspyenginehelperchunk.h>
       
    35 #include <memspy/engine/memspyenginehelpercodesegment.h>
       
    36 #include <memspy/engine/memspyenginehelperheap.h>
       
    37 #include <memspy/engine/memspyenginehelperstack.h>
       
    38 #include <memspy/engine/memspyenginehelperthread.h>
       
    39 #include <memspy/engine/memspyenginehelperprocess.h>
       
    40 #include <memspy/engine/memspyenginehelperfbserv.h>
       
    41 
       
    42 // Driver includes
       
    43 #include <memspy/driver/memspydriverenumerationsshared.h>
       
    44 
       
    45 // Literal constants
       
    46 _LIT( KMemSpyBitmapExportFolderAndFileName, "e:\\MemSpy\\Images\\%04d%02d%02d_%02d.%02d.%02d\\");
       
    47 
       
    48 
       
    49 CMemSpyExportBitmapsToMemoryCardDialog::CMemSpyExportBitmapsToMemoryCardDialog( RFs& aFsSession, const CMemSpyEngineFbServBitmapArray& aBitmaps )
       
    50 :   CActive(EPriorityIdle), iFsSession(aFsSession), iBitmaps(aBitmaps)
       
    51     {
       
    52     CActiveScheduler::Add(this);
       
    53     }
       
    54 
       
    55 
       
    56 CMemSpyExportBitmapsToMemoryCardDialog::~CMemSpyExportBitmapsToMemoryCardDialog()
       
    57     {
       
    58     Cancel();
       
    59     //
       
    60     delete iProgressDialog;
       
    61     //
       
    62     iMimeTypeArray.ResetAndDestroy();
       
    63     iMimeTypeArray.Close();
       
    64     //
       
    65     if ( iEncoder )
       
    66         {
       
    67         iEncoder->Cancel();
       
    68         }
       
    69     delete iEncoder;
       
    70     delete iFolderName;
       
    71     delete iBmpMimeType;
       
    72     }
       
    73 
       
    74 
       
    75 void CMemSpyExportBitmapsToMemoryCardDialog::ConstructL()
       
    76     {
       
    77     // Check card is ready
       
    78     if  ( CheckMemoryCardAvailableL( iFsSession ) == EFalse )
       
    79         {
       
    80         User::Leave( KErrNotReady );
       
    81         }
       
    82 
       
    83     // Get mime type for BMP file
       
    84     IdentifyBmpMimeTypeL();
       
    85 
       
    86     // Prepare unique empty folder
       
    87     PrepareFolderNameSpecL();
       
    88 
       
    89     // Prepare UI stuff
       
    90     iProgressDialog = new( ELeave ) CAknProgressDialog( reinterpret_cast< CEikDialog** >( &iProgressDialog ) );
       
    91     iProgressDialog->SetCallback( this );
       
    92     iProgressDialog->SetGloballyCapturing( ETrue );
       
    93     iProgressDialog->PrepareLC( R_MEMSPY_EXPORT_TO_MEMORYCARD_DIALOG );
       
    94     //
       
    95     iProgressInfo = iProgressDialog->GetProgressInfoL( );
       
    96     iProgressInfo->SetFinalValue( iBitmaps.Count() );
       
    97     //
       
    98     iProgressDialog->MakeVisible( ETrue ); // Visible right away
       
    99     //
       
   100     iDialogDismissed = EFalse;
       
   101     iProgressInfo->SetAndDraw( 0 );
       
   102 
       
   103     // Start the process rolling...
       
   104     CompleteSelf(KErrNone);
       
   105 
       
   106     //
       
   107     iProgressDialog->RunLD( );
       
   108     }
       
   109 
       
   110 
       
   111 CMemSpyExportBitmapsToMemoryCardDialog* CMemSpyExportBitmapsToMemoryCardDialog::NewL( RFs& aFsSession, const CMemSpyEngineFbServBitmapArray& aBitmaps )
       
   112     {
       
   113     CMemSpyExportBitmapsToMemoryCardDialog* self = new(ELeave) CMemSpyExportBitmapsToMemoryCardDialog( aFsSession, aBitmaps );
       
   114     CleanupStack::PushL( self );
       
   115     self->ConstructL();
       
   116     CleanupStack::Pop( self );
       
   117     return self;
       
   118     }
       
   119 
       
   120 
       
   121 void CMemSpyExportBitmapsToMemoryCardDialog::Cancel()
       
   122     {
       
   123     CActive::Cancel();
       
   124     }
       
   125 
       
   126 
       
   127 TBool CMemSpyExportBitmapsToMemoryCardDialog::CheckMemoryCardAvailableL( RFs& aFsSession )
       
   128     {
       
   129     TBool available = EFalse;
       
   130     //
       
   131     TDriveInfo driveInfo;
       
   132     if  ( aFsSession.Drive( driveInfo, EDriveE ) == KErrNone )
       
   133         {
       
   134         // Other checks needed?
       
   135         available = ETrue;
       
   136         }
       
   137     //
       
   138     return available;
       
   139     }
       
   140 
       
   141 
       
   142 void CMemSpyExportBitmapsToMemoryCardDialog::RunL()
       
   143     {
       
   144     const TInt error = iStatus.Int();
       
   145     User::LeaveIfError( error );
       
   146  
       
   147     if  ( !iDialogDismissed )
       
   148         {
       
   149         // Do we have more items to process?
       
   150         if  ( TryToExportSingleBitmapL() )
       
   151             {
       
   152             _LIT(KTextFormat, "Saving image\n%d/%d");
       
   153             TBuf<128> buf;
       
   154             buf.Format( KTextFormat, iBitmapIndex, iBitmaps.Count() );
       
   155             //
       
   156             iProgressDialog->SetTextL( buf );
       
   157             iProgressInfo->SetAndDraw( iBitmapIndex );
       
   158             iProgressDialog->DrawDeferred();
       
   159             }
       
   160         else
       
   161             {
       
   162             // We're done - RunL will not be called again
       
   163             if  (iProgressInfo)
       
   164                 {
       
   165                 const TInt finalValue = iProgressInfo->Info().iFinalValue;
       
   166                 iProgressInfo->SetAndDraw( finalValue );
       
   167                 //
       
   168                 delete iProgressDialog;
       
   169                 iProgressDialog = NULL;
       
   170                 //
       
   171                 delete this;
       
   172                 }
       
   173             }
       
   174 
       
   175         User::ResetInactivityTime();
       
   176         }
       
   177     else
       
   178         {
       
   179         delete iProgressDialog;
       
   180         iProgressDialog = NULL;
       
   181         //
       
   182         delete this;
       
   183         }
       
   184     }
       
   185 
       
   186 
       
   187 void CMemSpyExportBitmapsToMemoryCardDialog::DoCancel()
       
   188     {
       
   189     if  ( iEncoder )
       
   190         {
       
   191         iEncoder->Cancel();
       
   192         }
       
   193 
       
   194     iDialogDismissed = ETrue;
       
   195     }
       
   196 
       
   197 
       
   198 TInt CMemSpyExportBitmapsToMemoryCardDialog::RunError( TInt /*aError*/ )
       
   199     {
       
   200     TRAP_IGNORE(
       
   201 
       
   202         // Try the next image
       
   203         if  ( TryToExportSingleBitmapL() == EFalse )
       
   204             {
       
   205             iDialogDismissed = ETrue;
       
   206             delete this;
       
   207             }
       
   208     );
       
   209     //
       
   210     return KErrNone;
       
   211     }
       
   212 
       
   213 
       
   214 void CMemSpyExportBitmapsToMemoryCardDialog::DialogDismissedL( TInt /*aButtonId*/ )
       
   215     {
       
   216     iDialogDismissed = ETrue;
       
   217     iProgressDialog = NULL;
       
   218     }
       
   219 
       
   220 
       
   221 void CMemSpyExportBitmapsToMemoryCardDialog::CompleteSelf( TInt aError )
       
   222     {
       
   223     TRequestStatus* status = &iStatus;
       
   224     User::RequestComplete( status, aError );
       
   225     SetActive();
       
   226     }
       
   227 
       
   228 
       
   229 void CMemSpyExportBitmapsToMemoryCardDialog::ExportBitmapL( const CMemSpyEngineFbServBitmap& aBitmap )
       
   230     {
       
   231     // Create a filename
       
   232     TFileName fileName( *iFolderName );
       
   233     aBitmap.GetExportableFileNameL( fileName );
       
   234 
       
   235     // Create encoder object...
       
   236     CImageEncoder* encoder = CImageEncoder::FileNewL( iFsSession, fileName, *iBmpMimeType );
       
   237     delete iEncoder;
       
   238     iEncoder = encoder;
       
   239 
       
   240     // Start operation
       
   241     iEncoder->Convert( &iStatus, aBitmap.Bitmap() );
       
   242     SetActive();
       
   243     }
       
   244 
       
   245 
       
   246 void CMemSpyExportBitmapsToMemoryCardDialog::IdentifyBmpMimeTypeL()
       
   247     {
       
   248     _LIT(KBmpExtension, ".bmp");
       
   249     CImageEncoder::GetFileTypesL( iMimeTypeArray );
       
   250     //
       
   251     const TInt count = iMimeTypeArray.Count();
       
   252     //
       
   253     for( TInt i=0; i<count; i++ )
       
   254         {
       
   255         CFileExtensionMIMEType* extension = iMimeTypeArray[ i ];
       
   256         if  ( extension->FileExtension().FindF( KBmpExtension ) >= 0 )
       
   257             {
       
   258             // Found it - save mime type info
       
   259             iBmpMimeType = extension->MIMEType().AllocL();
       
   260             iMimeTypeArray.ResetAndDestroy();
       
   261             iMimeTypeArray.Close();
       
   262             return;
       
   263             }
       
   264         }
       
   265     //
       
   266     User::Leave( KErrNotFound );    
       
   267     }
       
   268 
       
   269 
       
   270 void CMemSpyExportBitmapsToMemoryCardDialog::PrepareFolderNameSpecL()
       
   271     {
       
   272     delete iFolderName;
       
   273     iFolderName = NULL;
       
   274     
       
   275     // Make a unique filename format specifier.
       
   276     TTime now;
       
   277     now.HomeTime();
       
   278     const TDateTime dt( now.DateTime() );
       
   279 
       
   280     // Build it up...
       
   281     iFolderName = HBufC::NewL( KMaxFileName );
       
   282     TPtr pName( iFolderName->Des() );
       
   283     pName.Format( KMemSpyBitmapExportFolderAndFileName, dt.Year(), dt.Month()+1, dt.Day()+1, dt.Hour(), dt.Minute(), dt.Second());
       
   284     
       
   285     // Create directory
       
   286     const TInt error = iFsSession.MkDirAll( pName );
       
   287     User::LeaveIfError( error );
       
   288     }
       
   289 
       
   290 
       
   291 TBool CMemSpyExportBitmapsToMemoryCardDialog::TryToExportSingleBitmapL()
       
   292     {
       
   293     TBool startedExport = EFalse;
       
   294     
       
   295     const TInt count = iBitmaps.Count();
       
   296     for( ; ( iBitmapIndex < count ) && ( startedExport == EFalse ); iBitmapIndex++ )
       
   297         {
       
   298         const CMemSpyEngineFbServBitmap& memSpyBitmap = iBitmaps.At( iBitmapIndex );
       
   299         const CFbsBitmap& fbsBitmap = memSpyBitmap.Bitmap();
       
   300         const TSize size( fbsBitmap.SizeInPixels() );
       
   301 
       
   302         // We don't want to export bitmaps which have a zero-pixel dimension.
       
   303         if  ( size.iHeight > 0 && size.iWidth > 0 )
       
   304             {
       
   305             // This completes the object's request status and will therefore
       
   306             // result in a further call to RunL() when the export to BMP
       
   307             // is completed.
       
   308             ExportBitmapL( memSpyBitmap );
       
   309 
       
   310             // And indicate we managed to start an operation...
       
   311             startedExport = ETrue;
       
   312             }
       
   313         }
       
   314     //
       
   315     return startedExport;
       
   316     }
       
   317 
       
   318 
       
   319 
       
   320 
       
   321 
       
   322 
       
   323 
       
   324 
       
   325 
       
   326 
       
   327 
       
   328