diff -r 48060abbbeaf -r b3cee849fa46 memspyui/ui/avkon/src/MemSpyExportBitmapsToMemoryCardDialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/memspyui/ui/avkon/src/MemSpyExportBitmapsToMemoryCardDialog.cpp Tue Aug 31 15:15:20 2010 +0300 @@ -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 +#include +#include +#include +#include +#include +#include + +// Engine includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Driver includes +#include + +// 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; iFileExtension().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; + } + + + + + + + + + + + +