diff -r 57d4cdd99204 -r edfc90759b9f imageeditor/imageeditorApp/src/ImageEditorImageController.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imageeditor/imageeditorApp/src/ImageEditorImageController.cpp Fri Jan 29 13:53:17 2010 +0200 @@ -0,0 +1,381 @@ +/* +* Copyright (c) 2010 Ixonos Plc. +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the "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: +* Ixonos Plc +* +* Description: +* +*/ + + + +// INCLUDES +#include +#include +#include + +#include "ImageEditorError.h" +#include "ImageEditorImageController.h" +#include "ImageEditorPluginManager.h" +#include "ImageEditorImageHandler.h" +#include "ResolutionUtil.h" +#include "ImageEditorPanics.h" +#include "SystemParameters.h" +#include "imageeditordebugutils.h" +#include "editorversion.h" +#include "commondefs.h" + + +// CONSTANTS + +// Panic category +_LIT(KComponentName, "CImageController"); + +//============================================================================= +CImageController * CImageController::NewL ( + MImageControllerObserver * aObserver, + CImageEditorPluginManager * aManager + ) +{ + CImageController * self = new (ELeave) CImageController; + CleanupStack::PushL (self); + self->ConstructL (aObserver, aManager); + CleanupStack::Pop(); // self + return self; +} + +//============================================================================= +CImageController::~CImageController () +{ + LOG(KImageEditorLogFile, "CImageController::~CImageController() starting..."); + + Cancel(); + DeletePreviewBitmap(); + delete iImageHandler; + iManager = NULL; + iObserver = NULL; + + LOG(KImageEditorLogFile, "CImageController::~CImageController() finished."); +} + +//============================================================================= +void CImageController::ConstructL ( + MImageControllerObserver * aObserver, + CImageEditorPluginManager * aManager + ) + { + CActiveScheduler::Add (this); + iObserver = aObserver; + iManager = aManager; + iImageHandler = CImageEditorImageHandler::NewL (); + iQuality = KDefaultSavedJpegQuality; + iJpegImage = EFalse; + iIsCancelled = EFalse; + LOG(KImageEditorLogFile, "CImageController: Image controller created"); + } + + +//============================================================================= +void CImageController::LoadImageL (const TDesC & aFileName) + { + LOGFMT(KImageEditorLogFile, "CImageController: Loading image %S", &aFileName); + + iOperation = MImageControllerObserver::EOperationCodeLoad; + iIsCancelled = EFalse; + + // If active, cancel + if ( IsActive() ) + { + Cancel(); + } + + // Create new CFbsBitmap + DeletePreviewBitmap(); + CreatePreviewBitmapL(); + + TBool useIPECodec = EFalse; + // try open first with IPE ICL codec + LOG (KImageEditorLogFile, "CImageController::LoadImageL() -- try open image with ICL"); + + // Create new TFileName and store it + iManager->SetImageName (aFileName); + + // Load RAJPEG image + TRAPD ( err, iManager->LoadImageL( useIPECodec ) ); + if ( KErrNone == err ) + { + LOG (KImageEditorLogFile, "CImageController::LoadImageL() -- image opened with ICL"); + // Force RunL() + CompleteRequest(); + } + else + { + LOG (KImageEditorLogFile, "CImageController::LoadImageL() -- failed open image with ICL"); + // Try with IPE codec + useIPECodec = ETrue; + } + + if ( useIPECodec ) + { + // If JPEG source image, try opening with IPE JPEG filter + iJpegImage = iImageHandler->IsRajpegImageL (aFileName); + + if ( !iJpegImage ) + { + iObserver->OperationReadyL ( iOperation, KSIEEIncompatibleImage ); + } + else + { + LOG(KImageEditorLogFile, "CImageController::LoadImageL() -- open JPEG image with IPE"); + + // Create new TFileName and store it + iManager->SetImageName (aFileName); + + // Load RAJPEG image + TRAPD (err, iManager->LoadImageL( useIPECodec )); + if (KErrNone == err) + { + // Force RunL() + CompleteRequest(); + } + else if ((KSIEEIncompatibleImage == err) || (KErrNotSupported == err)) + { + LOG (KImageEditorLogFile, "CImageController::LoadImageL() -- JPEG not supported"); + iObserver->OperationReadyL ( iOperation, err ); + } + // Added because system runs out of memory if jpeg size is too big + // (around 5 Mb) + else if ( KErrNoMemory == err ) + { + LOG (KImageEditorLogFile, "CImageController::LoadImageL() -- Not enough memory to use IPE"); + iObserver->OperationReadyL ( iOperation, err ); + } + else + { + User::Leave (err); + } + } + } + +} + +//============================================================================= +void CImageController::SaveImageL (const TDesC & /*aFileName*/) +{ + + LOG(KImageEditorLogFile, "CImageController: Saving image"); + + // Start saving operation + iOperation = MImageControllerObserver::EOperationCodeBlockSave; + iSavedPercentage = 1; + iSavedPercentageOld = 1; + iIsCancelled = EFalse; + iManager->PrepareAsyncSaveL (iQuality); + + // Force RunL() + CompleteRequest(); +} + +//============================================================================= +TInt CImageController::RenameImage ( + const TDesC & aFileNameSrc, + const TDesC & aFileNameDst + ) const +{ + return iImageHandler->RenameImage (aFileNameSrc, aFileNameDst); +} + +//============================================================================= +TInt CImageController::DeleteImage (const TDesC & aFileName) const +{ + return iImageHandler->DeleteImage (aFileName); +} + +//============================================================================= +void CImageController::DoCancel() +{ + LOG(KImageEditorLogFile, "CImageController::DoCancel"); + + if( IsActive() ) + { + iImageHandler->CleanupConverters(); + } +} + +//============================================================================= +void CImageController::CancelOperation (TBool aForce) +{ + LOGFMT(KImageEditorLogFile, "CImageController::CancelImageController: iOperation == %d", iOperation); + + iIsCancelled = ETrue; + + // Handle cancelling block save + if (aForce) + { + CompleteRequest(); + } +} + +//============================================================================= +void CImageController::RunL () +{ + + switch (iOperation) + { + /// Loading images + case MImageControllerObserver::EOperationCodeLoad: + { + LOG(KImageEditorLogFile, "CImageController: Loading completed"); + iObserver->OperationReadyL ( iOperation, iStatus.Int() ); + break; + } + + case MImageControllerObserver::EOperationCodeBlockLoad: + { + LOG(KImageEditorLogFile, "CImageController: Loading completed"); + iObserver->OperationReadyL ( iOperation, iStatus.Int() ); + break; + } + + /// Block saving images + case MImageControllerObserver::EOperationCodeBlockSave: + { + // Handle cancelling block save + if (iIsCancelled) + { + LOG(KImageEditorLogFile, "CImageController: Saving cancelled"); + iManager->SaveAbortL(); + iObserver->OperationReadyL ( iOperation, KErrCancel ); + } + + else + { + // Increment progress bar + if ( iSavedPercentage > iSavedPercentageOld ) + { + iObserver->IncrementProgressBarL (iSavedPercentage - iSavedPercentageOld); + iSavedPercentageOld = iSavedPercentage; + } + + // Save next block + iSavedPercentage = iManager->SaveBlockL(); + + // Complete? + if (iSavedPercentage == 100) + { + // Save completed + LOG(KImageEditorLogFile, "CImageController: Saving completed"); + iManager->FinishAsyncSaveL(); + iObserver->OperationReadyL ( iOperation, iStatus.Int() ); + } + + // Save next block + else + { + CompleteRequest(); + + } + } + break; + } + + /// Saving images + case MImageControllerObserver::EOperationCodeSave: + { + iObserver->OperationReadyL ( iOperation, iStatus.Int() ); + break; + } + /// Deleting images + case MImageControllerObserver::EOperationCodeDelete: + /// Renaming images + case MImageControllerObserver::EOperationCodeRename: + /// Searching images + case MImageControllerObserver::EOperationCodeSearch: + default: + { + User::Panic(KComponentName, EImageEditorPanicUnexpectedCommand); + break; + } + } +} + +//============================================================================= +CImageController::CImageController () : +CActive (CActive::EPriorityStandard) +{ + +} + + +//============================================================================= +void CImageController::CreatePreviewBitmapL () +{ + LOG(KImageEditorLogFile, "CImageController: Creating preview bitmap"); + // Get current screen rect + TRect rect; + CResolutionUtil::Self()->GetClientRect(rect); + TSize size = rect.Size(); + + LOG(KImageEditorLogFile, "CImageController: Resolution read"); + LOGFMT(KImageEditorLogFile, " Width: %d", size.iWidth); + LOGFMT(KImageEditorLogFile, " Height: %d", size.iHeight); + + // Create bitmap + if (iPreview) + { + delete iPreview; + iPreview = NULL; + } + + iPreview = new (ELeave) CFbsBitmap; + User::LeaveIfError ( iPreview->Create ( size, EColor16M) ); + + // Set bitmap + iManager->SetPreviewImage (iPreview); +} + +//============================================================================= +void CImageController::DeletePreviewBitmap() +{ + LOG(KImageEditorLogFile, "CImageController: Deleting preview bitmap"); + delete iPreview; + iPreview = NULL; + iManager->SetPreviewImage (NULL); +} + +//============================================================================= +void CImageController::CompleteRequest() +{ + if ( IsActive() ) + { + Cancel(); + } + TRequestStatus * p = &iStatus; + SetActive(); + User::RequestComplete (p, KErrNone); +} + +//============================================================================= +void CImageController::CalculateProgressInterval (TInt aBlockCount) +{ + const TInt KMaxProgressSteps = 25; + + iProgressBarInterval = 1; + while( (aBlockCount / iProgressBarInterval) > KMaxProgressSteps ) + { + iProgressBarInterval++; + } + + LOGFMT(KImageEditorLogFile, "CImageController: Progress bar interval: %d", iProgressBarInterval); +} + +// End of File