--- /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