memspyui/source/MemSpyExportBitmapsToMemoryCardDialog.cpp
branchRCL_3
changeset 22 fad26422216a
parent 0 d6fe6244b863
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/memspyui/source/MemSpyExportBitmapsToMemoryCardDialog.cpp	Wed Sep 01 12:30:35 2010 +0100
@@ -0,0 +1,328 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include "MemSpyExportBitmapsToMemoryCardDialog.h"
+
+// System includes
+#include <eikprogi.h>
+#include <AknWaitDialog.h>
+#include <AknQueryDialog.h>
+#include <coemain.h>
+#include <eikenv.h>
+#include <avkon.hrh>
+#include <memspyui.rsg>
+
+// Engine includes
+#include <memspy/engine/memspyengine.h>
+#include <memspy/engine/memspyengineobjectthread.h>
+#include <memspy/engine/memspyengineobjectprocess.h>
+#include <memspy/engine/memspyengineobjectcontainer.h>
+#include <memspy/engine/memspyenginehelperchunk.h>
+#include <memspy/engine/memspyenginehelpercodesegment.h>
+#include <memspy/engine/memspyenginehelperheap.h>
+#include <memspy/engine/memspyenginehelperstack.h>
+#include <memspy/engine/memspyenginehelperthread.h>
+#include <memspy/engine/memspyenginehelperprocess.h>
+#include <memspy/engine/memspyenginehelperfbserv.h>
+
+// Driver includes
+#include <memspy/driver/memspydriverenumerationsshared.h>
+
+// Literal constants
+_LIT( KMemSpyBitmapExportFolderAndFileName, "e:\\MemSpy\\Images\\%04d%02d%02d_%02d.%02d.%02d\\");
+
+
+CMemSpyExportBitmapsToMemoryCardDialog::CMemSpyExportBitmapsToMemoryCardDialog( RFs& aFsSession, const CMemSpyEngineFbServBitmapArray& aBitmaps )
+:   CActive(EPriorityIdle), iFsSession(aFsSession), iBitmaps(aBitmaps)
+    {
+    CActiveScheduler::Add(this);
+    }
+
+
+CMemSpyExportBitmapsToMemoryCardDialog::~CMemSpyExportBitmapsToMemoryCardDialog()
+    {
+    Cancel();
+    //
+    delete iProgressDialog;
+    //
+    iMimeTypeArray.ResetAndDestroy();
+    iMimeTypeArray.Close();
+    //
+    if ( iEncoder )
+        {
+        iEncoder->Cancel();
+        }
+    delete iEncoder;
+    delete iFolderName;
+    delete iBmpMimeType;
+    }
+
+
+void CMemSpyExportBitmapsToMemoryCardDialog::ConstructL()
+    {
+    // Check card is ready
+    if  ( CheckMemoryCardAvailableL( iFsSession ) == EFalse )
+        {
+        User::Leave( KErrNotReady );
+        }
+
+    // Get mime type for BMP file
+    IdentifyBmpMimeTypeL();
+
+    // Prepare unique empty folder
+    PrepareFolderNameSpecL();
+
+    // Prepare UI stuff
+    iProgressDialog = new( ELeave ) CAknProgressDialog( reinterpret_cast< CEikDialog** >( &iProgressDialog ) );
+    iProgressDialog->SetCallback( this );
+    iProgressDialog->SetGloballyCapturing( ETrue );
+    iProgressDialog->PrepareLC( R_MEMSPY_EXPORT_TO_MEMORYCARD_DIALOG );
+    //
+    iProgressInfo = iProgressDialog->GetProgressInfoL( );
+    iProgressInfo->SetFinalValue( iBitmaps.Count() );
+    //
+    iProgressDialog->MakeVisible( ETrue ); // Visible right away
+    //
+    iDialogDismissed = EFalse;
+    iProgressInfo->SetAndDraw( 0 );
+
+    // Start the process rolling...
+    CompleteSelf(KErrNone);
+
+    //
+    iProgressDialog->RunLD( );
+    }
+
+
+CMemSpyExportBitmapsToMemoryCardDialog* CMemSpyExportBitmapsToMemoryCardDialog::NewL( RFs& aFsSession, const CMemSpyEngineFbServBitmapArray& aBitmaps )
+    {
+    CMemSpyExportBitmapsToMemoryCardDialog* self = new(ELeave) CMemSpyExportBitmapsToMemoryCardDialog( aFsSession, aBitmaps );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+void CMemSpyExportBitmapsToMemoryCardDialog::Cancel()
+    {
+    CActive::Cancel();
+    }
+
+
+TBool CMemSpyExportBitmapsToMemoryCardDialog::CheckMemoryCardAvailableL( RFs& aFsSession )
+    {
+    TBool available = EFalse;
+    //
+    TDriveInfo driveInfo;
+    if  ( aFsSession.Drive( driveInfo, EDriveE ) == KErrNone )
+        {
+        // Other checks needed?
+        available = ETrue;
+        }
+    //
+    return available;
+    }
+
+
+void CMemSpyExportBitmapsToMemoryCardDialog::RunL()
+    {
+    const TInt error = iStatus.Int();
+    User::LeaveIfError( error );
+ 
+    if  ( !iDialogDismissed )
+        {
+        // Do we have more items to process?
+        if  ( TryToExportSingleBitmapL() )
+            {
+            _LIT(KTextFormat, "Saving image\n%d/%d");
+            TBuf<128> buf;
+            buf.Format( KTextFormat, iBitmapIndex, iBitmaps.Count() );
+            //
+            iProgressDialog->SetTextL( buf );
+            iProgressInfo->SetAndDraw( iBitmapIndex );
+            iProgressDialog->DrawDeferred();
+            }
+        else
+            {
+            // We're done - RunL will not be called again
+            if  (iProgressInfo)
+                {
+                const TInt finalValue = iProgressInfo->Info().iFinalValue;
+                iProgressInfo->SetAndDraw( finalValue );
+                //
+                delete iProgressDialog;
+                iProgressDialog = NULL;
+                //
+                delete this;
+                }
+            }
+
+        User::ResetInactivityTime();
+        }
+    else
+        {
+        delete iProgressDialog;
+        iProgressDialog = NULL;
+        //
+        delete this;
+        }
+    }
+
+
+void CMemSpyExportBitmapsToMemoryCardDialog::DoCancel()
+    {
+    if  ( iEncoder )
+        {
+        iEncoder->Cancel();
+        }
+
+    iDialogDismissed = ETrue;
+    }
+
+
+TInt CMemSpyExportBitmapsToMemoryCardDialog::RunError( TInt /*aError*/ )
+    {
+    TRAP_IGNORE(
+
+        // Try the next image
+        if  ( TryToExportSingleBitmapL() == EFalse )
+            {
+            iDialogDismissed = ETrue;
+            delete this;
+            }
+    );
+    //
+    return KErrNone;
+    }
+
+
+void CMemSpyExportBitmapsToMemoryCardDialog::DialogDismissedL( TInt /*aButtonId*/ )
+    {
+    iDialogDismissed = ETrue;
+    iProgressDialog = NULL;
+    }
+
+
+void CMemSpyExportBitmapsToMemoryCardDialog::CompleteSelf( TInt aError )
+    {
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, aError );
+    SetActive();
+    }
+
+
+void CMemSpyExportBitmapsToMemoryCardDialog::ExportBitmapL( const CMemSpyEngineFbServBitmap& aBitmap )
+    {
+    // Create a filename
+    TFileName fileName( *iFolderName );
+    aBitmap.GetExportableFileNameL( fileName );
+
+    // Create encoder object...
+    CImageEncoder* encoder = CImageEncoder::FileNewL( iFsSession, fileName, *iBmpMimeType );
+    delete iEncoder;
+    iEncoder = encoder;
+
+    // Start operation
+    iEncoder->Convert( &iStatus, aBitmap.Bitmap() );
+    SetActive();
+    }
+
+
+void CMemSpyExportBitmapsToMemoryCardDialog::IdentifyBmpMimeTypeL()
+    {
+    _LIT(KBmpExtension, ".bmp");
+    CImageEncoder::GetFileTypesL( iMimeTypeArray );
+    //
+    const TInt count = iMimeTypeArray.Count();
+    //
+    for( TInt i=0; i<count; i++ )
+        {
+        CFileExtensionMIMEType* extension = iMimeTypeArray[ i ];
+        if  ( extension->FileExtension().FindF( KBmpExtension ) >= 0 )
+            {
+            // Found it - save mime type info
+            iBmpMimeType = extension->MIMEType().AllocL();
+            iMimeTypeArray.ResetAndDestroy();
+            iMimeTypeArray.Close();
+            return;
+            }
+        }
+    //
+    User::Leave( KErrNotFound );    
+    }
+
+
+void CMemSpyExportBitmapsToMemoryCardDialog::PrepareFolderNameSpecL()
+    {
+    delete iFolderName;
+    iFolderName = NULL;
+    
+    // Make a unique filename format specifier.
+    TTime now;
+    now.HomeTime();
+    const TDateTime dt( now.DateTime() );
+
+    // Build it up...
+    iFolderName = HBufC::NewL( KMaxFileName );
+    TPtr pName( iFolderName->Des() );
+    pName.Format( KMemSpyBitmapExportFolderAndFileName, dt.Year(), dt.Month()+1, dt.Day()+1, dt.Hour(), dt.Minute(), dt.Second());
+    
+    // Create directory
+    const TInt error = iFsSession.MkDirAll( pName );
+    User::LeaveIfError( error );
+    }
+
+
+TBool CMemSpyExportBitmapsToMemoryCardDialog::TryToExportSingleBitmapL()
+    {
+    TBool startedExport = EFalse;
+    
+    const TInt count = iBitmaps.Count();
+    for( ; ( iBitmapIndex < count ) && ( startedExport == EFalse ); iBitmapIndex++ )
+        {
+        const CMemSpyEngineFbServBitmap& memSpyBitmap = iBitmaps.At( iBitmapIndex );
+        const CFbsBitmap& fbsBitmap = memSpyBitmap.Bitmap();
+        const TSize size( fbsBitmap.SizeInPixels() );
+
+        // We don't want to export bitmaps which have a zero-pixel dimension.
+        if  ( size.iHeight > 0 && size.iWidth > 0 )
+            {
+            // This completes the object's request status and will therefore
+            // result in a further call to RunL() when the export to BMP
+            // is completed.
+            ExportBitmapL( memSpyBitmap );
+
+            // And indicate we managed to start an operation...
+            startedExport = ETrue;
+            }
+        }
+    //
+    return startedExport;
+    }
+
+
+
+
+
+
+
+
+
+
+
+