--- /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 <eikenv.h>
+#include <bautils.h>
+#include <e32math.h>
+
+#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