imageeditor/imageeditorApp/src/ImageEditorImageController.cpp
changeset 1 edfc90759b9f
--- /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