imageeditor/ImageEditorManager/src/ImageEditorPluginManager.cpp
changeset 1 edfc90759b9f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imageeditor/ImageEditorManager/src/ImageEditorPluginManager.cpp	Fri Jan 29 13:53:17 2010 +0200
@@ -0,0 +1,651 @@
+/*
+* 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:  
+*
+*/
+
+
+
+#include <fbs.h>
+#include <utf.h>
+#include <eikenv.h>
+
+#include "ImageEditorPluginManager.h"
+#include "ImageEditorManagerDef.h"
+
+#include "PluginBaseDefs.h"
+#include "ImageEditorPluginBaseDefs.h"
+#include "ImageEditorPluginBase.hrh"
+#include "iepb.h"
+#include "ImageEditorError.h"
+
+#include "ImageEditorEngineWrapper.h"
+#include "PluginLoader.h"
+#include "EditorImage.h"
+#include "SystemParameters.h"
+#include "ResolutionUtil.h"
+
+#ifdef RD_CONTENTNOTIFICATION
+
+// For notifying Media Gallery of new files
+//#include <contentnotification.hrh> // notification event type definitions
+#include <contentnotification.h>
+#include <contentcreatedevent.h>
+
+#endif //RD_CONTENTNOTIFICATION
+// LOCAL CONSTANTS
+
+_LIT( KComponentName, "ImageEditorPluginManager"); // Panic category
+const TInt KImageEditorPluginManagerPanicNoPluginLoaded = 0; 
+
+
+//=============================================================================
+EXPORT_C CImageEditorPluginManager * CImageEditorPluginManager::NewL ()
+{
+	CImageEditorPluginManager * self = new (ELeave) CImageEditorPluginManager;
+	CleanupStack::PushL (self);
+	self->ConstructL();
+	CleanupStack::Pop(); // self
+	return self;
+}
+
+//=============================================================================
+EXPORT_C CImageEditorPluginManager::~CImageEditorPluginManager ()
+{
+	Cleanup();
+    delete iPluginLoader;
+ #ifdef RD_CONTENTNOTIFICATION
+    delete iEventNotifier;
+ #endif
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::OpenPluginL (const TDesC &	aFileName)
+{
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager: Opening plugin");
+
+	//	Load plug-in
+    iPluginLoader = CPluginLoader::NewL (aFileName, &TUid2, NULL);
+
+	// Get the plug-in filter type
+	TBuf<256>	iobuf;  
+	iPluginLoader->GetPlugin()->GetProperty (KCapPluginFilterType, iobuf);
+	TLex lex (iobuf);
+	iFilterType = 0;
+	lex.Val (iFilterType);
+
+    // Get the plug-in ui type
+	iobuf.Zero();
+	iPluginLoader->GetPlugin()->GetProperty (KCapPluginUiType, iobuf);
+	lex.Assign (iobuf);
+	iUiType = 0;
+	lex.Val (iUiType);
+
+    // Disable global zoom / pan if plug-in does not support it 
+    iobuf.Zero();
+    TInt temp = 0;
+    iGlobalZoomDisabled = EFalse;
+    iPluginLoader->GetPlugin()->GetProperty (KCapGlobalZoomDisabled, iobuf);
+	lex.Assign (iobuf);
+	lex.Val (temp);
+    iGlobalZoomDisabled = (TBool)temp;
+    if (iGlobalZoomDisabled)
+    {
+        // Store old zoom value for restore
+        iEngineWrapper->StoreZoomL();
+        RenderL();
+    }
+
+	//	Add filter to the engine.
+	AddFilterToEngineL();
+
+    //  Add system parameters to plug-in
+    CSystemParameters * syspars = iEngineWrapper->GetSystemPars();
+    iobuf.Zero();
+	iobuf.AppendNum ((TInt)((TAny *)(syspars)));
+    iPluginLoader->GetPlugin()->SetProperty (KCapSystemParameters, iobuf);
+
+
+}
+
+//=============================================================================
+EXPORT_C TInt CImageEditorPluginManager::CreatePluginControlL (
+	const TRect &	aRect,
+	CCoeControl *	aParent,
+	CCoeControl *&	aPluginControl
+	)
+{
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager: Creating plugin control");
+    
+    //	Initialize plug-in control
+    if (iPluginLoader)
+    {
+        TInt ret = KErrGeneral;
+        CPluginType* plugin = iPluginLoader->GetPlugin();
+        if ( plugin )
+        {
+            ret = plugin->InitPluginL (aRect, aParent, aPluginControl);
+        }
+        return ret;
+    }
+    else
+    {
+        aPluginControl = 0;
+        return KErrGeneral;
+    }
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::ClosePlugin()
+{
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager: Closing plugin");
+
+    if (iPluginLoader && !iOnTheWayToDestruction)
+    {
+        //  Enable zoom if disabled
+        if (iGlobalZoomDisabled)
+        {   
+            TRAP_IGNORE(iEngineWrapper->RestoreZoomL());
+        }
+		TRAP_IGNORE(ProcessImageL());
+    }
+
+    //  Delete and unload current plug-in
+    delete iPluginLoader;
+    iPluginLoader = NULL;
+    iFilterType = NULL;
+    iUiType = NULL;
+    iGlobalZoomDisabled = EFalse;
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::ShowPluginPopup()
+{
+    if (iPluginLoader)
+    {
+        CPluginType* plugin = iPluginLoader->GetPlugin();
+        if ( plugin )
+        {
+            plugin->ShowPopupNote ();
+        }
+    }
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::UndoL()
+{
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager: Undoing");
+    
+    //	Undo step
+	iEngineWrapper->UndoL();
+
+	//	Render
+	RenderL();
+
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::RedoL()
+{
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager: Redoing");
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::LoadImageL(const TBool aUseIPECodec)
+{
+
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager: Loading image");
+
+	if ( aUseIPECodec )
+	{
+	    //	Create new jpeg source
+		iEngineWrapper->CreateJpegSourceL ( iImage->GetImageName() );
+	}
+	else
+	{
+	    //	Create new icl source
+		iEngineWrapper->CreateIclSourceL ( iImage->GetImageName() );
+	}
+
+	//	Render
+	RenderL();
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::SaveImageL (
+    const TInt      aQuality,
+    const TSize *   aSize
+    )
+{
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager: Saving image");
+
+    //	Create RAJPEG sink
+	iEngineWrapper->CreateJpegTargetL (iImage->GetImageName(), aQuality, aSize);
+
+	//	Render
+	iEngineWrapper->RenderL ();
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::PrepareAsyncSaveL (
+    const TInt      aQuality,
+    const TSize *   aSize
+    )
+    {
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager: Preparing for async save");
+
+	//  Disable and store zoom
+	iEngineWrapper->StoreZoomL();
+
+    //	Create new EXIF thumbnail
+	iEngineWrapper->CreateExifThumbNailL ();
+
+    //	Create RAJPEG sink
+	iEngineWrapper->CreateJpegTargetL  (iImage->GetImageName(), aQuality, aSize);
+
+    //  Start rendering
+    iEngineWrapper->RenderL ();
+    }
+
+//=============================================================================
+EXPORT_C TInt CImageEditorPluginManager::SaveBlockL ()
+    {
+   	//	Render
+    return iEngineWrapper->RenderBlockL();
+    }
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::SaveAbortL ()
+    {
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager: Saving aborted");
+
+    iEngineWrapper->RenderAbortL();
+
+	iEngineWrapper->RestoreZoomL();
+
+    RenderL();
+    }
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::FinishAsyncSaveL ()
+    {
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager::FinishAsyncSaveL");
+
+#ifdef RD_CONTENTNOTIFICATION    
+    TArray<CContentNotificationEvent*> eventArray;
+    
+    // Nofication about new content
+	CContentNotificationEvent* event = CContentCreatedEvent::NewLC( iImage->GetImageName() );
+	eventArray->AppendL( event );
+	CleanupStack::Pop( event );
+
+    User::LeaveIfError(iEventNotifier->SendNotification( eventArray ));
+    delete event;
+    delete eventArray;
+#endif
+    
+    iEngineWrapper->RestoreZoomL();
+     
+    RenderL();
+    }
+
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::ProcessImageL()
+{
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager: Rendering image");
+
+	//	Set filter parameters
+	SetParametersL();
+
+    //	Render
+ 	RenderL ();
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::PrepareAsyncProcessL (TInt& aBlockCount)
+{
+	//	Set filter parameters
+	SetParametersL();
+
+    // Start rendering
+    RenderL (&aBlockCount);
+}
+
+//=============================================================================
+EXPORT_C TInt CImageEditorPluginManager::ProcessBlockL()
+{
+    //	Render
+ 	return iEngineWrapper->RenderBlockL ();
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::FinishAsyncProcess()
+{
+
+}
+
+//=============================================================================
+EXPORT_C CFbsBitmap * CImageEditorPluginManager::GetPreviewImage()
+{
+	return iImage->GetPreviewData();
+}
+
+//=============================================================================
+EXPORT_C CFbsBitmap * CImageEditorPluginManager::GetFullImage()
+{
+	return iImage->GetFullData();
+}
+
+//=============================================================================
+EXPORT_C const TDesC & CImageEditorPluginManager::GetImageName()
+{
+	return iImage->GetImageName();
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::SetPreviewImage (CFbsBitmap * aBitmap)
+{
+	iImage->GetPreviewData() = aBitmap;
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::SetFullImage (CFbsBitmap * aBitmap)
+{
+	iImage->GetFullData() = aBitmap;
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::SetImageName (const TDesC & aFileName)
+{
+	iImage->GetImageName().Copy ( aFileName );
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::ResetEngineL()
+{
+	//	Clean up
+	Cleanup();
+    
+    //  Create a new MIA engine
+    iEngineWrapper = CEngineWrapper::NewL();
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::PurgeUndoRedoHistory()
+{
+    iEngineWrapper->InitUndoRedo();
+}
+
+//=============================================================================
+EXPORT_C TBool CImageEditorPluginManager::CanUndo()
+{
+    return iEngineWrapper->CanUndo();
+}
+
+//=============================================================================
+EXPORT_C TBool CImageEditorPluginManager::IsImageChanged()
+{
+    return iEngineWrapper->IsImageChanged();
+}
+
+//=============================================================================
+EXPORT_C TBool CImageEditorPluginManager::IsLandscapeEnabledL() const
+{
+    TBool ret = ETrue;
+    
+    if (iPluginLoader)
+        {
+        TBuf<256>	iobuf; 
+        TInt err = iPluginLoader->GetPlugin()->GetProperty(KCapIsLandscapeEnabled, iobuf);
+        if (err != KErrNone)
+            {
+            User::Leave(KSIEEInternal);
+            }
+        else
+            {
+            TLex parser(iobuf);
+            User::LeaveIfError(parser.Val(ret));
+            }
+        }
+
+    return ret;
+}
+
+//=============================================================================
+CImageEditorPluginManager::CImageEditorPluginManager () 
+: iGlobalZoomDisabled(EFalse), iOnTheWayToDestruction (EFalse)
+{
+
+}
+
+//=============================================================================
+void CImageEditorPluginManager::ConstructL ()
+{
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager: Creating manager");
+    //  Create new image
+	iImage = CEditorImage::NewL ();
+
+    //  Create a new MIA engine
+    iEngineWrapper = CEngineWrapper::NewL();
+
+#ifdef RD_CONTENTNOTIFICATION
+    iEventNotifier = CContentNotification::NewL ();
+#endif 
+
+	//  Get the screen size from the Resolution Util
+    TRect rect;
+    CResolutionUtil::Self()->GetClientRect(rect);
+    TSize size = rect.Size();
+
+    //  Set screen size to the engine
+   iEngineWrapper->SetScreenSizeL (size);
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::SetScreenSizeL () 
+{
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager: Setting new screen size");
+
+	iEngineWrapper->CreateRGB888TargetL ();
+	
+    //  Get the screen size from the Resolution Util
+    TRect rect;
+    CResolutionUtil::Self()->GetClientRect(rect);
+    TSize size = rect.Size();
+
+    //  Set screen size to the engine
+    iEngineWrapper->SetScreenSizeL (size);
+
+    //  Render to new screen size
+    RenderL();
+
+	//	Compute system parameters
+	iEngineWrapper->GetSystemPars();
+}
+
+
+//=============================================================================
+void CImageEditorPluginManager::SetParametersL()
+{
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager: Setting parameters");
+
+	if (EPluginFilterTypeABITO == iFilterType)
+	{
+		//	used as a buffer
+		TBuf<256> param; 
+			
+		TInt err = iPluginLoader->GetPlugin()->GetProperty(KCapParamStruct, param);
+
+		//	If cancelling, there might not be a control, KErrNotReady returned
+		//	Ignore KErrNotReady
+        if ( (err != KErrNone) && (err != KErrNotReady) )
+		{
+            User::Leave(KSIEEInternal);
+        }
+
+		iEngineWrapper->SetParamsL (param);
+	}
+}
+
+//=============================================================================
+void CImageEditorPluginManager::RenderL (TInt * aMultiSessionBlockCount)
+{
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager: Rendering");
+
+	TBuf<256>	iobuf;  
+	TBool readyToRender = ETrue;
+
+    // Check that filter can be rendered
+    if ( iPluginLoader && iFilterType == EPluginFilterTypeABITO )
+	    {
+        TInt err = iPluginLoader->GetPlugin()->GetProperty(KCapReadyToRender, iobuf);
+        if (err != KErrNone)
+            {
+            User::Leave(KSIEEInternal);
+            }
+        else
+            {
+            TLex parser(iobuf);
+            User::LeaveIfError(parser.Val(readyToRender));
+            }
+        }
+
+	if (readyToRender)
+		{
+		iEngineWrapper->SetBitmap ( iImage->GetPreviewData() );
+		iEngineWrapper->CreateRGB888TargetL ();
+	    iEngineWrapper->RenderL (aMultiSessionBlockCount);
+		}    
+
+        
+}
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::AddFilterToEngineL()
+{
+    LOG(KImageEditorLogFile, "CImageEditorPluginManager: Adding filter to engine");
+
+	//	Add undo-redo step
+    iEngineWrapper->AddUndoRedoStepL();
+
+    if (EPluginFilterTypeABITO == iFilterType)
+    {
+
+		TBuf<256>	iobuf;  
+		TLex 		parser;
+
+        //	Add filter to the engine
+	    TFileName	filterFile;
+        CPluginType* plugin = iPluginLoader->GetPlugin(); // must not return null
+        __ASSERT_ALWAYS( plugin, User::Panic(KComponentName, KImageEditorPluginManagerPanicNoPluginLoaded) );
+
+        User::LeaveIfError( plugin->GetProperty (KCapFilterName, iobuf) );
+        filterFile.Copy ( iobuf );
+
+        // Construct full dll path
+        TFileName filterNameAndPath( KPluginDriveAndPath );
+        filterNameAndPath.Append( filterFile );
+
+        LOGFMT( KImageEditorLogFile,"\tPlug-in file: %S", &filterNameAndPath );
+
+        iobuf.Zero();
+        User::LeaveIfError( iPluginLoader->GetPlugin()->GetProperty (KCapPluginScope, iobuf) );
+        parser = iobuf;
+        parser.Val (iPluginScope);
+    
+        iEngineWrapper->AddFilterL ( filterNameAndPath );
+    }
+}
+
+//=============================================================================
+void CImageEditorPluginManager::Cleanup()
+{
+    iOnTheWayToDestruction = ETrue;
+
+	//	Close plug-in
+	ClosePlugin();
+
+	//	Delete engine
+    delete iEngineWrapper;
+	iEngineWrapper = NULL;
+
+	//	Delete editor image
+    delete iImage;
+	iImage = NULL;
+}
+
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::ZoomL (const TZoom aZoom)
+    {
+    if( !iGlobalZoomDisabled )
+    	{
+    	iEngineWrapper->ZoomL (aZoom);
+    	}
+    }
+    
+//=============================================================================
+EXPORT_C TZoomMode CImageEditorPluginManager::GetZoomMode()
+    {
+    return iEngineWrapper->GetZoomMode();
+    }
+    
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::PanL (const TDirection aDir)
+    {
+    iEngineWrapper->PanL (aDir);
+    }
+
+//=============================================================================    
+EXPORT_C void CImageEditorPluginManager::PanL( TInt aXChange, TInt aYChange )
+    {
+    iEngineWrapper->PanL( aXChange, aYChange );
+    }
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::RotateL (const TRotation aRot)
+    {
+   	//	Rotate image
+    iEngineWrapper->RotateL (aRot);
+    }
+
+//=============================================================================
+EXPORT_C const CSystemParameters & CImageEditorPluginManager::GetSystemParameters() const
+{
+    return *iEngineWrapper->GetSystemPars();
+}
+
+//=============================================================================
+EXPORT_C TBool CImageEditorPluginManager::IsPluginLoaded () const
+{
+    if (iPluginLoader)
+    {
+        return ETrue;
+    }
+    else
+    {
+        return EFalse;
+    }
+}
+
+
+//=============================================================================
+EXPORT_C void CImageEditorPluginManager::RestoreFilterL() const
+{
+
+}
+
+// End of file