imagingandcamerafws/imagingfws/ImageProcessor/src/imageprocessorimpl.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagingandcamerafws/imagingfws/ImageProcessor/src/imageprocessorimpl.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,1458 @@
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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:
+//
+// Description:
+//
+
+#include <e32std.h>
+#include <ecom/ecom.h>
+#include <ecom/implementationinformation.h>
+#include <caf/caf.h>
+#include <caf/content.h>
+#include <caf/data.h>
+#include <mm/mmcleanup.h>
+#include <mm/mmpluginutils.h>
+#include <imageframe.h>
+#include <imageprocessor/imageprocessor_uids.hrh>
+#include "imageprocessorimpl.h"
+#include <imageprocessor/imageprocessorobserver.h>
+#include <imageprocessor/imageprocessorplugin.h>
+#include <imageprocessor/imageprocessoreffect.h>
+#include "imageprocessorcallback.h"
+#include <imageprocessor/imageprocessorpreview.h>
+#include <imageprocessor/imageprocessorpreviewintf.h>
+#include <imageprocessor/imageprocessoroverlay.h>
+#include <imageprocessor/imageprocessoroverlayintf.h>
+#include <imageprocessor/imageprocessorprogressinfo.h>
+#include <imageprocessor/imageprocessorprogressinfointf.h>
+#include <imageprocessor/imageprocessorinputinfo.h>
+#include <imageprocessor/imageprocessorinputinfointf.h>
+#include <imageprocessor/imageprocessoroutputinfo.h>
+#include <imageprocessor/imageprocessoroutputinfointf.h>
+#include "imageprocessormain.h"
+
+using namespace ImageProcessor;
+
+// current state = row
+// new state = column
+const TBool CImageProcessorImpl::iValidStates[CImgProcessor::EStatesCount][CImgProcessor::EStatesCount] = 
+	{
+	
+		//	EUninitialized	EInitializing	EInitialized	EEffectActive	EProcessing	PInit	PRend
+		{	
+			ETrue, 			ETrue, 			EFalse, 		EFalse, 		EFalse,		EFalse,	EFalse	//EUninitialized
+		},		
+		{	
+			ETrue, 			ETrue, 			ETrue, 			EFalse,			EFalse,		EFalse,	EFalse	//EInitializing
+		},
+		{	
+			ETrue,	 		EFalse,			ETrue, 			ETrue, 			ETrue,		ETrue,	ETrue	//EInitialized
+		},		
+		{	
+			EFalse, 		EFalse,			ETrue,			ETrue, 			ETrue,		ETrue,	ETrue	//EEffectActive
+		},
+		{	
+			EFalse, 		EFalse,			ETrue,			ETrue,			ETrue,		EFalse,	EFalse	//EProcessing
+		},
+		{	
+			EFalse, 		EFalse,			ETrue,			ETrue,			EFalse,		ETrue,	EFalse	//EPreviewInitializing
+		},
+		{	
+			EFalse, 		EFalse,			ETrue,			ETrue,			EFalse,		EFalse,	ETrue	//EPreviewRendering
+		}
+	};
+
+CImageProcessorImpl* CImageProcessorImpl::NewL(RFs& aFileServerSession, CImgProcessor& aImageProcessor, MImgProcessorObserver& aObserver, TUid aPluginUid)
+	{
+	CImageProcessorImpl* self = new (ELeave) CImageProcessorImpl(aFileServerSession, aImageProcessor, aPluginUid);
+	CleanupStack::PushL(self);
+	self->ConstructL(aObserver);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CImageProcessorImpl::CImageProcessorImpl(RFs& aFileServerSession, CImgProcessor& aImageProcessor, TUid aPluginUid):
+	iFileServerSession(aFileServerSession),
+	iImageProcessor(aImageProcessor),
+	iPluginUid(aPluginUid)
+	{
+	}
+   
+void CImageProcessorImpl::ConstructL(MImgProcessorObserver& aObserver)
+	{
+	iCallbackHandler = CImageProcessorCallback::NewL(iImageProcessor,aObserver);
+	}
+
+void CImageProcessorImpl::Cleanup()
+	{
+	Cancel();
+	
+	TInt err = KErrNone;
+	
+	if (iOverlay) 
+		{
+		TRAP(err, iOverlay->ResetL());
+		}
+	
+	for (TInt i=0; i < iEffects.Count(); i++ )
+		{ 
+		TRAP(err, iEffects[i]->ResetL());
+		}
+	
+	for (TInt i=0; i < iPreviews.Count(); i++ )
+		{ 
+		TRAP(err, iPreviews[i]->ResetL());
+		TRAP(err, iPreviews[i]->UninitializeL());
+		}
+	
+	if (iPlugin)
+		{
+		TRAP(err, iPlugin->ResetL());
+		}
+
+	delete iCallbackHandler;
+	iCallbackHandler = NULL;
+	
+	delete iOverlay;
+	iOverlay = NULL;
+
+	delete iProgressInfo;
+	iProgressInfo = NULL;
+	
+	delete iInputInfo;
+	iInputInfo = NULL;
+
+	delete iOutputInfo;
+	iOutputInfo = NULL;
+
+	delete iDrmInput;
+	iDrmInput = NULL;
+	
+	delete iOverlayDrmInput;
+	iOverlayDrmInput = NULL;
+	
+	
+	iEffects.ResetAndDestroy();
+	iPreviews.ResetAndDestroy();
+	iOverlayDrmInputs.ResetAndDestroy();
+	iFrameworkEffects.Close();
+	iPluginEffects.Close();
+	iInputFormats.Close();
+	iInputImageFrameFormats.Close();
+	iInputDisplayModes.Close();
+	iOutputFormats.Close();
+	iOutputImageFrameFormats.Close();
+	iOutputDisplayModes.Close();
+	iPreviewOutputImageFrameFormats.Close();
+	iPreviewOutputDisplayModes.Close();
+	iOverlayInputFormats.Close();
+	iOverlayInputImageFrameFormats.Close();
+	iOverlayInputDisplayModes.Close();
+	iTypesUtilityArray.ResetAndDestroy();
+	
+	if(iPlugin)
+		{
+		iPlugin->Destroy();
+		iPlugin = NULL;
+		REComSession::DestroyedImplementation(iPluginDtorKey);      
+		}
+
+	iState = CImgProcessor::EUninitialized;
+	iPreviousState = CImgProcessor::EUninitialized;
+	
+	iSupportedOptions = CImgProcessor::EOptionNone;
+	iOptions = CImgProcessor::EOptionNone;
+	iSupportedOperations = CImgProcessor::EOperationNone;
+	
+	iIsInputSet = EFalse;
+	iIsOutputSet = EFalse;
+	}
+
+CImageProcessorImpl::~CImageProcessorImpl()
+	{
+	Cleanup();
+	}
+
+void CImageProcessorImpl::SupportedEffectsL(RArray<TUid>& aEffects) const
+	{
+	aEffects = iPluginEffects;
+	}
+
+void CImageProcessorImpl::SupportedInputFormatsL(RArray<TUid>& aFormats) const
+	{
+	aFormats = iInputFormats;
+	}
+
+void CImageProcessorImpl::SupportedInputSubFormatsL(TUid aFormats, RArray<TUid>& aSubFormats) const
+	{
+	iPlugin->SupportedInputSubFormatsL(aFormats, aSubFormats);
+	}
+
+void CImageProcessorImpl::SupportedInputImageFrameFormatsL(RArray<TUid>& aFormats) const
+	{
+	aFormats = iInputImageFrameFormats;
+	}
+
+void CImageProcessorImpl::SupportedInputDisplayModesL(RArray<TDisplayMode>& aDisplayModes) const
+	{
+	aDisplayModes = iInputDisplayModes;
+	}
+
+void CImageProcessorImpl::SupportedOutputFormatsL(RArray<TUid>& aFormats) const
+	{
+	aFormats = iOutputFormats;
+	}
+
+void CImageProcessorImpl::SupportedOutputSubFormatsL(TUid aFormat, RArray<TUid>& aSubFormats) const
+	{
+	iPlugin->SupportedOutputSubFormatsL(aFormat, aSubFormats);
+	}
+
+void CImageProcessorImpl::SupportedOutputImageFrameFormatsL(RArray<TUid>& aFormats) const
+	{
+	aFormats = iOutputImageFrameFormats;
+	}
+
+void CImageProcessorImpl::SupportedOutputDisplayModesL(RArray<TDisplayMode>& aDisplayModes) const
+	{
+	aDisplayModes = iOutputDisplayModes;
+	}
+
+TUint64 CImageProcessorImpl::SupportedOptions() const
+	{
+	return iSupportedOptions;
+	}
+
+TUint CImageProcessorImpl::SupportedOperations() const
+	{	
+	return iSupportedOperations;
+	}
+   
+void CImageProcessorImpl::SetOptionsL(TUint64 aOptions)
+	{
+	if ((aOptions | iSupportedOptions) != iSupportedOptions) 
+		{
+		User::Leave(KErrNotSupported);
+		}
+	CheckStateL(CImgProcessor::EInitialized);
+	iPlugin->SetOptionsL(aOptions);
+	iOptions = aOptions;
+	}
+
+void CImageProcessorImpl::ApplyOperationL(CImgProcessor::TOperation aOperation)
+	{
+	if ((aOperation | iSupportedOperations) != iSupportedOperations) 
+		{
+		User::Leave(KErrNotSupported);
+		}
+	__ASSERT_ALWAYS(((iState == CImgProcessor::EInitialized) && (iIsInputSet)), User::Leave(KErrNotReady));
+	iPlugin->ApplyOperationL(aOperation);
+	}
+
+void CImageProcessorImpl::CheckStateL(CImgProcessor::TState aState) const
+	{
+	if (iState != aState) 
+		{
+		User::Leave(KErrNotReady);
+		}
+	}
+
+CImgProcessor::TState CImageProcessorImpl::State() const
+	{
+	return iState;
+	}
+   
+void CImageProcessorImpl::SetInputL(const TDesC& aFilename, const TUid& aFormat, const TUid& aSubFormat)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), User::Leave(KErrNotReady));
+	CheckInputFormatL(aFormat, aSubFormat);
+	iPlugin->SetInputL(aFilename, aFormat, aSubFormat);
+
+	delete iDrmInput;
+	iDrmInput = NULL;
+	
+	iIsInputSet = ETrue;
+	}
+   
+void CImageProcessorImpl::SetInputL(RFile& aFile, const TUid& aFormat, const TUid& aSubFormat)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), User::Leave(KErrNotReady));
+	CheckInputFormatL(aFormat, aSubFormat);
+	iPlugin->SetInputL(aFile, aFormat, aSubFormat);
+
+	delete iDrmInput;
+	iDrmInput = NULL;
+
+	iIsInputSet = ETrue;
+	}
+
+void CImageProcessorImpl::SetInputL(TMMSource& aDrmFile, const TUid& aFormat, const TUid& aSubFormat)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), User::Leave(KErrNotReady));
+	CheckInputFormatL(aFormat, aSubFormat);
+	
+	CImageProcessorDrmInput* drmInput = CImageProcessorDrmInput::NewL(aDrmFile);
+	
+	CleanupStack::PushL(drmInput);
+	SetInputL(*(drmInput->Buffer()), aFormat, aSubFormat);
+	CleanupStack::Pop();
+
+	iDrmInput = drmInput;
+	}
+   
+void CImageProcessorImpl::SetInputL(const TDesC8& aBuffer, const TUid& aFormat, const TUid& aSubFormat)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), User::Leave(KErrNotReady));
+	CheckInputFormatL(aFormat, aSubFormat);
+	
+	if (aBuffer.Size() == 0) 
+		{
+		User::Leave(KErrArgument);
+		}
+
+	iPlugin->SetInputL(aBuffer, aFormat, aSubFormat);
+
+	delete iDrmInput;
+	iDrmInput = NULL;
+
+	iIsInputSet = ETrue;
+	}
+   
+void CImageProcessorImpl::SetInputL(const CFbsBitmap& aBitmap, const CFbsBitmap* aMask)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), User::Leave(KErrNotReady));
+	
+	if (aBitmap.SizeInPixels() == TSize(0,0)) 
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	if((aBitmap.Handle()!=0 && aBitmap.ExtendedBitmapType()!=KNullUid) || (aMask!=NULL && aMask->Handle()!=0 && aMask->ExtendedBitmapType()!=KNullUid))
+        {
+        User::Leave(KErrNotSupported);
+        }
+	
+	if ((aMask != NULL) && (aMask->SizeInPixels() == TSize(0,0))) 
+		{
+		User::Leave(KErrArgument);
+		}
+
+	iPlugin->SetInputL(aBitmap, aMask);
+
+	delete iDrmInput;
+	iDrmInput = NULL;
+
+	iIsInputSet = ETrue;
+	}
+   
+void CImageProcessorImpl::SetInputL(const CImageFrame& aPixelBuffer)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), User::Leave(KErrNotReady));
+	
+	if (aPixelBuffer.FrameSizeInPixels() == TSize(0,0)) 
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	iPlugin->SetInputL(aPixelBuffer);
+
+	delete iDrmInput;
+	iDrmInput = NULL;
+
+	iIsInputSet = ETrue;
+	}
+
+void CImageProcessorImpl::SetInputL(CImagePanorama& aPanorama)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), User::Leave(KErrNotReady));
+	
+	//get the extenstion interface to panorama image as input
+	TAny* any = iPlugin->Extension(TUid::Uid(KImageProcessorExtensionPanoramaInputUidValue));
+	MImgProcessorPluginPanoramaInput* extension = static_cast<MImgProcessorPluginPanoramaInput*>(any);
+	if(extension == NULL)
+		{
+		User::Leave(KErrNotSupported);
+		}
+	extension->SetInputL(aPanorama);
+	
+	delete iDrmInput;
+	iDrmInput = NULL;
+
+	iIsInputSet = ETrue;
+	}
+
+void CImageProcessorImpl::SetInputRectL(const TRect& aRect)
+	{
+	__ASSERT_ALWAYS(((iState == CImgProcessor::EInitialized) && (iIsInputSet)), User::Leave(KErrNotReady));
+	
+	if (aRect == TRect(0,0,0,0) || aRect.Size() == TSize(0,0)) 
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	TSize size = iPlugin->CurrentSizeL();
+
+	if (!TRect(size).Intersects(aRect)) 
+		{
+		User::Leave(KErrArgument);
+		}
+
+	iPlugin->SetInputRectL(aRect);
+	}
+
+TSize CImageProcessorImpl::CurrentSizeL() const
+	{
+	__ASSERT_ALWAYS(iIsInputSet, User::Leave(KErrNotReady));
+	return iPlugin->CurrentSizeL();
+	}
+
+TInt CImageProcessorImpl::CalculatePixelBufferSizeL(TSize aSizeInPixels, TDisplayMode aDisplayMode, TUint32 aScanLineLength) const
+	{
+	__ASSERT_ALWAYS((iState != CImgProcessor::EUninitialized), User::Leave(KErrNotReady));
+	return iPlugin->CalculatePixelBufferSizeL(aSizeInPixels, aDisplayMode, aScanLineLength);
+	}
+
+TInt CImageProcessorImpl::CalculatePixelBufferSizeL(TSize aSizeInPixels, const TUid& aFormat, TUint32 aScanLineLength) const
+	{
+	__ASSERT_ALWAYS((iState != CImgProcessor::EUninitialized), User::Leave(KErrNotReady));
+	return iPlugin->CalculatePixelBufferSizeL(aSizeInPixels, aFormat, aScanLineLength);
+	}
+
+void CImageProcessorImpl::CreateInputL(CFbsBitmap& aBitmap)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), User::Leave(KErrNotReady));
+	
+	if (aBitmap.SizeInPixels() == TSize(0,0)) 
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	if(aBitmap.Handle()!=0 && aBitmap.ExtendedBitmapType()!=KNullUid)
+        {
+        User::Leave(KErrNotSupported);
+        }
+
+	iPlugin->CreateInputL(aBitmap);
+	
+	delete iDrmInput;
+	iDrmInput = NULL;
+	
+	iIsInputSet = ETrue;
+	}
+
+void CImageProcessorImpl::CreateInputL(CImageFrame& aPixelBuffer)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), User::Leave(KErrNotReady));
+
+	if (aPixelBuffer.FrameSizeInPixels() == TSize(0,0)) 
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	iPlugin->CreateInputL(aPixelBuffer);
+	
+	delete iDrmInput;
+	iDrmInput = NULL;
+	
+	iIsInputSet = ETrue;
+	}
+
+void CImageProcessorImpl::CreateInputL(const TSize& aSize, const TRgb& aColor)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), User::Leave(KErrNotReady));
+	
+	if (aSize == TSize(0,0)) 
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	iPlugin->CreateInputL(aSize, aColor);
+	
+	delete iDrmInput;
+	iDrmInput = NULL;
+	
+	iIsInputSet = ETrue;
+	}
+
+void CImageProcessorImpl::InputUpdatedL()
+	{
+	__ASSERT_ALWAYS(((iState == CImgProcessor::EInitialized) && (iIsInputSet)), User::Leave(KErrNotReady));
+	iPlugin->InputUpdatedL();
+	}
+
+void CImageProcessorImpl::ResetL() 
+	{
+	__ASSERT_ALWAYS(((iState != CImgProcessor::EUninitialized) && (iState != CImgProcessor::EInitializing)), User::Leave(KErrNotReady));
+
+	Cancel();
+	
+	if (iOverlay) 
+		{
+		iOverlay->ResetL();
+		}
+	
+	delete iOverlayDrmInput;
+	iOverlayDrmInput = NULL;
+	
+	for (TInt i=0; i < iEffects.Count(); i++ )
+		{ 
+		iEffects[i]->ResetL();
+		}
+	
+	for (TInt i=0; i < iPreviews.Count(); i++ )
+		{ 
+		iPreviews[i]->ResetL();
+		}
+	
+	iPlugin->ResetL();
+	
+	delete iDrmInput;
+	iDrmInput = NULL;
+
+	delete iProgressInfo;
+	iProgressInfo = NULL;
+	
+	delete iInputInfo;
+	iInputInfo = NULL;
+	
+	delete iOutputInfo;
+	iOutputInfo = NULL;
+	
+	iPreviews.ResetAndDestroy();
+	iOverlayDrmInputs.ResetAndDestroy();
+
+	iIsInputSet = EFalse;
+	iIsOutputSet = EFalse;
+	
+	iOptions = CImgProcessor::EOptionNone;
+	}
+   
+void CImageProcessorImpl::InitializeL(TUint64 aOptions)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EUninitialized), User::Leave(KErrNotReady));
+	
+	// Client whishes to choose the plugin given by framework.
+	if(iPluginUid == KNullUid)
+		{
+		TUid interfaceUid = {KImageProcessorPluginInterfaceUidValue};
+		// Get the higher version of plugin
+		iPlugin = static_cast<MImgProcessorPlugin*>(MmPluginUtils::CreateImplementationL(interfaceUid, iPluginDtorKey));   
+		}
+	// If client has passed the plugin uid.	
+	else
+		{
+		iPlugin = static_cast<MImgProcessorPlugin*>(REComSession::CreateImplementationL(iPluginUid, iPluginDtorKey));   
+		}	
+		
+	iPlugin->SetFileServerSession(iFileServerSession);
+	iPlugin->SetObserver(*this);
+	iPlugin->SupportedEffectsL(iPluginEffects);
+	iPlugin->SupportedInputFormatsL(iInputFormats);
+	iPlugin->SupportedInputImageFrameFormatsL(iInputImageFrameFormats);
+	iPlugin->SupportedInputDisplayModesL(iInputDisplayModes);
+	iPlugin->SupportedOutputFormatsL(iOutputFormats);
+	iPlugin->SupportedOutputImageFrameFormatsL(iOutputImageFrameFormats);
+	iPlugin->SupportedOutputDisplayModesL(iOutputDisplayModes);
+	
+	iSupportedOptions = iPlugin->SupportedOptions();
+	if ((aOptions | iSupportedOptions) != iSupportedOptions) 
+		{
+		User::Leave(KErrNotSupported);
+		}
+	iPlugin->SetOptionsL(aOptions);
+	iOptions = aOptions;
+	
+	iSupportedOperations = iPlugin->SupportedOperations();
+
+	iPlugin->SupportedPreviewOutputImageFrameFormatsL(iPreviewOutputImageFrameFormats);
+	iPlugin->SupportedPreviewOutputDisplayModesL(iPreviewOutputDisplayModes);
+	iPlugin->SupportedOverlayInputFormatsL(iOverlayInputFormats);
+	iPlugin->SupportedOverlayInputImageFrameFormatsL(iOverlayInputImageFrameFormats);
+	iPlugin->SupportedOverlayInputDisplayModesL(iOverlayInputDisplayModes);
+
+	CImageDecoder::GetFileTypesL(iTypesUtilityArray);	
+
+	InitializeFrameworkEffectsL();
+	
+	SetStateL(CImgProcessor::EInitializing);
+
+	iPlugin->InitializeL();
+
+	if ((iOptions & CImgProcessor::EOptionSyncProcessing) != 0) 
+		{
+		SetStateL(CImgProcessor::EInitialized);
+		}
+	}
+
+void CImageProcessorImpl::InitializeFrameworkEffectsL() 
+	{
+	//PhotoArt
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectSepiaUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectGrayscaleUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectNegativeUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectGrayscaleNegativeUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectOilyUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectPaintUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectMilkyUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectFogUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectMirrorLeftToRightUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectMagicPenUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectAntiqueUid);
+	
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectBrightnessUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectSharpnessUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectRotationUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectContrastUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectRgbColorAdjustUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectEmbossUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectSolarizeUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectPosterizeUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectStampUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectSketchUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectNoiseUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectMoonlightUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectFrostedGlassUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectDespeckleUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectBlurUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectColorizationUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectCartoonUid);
+		
+	//ClearShot
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectLocalBoostUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectColorBoostUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectWhiteBalanceUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectAutoLevelsUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectLevelsUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectExposureUid);
+
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectSpotLightUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectCustomTransformationUid);
+	
+	//Others
+	iFrameworkEffects.AppendL(ImageProcessor::KGeometricalOperationUid);
+	iFrameworkEffects.AppendL(ImageProcessor::KEffectBorderUid);
+	}
+      
+void CImageProcessorImpl::ProcessL(const TSize& aSize, TBool aMaintainAspectRatio)
+	{
+	__ASSERT_ALWAYS(((iState == CImgProcessor::EInitialized) && (iIsInputSet) && (iIsOutputSet)), User::Leave(KErrNotReady));
+	SetStateL(CImgProcessor::EProcessing);
+
+	TRAPD(err, iPlugin->ProcessL(aSize, aMaintainAspectRatio));
+
+	if (err != KErrNone) 
+		{
+		RestoreStateL();
+		User::Leave(err);
+		}
+
+	if ((iOptions & CImgProcessor::EOptionSyncProcessing) != 0) 
+		{
+		if (iDrmInput) 
+			{
+			TRAPD(drmErr, iDrmInput->ExecuteIntentL());
+			if (drmErr != KErrNone) 
+				{
+				iPlugin->CleanupOutput(); //should delete/cleanup unauthorised output
+				User::Leave(drmErr);
+				}
+			}
+		
+		for (TInt i=0; i < iOverlayDrmInputs.Count(); i++ )
+			{ 
+			TRAPD(overlayDrmErr, iOverlayDrmInputs[i]->ExecuteIntentL());
+			if (overlayDrmErr != KErrNone) 
+				{
+				iPlugin->CleanupOutput(); //should delete/cleanup unauthorised output
+				User::Leave(overlayDrmErr);
+				}
+			}
+		RestoreStateL();
+		}
+
+	}
+   
+void CImageProcessorImpl::Cancel()
+	{
+	if(iState == CImgProcessor::EInitializing || iState == CImgProcessor::EProcessing)
+		{
+		iState = iPreviousState;
+		iPlugin->Cancel();
+		}
+	else if (iState == CImgProcessor::EPreviewInitializing || iState == CImgProcessor::EPreviewRendering) 
+		{
+		for (TInt i=0; i < iPreviews.Count(); i++ )
+			{ 
+			iPreviews[i]->Cancel();
+			}
+		// RestoreStateL should be called in preview cancel but double check here
+		if (iState == CImgProcessor::EPreviewInitializing || iState == CImgProcessor::EPreviewRendering) 
+			{
+			iState = iPreviousState;
+			}
+		iPlugin->Cancel();
+		}
+	}
+   
+void CImageProcessorImpl::SetBackgroundColorL(const TRgb& aColor)
+	{
+	__ASSERT_ALWAYS(((iState == CImgProcessor::EInitialized) && (iIsInputSet)), User::Leave(KErrNotReady));
+	iPlugin->SetBackgroundColorL(aColor);
+	}
+   
+TRgb CImageProcessorImpl::BackgroundColorL() const
+	{
+	__ASSERT_ALWAYS(iIsInputSet, User::Leave(KErrNotReady));
+	return iPlugin->BackgroundColorL();
+	}
+
+void CImageProcessorImpl::CheckInputFormatL(const TUid& aFormat, const TUid& aSubFormat) 
+	{
+	if (aFormat == KNullUid && aSubFormat == aSubFormat) 
+		{
+		return;	
+		}
+	
+	User::LeaveIfError(iInputFormats.Find(aFormat));
+	if (aSubFormat != KNullUid) 
+		{
+		RArray<TUid> subFormats;
+		iPlugin->SupportedInputSubFormatsL(aFormat, subFormats);
+		TInt err = subFormats.Find(aSubFormat);
+		subFormats.Close();
+		User::LeaveIfError(err);
+		}
+	}
+
+void CImageProcessorImpl::CheckOutputFormatL(const TUid& aFormat, const TUid& aSubFormat)
+	{
+	User::LeaveIfError(iOutputFormats.Find(aFormat));
+	if (aSubFormat != KNullUid) 
+		{
+		RArray<TUid> subFormats;
+		iPlugin->SupportedOutputSubFormatsL(aFormat, subFormats);
+		TInt err = subFormats.Find(aSubFormat);
+		subFormats.Close();
+		User::LeaveIfError(err);
+		}
+	}
+
+TBool CImageProcessorImpl::IsFrameworkEffect(TUid aEffect) const
+	{
+	return (iFrameworkEffects.Find(aEffect) != KErrNotFound);
+	}
+
+TBool CImageProcessorImpl::IsPluginEffect(TUid aEffect) const
+	{
+	return (iPluginEffects.Find(aEffect) != KErrNotFound);
+	}
+
+TBool FindEffectRelation(const TUid* aKey, const TEffect& aEffect)
+	{
+	return (*aKey==aEffect.Type());
+	}
+
+TEffect* CImageProcessorImpl::FindEffect(TUid aEffect) const
+	{
+	const TInt idx = iEffects.Find<TUid>(aEffect, FindEffectRelation);
+	
+	TEffect* effect=NULL;
+	if(idx != KErrNotFound)
+		{
+		//Effect found
+		effect = iEffects[idx];
+		}
+	return effect;
+	}
+
+TEffect* CImageProcessorImpl::CreateEffectL(TUid aEffect)
+	{	
+	//Ownership stays with plugin
+	Plugin::MEffect* pluginEffect = iPlugin->EffectL(aEffect);
+	ASSERT(pluginEffect);
+	
+	TEffect* effect = EffectFactoryL(aEffect, pluginEffect);
+	
+	if (!effect || (iEffects.Append(effect) != KErrNone)) 
+		{
+		delete effect;
+		TInt err = KErrNone;
+		TRAP(err, ResetL());
+		iEffects.ResetAndDestroy();
+		iPlugin->CleanupEffects();
+		User::Leave(KErrNoMemory);
+		}
+
+	ASSERT(effect);
+	return effect;
+	}
+
+TEffect* CImageProcessorImpl::EffectFactoryL(TUid aEffect, Plugin::MEffect* aPluginEffect)
+	{
+	if(aEffect == KEffectSepiaUid)
+		{
+		return new TEffectSepia(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectGrayscaleUid)
+		{
+		return new TEffectGrayscale(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectNegativeUid)
+		{
+		return new TEffectNegative(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectGrayscaleNegativeUid)
+		{
+		return new TEffectGrayscaleNegative(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectOilyUid)
+		{
+		return new TEffectOily(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectPaintUid)
+		{
+		return new TEffectPaint(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectMilkyUid)
+		{
+		return new TEffectMilky(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectFogUid)
+		{
+		return new TEffectFog(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectMirrorLeftToRightUid)
+		{
+		return new TEffectMirrorLeftToRight(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectMagicPenUid)
+		{
+		return new TEffectMagicPen(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectBrightnessUid)
+		{
+		return new TEffectBrightness(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectSharpnessUid)
+		{
+		return new TEffectSharpness(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectRotationUid)
+		{
+		return new TEffectRotation(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectContrastUid)
+		{
+		return new TEffectContrast(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectRgbColorAdjustUid)
+		{
+		return new TEffectRgbColorAdjust(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectEmbossUid)
+		{
+		return new TEffectEmboss(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectSolarizeUid)
+		{
+		return new TEffectSolarize(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectPosterizeUid)
+		{
+		return new TEffectPosterize(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectStampUid)
+		{
+		return new TEffectStamp(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectSketchUid)
+		{
+		return new TEffectSketch(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectNoiseUid)
+		{
+		return new TEffectNoise(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectMoonlightUid)
+		{
+		return new TEffectMoonlight(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectFrostedGlassUid)
+		{
+		return new TEffectFrostedGlass(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectDespeckleUid)
+		{
+		return new TEffectDespeckle(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectBlurUid)
+		{
+		return new TEffectBlur(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectColorizationUid)
+		{
+		return new TEffectColorization(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectCartoonUid)
+		{
+		return new TEffectCartoon(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectLocalBoostUid)
+		{
+		return new TEffectLocalBoost(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectColorBoostUid)
+		{
+		return new TEffectColorBoost(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectWhiteBalanceUid)
+		{
+		return new TEffectWhiteBalance(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectAutoLevelsUid)
+		{
+		return new TEffectAutoLevels(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectLevelsUid)
+		{
+		return new TEffectLevels(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectExposureUid)
+		{
+		return new TEffectExposure(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectSpotLightUid)
+		{
+		return new TEffectSpotLight(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectCustomTransformationUid)
+		{
+		return new TEffectCustomTransformation(*aPluginEffect, *this);
+		}
+	else if(aEffect == KGeometricalOperationUid)
+		{
+		return new TGeometricalOperation(*aPluginEffect, *this);
+		}
+	else if(aEffect == KEffectBorderUid)
+		{
+		return new TEffectBorder(*aPluginEffect, *this);
+		}
+	else if (aEffect == KEffectAntiqueUid)
+		{
+		return new TEffectAntique(*aPluginEffect, *this);
+		}
+	
+	User::Leave(KErrNotSupported);
+	return NULL;
+	}
+
+TEffect* CImageProcessorImpl::EffectL(TUid aEffect)
+	{
+	__ASSERT_ALWAYS(((iState != CImgProcessor::EUninitialized) && (iState != CImgProcessor::EInitializing)), User::Leave(KErrNotReady));
+	//All effects must be supported by the plugin
+	__ASSERT_ALWAYS(IsPluginEffect(aEffect), User::Leave(KErrNotSupported));
+	
+	TEffect* effect=NULL;	
+		
+	if(IsFrameworkEffect(aEffect))
+		{
+		effect = FindEffect(aEffect);
+		if(effect == NULL)
+			{
+			effect=CreateEffectL(aEffect);
+			}		
+		}
+	else
+		{
+		Plugin::MEffect* pluginEffect = iPlugin->EffectL(aEffect);
+		effect = new TEffect(aEffect, *pluginEffect, *this);
+		
+		if (!effect || (iEffects.Append(effect) != KErrNone)) 
+			{
+			delete effect;
+			TInt err = KErrNone;
+			TRAP(err, ResetL());
+			iEffects.ResetAndDestroy();
+			iPlugin->CleanupEffects();
+			User::Leave(KErrNoMemory);
+			}
+		}
+		
+	ASSERT(effect);
+	return effect;
+	}
+
+TBool CImageProcessorImpl::CanUndoL() const
+	{
+	__ASSERT_ALWAYS(((iState == CImgProcessor::EInitialized) && (iIsInputSet)), User::Leave(KErrNotReady));
+	return iPlugin->CanUndoL();
+	}
+   
+void CImageProcessorImpl::UndoL()
+	{
+	__ASSERT_ALWAYS(((iState == CImgProcessor::EInitialized) && (iIsInputSet)), User::Leave(KErrNotReady));
+	iPlugin->UndoL();
+	}
+   
+void CImageProcessorImpl::UndoAllL()
+	{
+	__ASSERT_ALWAYS(((iState == CImgProcessor::EInitialized) && (iIsInputSet)), User::Leave(KErrNotReady));
+	iPlugin->UndoAllL();
+	}
+
+TBool CImageProcessorImpl::CanRedoL() const
+	{
+	__ASSERT_ALWAYS(((iState == CImgProcessor::EInitialized) && (iIsInputSet)), User::Leave(KErrNotReady));
+	return iPlugin->CanRedoL();
+	}
+   
+void CImageProcessorImpl::RedoL()
+	{
+	__ASSERT_ALWAYS(((iState == CImgProcessor::EInitialized) && (iIsInputSet)), User::Leave(KErrNotReady));
+	iPlugin->RedoL();
+	}
+   
+void CImageProcessorImpl::RedoAllL()
+	{
+	__ASSERT_ALWAYS(((iState == CImgProcessor::EInitialized) && (iIsInputSet)), User::Leave(KErrNotReady));
+	iPlugin->RedoAllL();
+	}
+
+TBool FindPreviewRelation(const TInt* aPreviewId, const TPreview& aPreview)
+	{
+	return (aPreview.PreviewId() == *aPreviewId);
+	}
+
+TPreview* CImageProcessorImpl::FindPreview(TInt aPreviewId) const
+	{
+	const TInt idx = iPreviews.Find<TInt>(aPreviewId, FindPreviewRelation);
+	
+	TPreview* preview = NULL;
+	if(idx != KErrNotFound)
+		{
+		preview = iPreviews[idx];
+		}
+	return preview;
+	}
+   
+TPreview* CImageProcessorImpl::PreviewL(TInt aPreviewId)
+	{
+	__ASSERT_ALWAYS(((iState != CImgProcessor::EUninitialized) && (iState != CImgProcessor::EInitializing)), User::Leave(KErrNotReady));
+
+	TPreview* preview = FindPreview(aPreviewId);
+	if (preview == NULL) 
+		{
+		Plugin::MPreview* pluginPreview = iPlugin->PreviewL(aPreviewId);
+		preview = new TPreview(*pluginPreview, *this);
+
+		if (!preview || (iPreviews.Append(preview) != KErrNone)) 
+			{
+			delete preview;
+			TInt err = KErrNone;
+			TRAP(err, ResetL());
+			User::Leave(KErrNoMemory);
+			}		
+		}
+	return preview;
+	}
+
+TOverlay* CImageProcessorImpl::OverlayL()
+	{
+	__ASSERT_ALWAYS(((iState != CImgProcessor::EUninitialized) && (iState != CImgProcessor::EInitializing)), User::Leave(KErrNotReady));
+
+	if (iOverlay == NULL) 
+		{
+		Plugin::MOverlay* pluginOverlay = iPlugin->OverlayL();
+		iOverlay = new TOverlay(*pluginOverlay, *this);
+		
+		if (!iOverlay) 
+			{
+			TInt err = KErrNone;
+			TRAP(err, ResetL());
+			User::Leave(KErrNoMemory);
+			}
+		}
+	return iOverlay;
+	}
+
+TProgressInfo* CImageProcessorImpl::ProgressInfoL()
+	{
+	__ASSERT_ALWAYS(((iState != CImgProcessor::EUninitialized) && (iState != CImgProcessor::EInitializing)), User::Leave(KErrNotReady));
+
+	if (iProgressInfo == NULL) 
+		{
+		Plugin::MProgressInfo* pluginProgressInfo = iPlugin->ProgressInfoL();
+		iProgressInfo = new TProgressInfo(*pluginProgressInfo, *this);
+		
+		if (!iProgressInfo) 
+			{
+			TInt err = KErrNone;
+			TRAP(err, ResetL());
+			User::Leave(KErrNoMemory);
+			}
+		}
+	return iProgressInfo;
+	}
+
+TInputInfo* CImageProcessorImpl::InputInfoL()
+	{
+	__ASSERT_ALWAYS(((iState != CImgProcessor::EUninitialized) && (iState != CImgProcessor::EInitializing)), User::Leave(KErrNotReady));
+	
+	if (iInputInfo == NULL) 
+		{
+		Plugin::MInputInfo* pluginInputInfo = iPlugin->InputInfoL();
+		iInputInfo = new TInputInfo(*pluginInputInfo, *this);
+
+		if (!iInputInfo) 
+			{
+			TInt err = KErrNone;
+			TRAP(err, ResetL());
+			User::Leave(KErrNoMemory);
+			}
+		}
+	return iInputInfo;
+	}
+
+TOutputInfo* CImageProcessorImpl::OutputInfoL()
+	{
+	__ASSERT_ALWAYS(((iState != CImgProcessor::EUninitialized) && (iState != CImgProcessor::EInitializing)), User::Leave(KErrNotReady));
+	
+	if (iOutputInfo == NULL) 
+		{
+		Plugin::MOutputInfo* pluginOutputInfo = iPlugin->OutputInfoL();
+		iOutputInfo = new TOutputInfo(*pluginOutputInfo, *this);
+
+		if (!iOutputInfo) 
+			{
+			TInt err = KErrNone;
+			TRAP(err, ResetL());
+			User::Leave(KErrNoMemory);
+			}
+		}
+	return iOutputInfo;
+	}
+
+void CImageProcessorImpl::SetOutputL(const TDesC& aFilename, const TUid& aFormat, const TUid& aSubFormat)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), User::Leave(KErrNotReady));
+	CheckOutputFormatL(aFormat, aSubFormat);
+	iPlugin->SetOutputL(aFilename, aFormat, aSubFormat);
+	iIsOutputSet = ETrue;
+	}
+   
+void CImageProcessorImpl::SetOutputL(RFile& aFile, const TUid& aFormat, const TUid& aSubFormat)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), User::Leave(KErrNotReady));
+	CheckOutputFormatL(aFormat, aSubFormat);
+	iPlugin->SetOutputL(aFile, aFormat, aSubFormat);
+	iIsOutputSet = ETrue;
+	}
+   
+void CImageProcessorImpl::SetOutputL(RBuf8& aBuffer, const TUid& aFormat, const TUid& aSubFormat)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), User::Leave(KErrNotReady));
+	CheckOutputFormatL(aFormat, aSubFormat);
+	iPlugin->SetOutputL(aBuffer, aFormat, aSubFormat);
+	iIsOutputSet = ETrue;
+	}
+   
+void CImageProcessorImpl::SetOutputL(CImageFrame& aPixelBuffer)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), User::Leave(KErrNotReady));
+	
+	if (aPixelBuffer.FrameSizeInPixels() == TSize(0,0)) 
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	iPlugin->SetOutputL(aPixelBuffer);
+	iIsOutputSet = ETrue;
+	}
+
+void CImageProcessorImpl::SetOutputL(CFbsBitmap& aBitmap, CFbsBitmap* aMask)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), User::Leave(KErrNotReady));
+
+	if (aBitmap.SizeInPixels() == TSize(0,0)) 
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	if((aBitmap.Handle()!=0 && aBitmap.ExtendedBitmapType()!=KNullUid) || (aMask!=NULL && aMask->Handle()!=0 && aMask->ExtendedBitmapType()!=KNullUid))
+        {
+        User::Leave(KErrNotSupported);
+        }
+	
+	if ((aMask != NULL) && (aMask->SizeInPixels() == TSize(0,0))) 
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	iPlugin->SetOutputL(aBitmap, aMask);
+	iIsOutputSet = ETrue;
+	}
+
+void CImageProcessorImpl::PostEvent(TInt aEventId, TUid aUid, TInt aId, TInt aError)
+	{
+	if (aEventId == CImgProcessor::EEventProcessingComplete && aError == KErrNone) 
+		{
+		if (iDrmInput != NULL) 
+			{
+			TRAPD(drmErr, iDrmInput->ExecuteIntentL());
+			if (drmErr != KErrNone) 
+				{
+				iPlugin->CleanupOutput();//should delete/cleanup unauthorised output
+				iCallbackHandler->AddCallback(aEventId, aUid, aId, drmErr);
+				return;
+				}
+			}
+		
+		for (TInt i=0; i < iOverlayDrmInputs.Count(); i++ )
+			{ 
+			TRAPD(overlayDrmErr, iOverlayDrmInputs[i]->ExecuteIntentL());
+			if (overlayDrmErr != KErrNone) 
+				{
+				iPlugin->CleanupOutput();//should delete/cleanup unauthorised output
+				iCallbackHandler->AddCallback(aEventId, aUid, aId, overlayDrmErr);
+				return;
+				}
+			}
+		}
+	
+	TRAPD(err, ProcessEventL(aEventId, aUid, aId, aError));
+
+	if (err != KErrNone) 
+		{
+		//strayed event?
+		if (aError == KErrNone) 
+			{
+			aError = err;
+			}
+		}
+	
+	iCallbackHandler->AddCallback(aEventId, aUid, aId, aError);
+	}
+
+void CImageProcessorImpl::ProcessEventL(TInt aEventId, TUid /*aUid*/, TInt aId, TInt aError)
+	{
+	switch (aEventId) 
+		{
+		case CImgProcessor::EEventInitializingComplete:
+			SetStateL((aError == KErrNone)? CImgProcessor::EInitialized: CImgProcessor::EUninitialized);
+			break;
+		
+		case CImgProcessor::EEventProcessingComplete:
+			RestoreStateL();
+			break;
+		
+		case CImgProcessor::EEventPreviewInitializingComplete:
+			PreviewL(aId)->SetStateL((aError == KErrNone)? TPreview::EInitialized: TPreview::EUninitialized);
+			RestoreStateL();
+			break;
+
+		case CImgProcessor::EEventPreviewRenderingComplete:
+			PreviewL(aId)->SetStateL(TPreview::EInitialized);
+			RestoreStateL();
+			break;
+		}
+	}
+
+TAny* CImageProcessorImpl::Extension(TUid aExtension)
+	{
+	__ASSERT_ALWAYS((iState == CImgProcessor::EInitialized), Panic(EPanicNotInitialized));
+	return iPlugin->Extension(aExtension);
+	}
+
+TBool CImageProcessorImpl::IsBusy(CImgProcessor::TState aState) const 
+	{
+	return (aState == CImgProcessor::EInitializing || 
+		aState == CImgProcessor::EProcessing || 
+		aState == CImgProcessor::EPreviewInitializing || 
+		aState == CImgProcessor::EPreviewRendering);
+	}
+
+void CImageProcessorImpl::SetStateL(CImgProcessor::TState aState)
+	{
+	if(iState != aState)
+		{
+		if (!iValidStates[iState][aState]) 
+			{
+			User::Leave(KErrNotReady);
+			}
+		
+		if (IsBusy(aState))
+			{
+			iPreviousState = iState;
+			}
+
+		iState = aState;
+		}
+	}
+
+void CImageProcessorImpl::RestoreStateL()
+	{
+	SetStateL(iPreviousState);
+	}
+
+void CImageProcessorImpl::ConvertMimeTypeToUidL(const TDesC8& aMimeType, TUid& aFormat, TUid& aSubFormat)
+	{
+	for (TInt i = 0; i < iTypesUtilityArray.Count(); i++)
+		{
+		CFileExtensionMIMEType& fileExtAndMIMEType = *iTypesUtilityArray[i];
+				
+		if ( (fileExtAndMIMEType.MIMEType().Length() > 0)
+		     && (aMimeType.Find(fileExtAndMIMEType.MIMEType()) != KErrNotFound) ) 
+			{
+			aFormat = fileExtAndMIMEType.ImageType(); 
+			aSubFormat = fileExtAndMIMEType.ImageSubType();
+			return;
+			}
+		}
+	User::Leave(KErrNotFound);
+	}
+
+void CImageProcessorImpl::ConvertFileExtensionToUidL(const TDesC& aFileExtension, TUid& aFormat, TUid& aSubFormat)
+	{
+	for (TInt i = 0; i < iTypesUtilityArray.Count(); i++)
+		{
+		CFileExtensionMIMEType& fileExtAndMIMEType = *iTypesUtilityArray[i];
+		
+		if ( (fileExtAndMIMEType.FileExtension().Length() > 0 ) 
+		     && (aFileExtension.Find(fileExtAndMIMEType.FileExtension()) != KErrNotFound) ) 
+			{
+			aFormat = fileExtAndMIMEType.ImageType(); 
+			aSubFormat = fileExtAndMIMEType.ImageSubType();
+			return;
+			}
+		}
+	User::Leave(KErrNotFound);
+	}
+
+void CImageProcessorImpl::ConvertUidToMimeTypeL(TDes8& aMimeType, const TUid& aFormat, const TUid& /*aSubFormat*/)
+	{
+	for (TInt i = 0; i < iTypesUtilityArray.Count(); i++)
+		{
+		CFileExtensionMIMEType& fileExtAndMIMEType = *iTypesUtilityArray[i];
+		
+		if (fileExtAndMIMEType.ImageType() == aFormat) 
+			{
+			aMimeType = fileExtAndMIMEType.MIMEType();
+			return;
+			}
+		}
+	User::Leave(KErrNotFound);
+	}
+
+void CImageProcessorImpl::ConvertUidToFileExtensionL(TDes& aFileExtension, const TUid& aFormat, const TUid& /*aSubFormat*/)
+	{
+	for (TInt i = 0; i < iTypesUtilityArray.Count(); i++)
+		{
+		CFileExtensionMIMEType& fileExtAndMIMEType = *iTypesUtilityArray[i];
+		
+		if (fileExtAndMIMEType.ImageType() == aFormat) 
+			{
+			aFileExtension = fileExtAndMIMEType.FileExtension();
+			return;
+			}
+		}
+	User::Leave(KErrNotFound);
+	}
+
+void CImageProcessorImpl::AppendOverlayDrmInputL() 
+	{
+	if (iOverlayDrmInput != NULL) 
+		{
+		iOverlayDrmInputs.AppendL(iOverlayDrmInput);
+		iOverlayDrmInput = NULL;
+		}
+	}
+
+CImageProcessorDrmInput* CImageProcessorDrmInput::NewL(TMMSource& aDrmFile)
+	{
+	CImageProcessorDrmInput* self = new (ELeave) CImageProcessorDrmInput();
+	CleanupStack::PushL(self);
+	self->ConstructL(aDrmFile);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+void CImageProcessorDrmInput::ConstructL(TMMSource& aDrmFile)
+	{
+		{
+		using namespace ContentAccess;
+		
+		TUid sourceType = aDrmFile.SourceType();
+		const TDesC& uniqueId = aDrmFile.UniqueId();
+		TIntent intent = aDrmFile.Intent();
+		CContent* content = NULL;
+		
+		if (sourceType == KUidMMFileHandleSource)
+			{
+			const TMMFileHandleSource& source = static_cast<const TMMFileHandleSource&>(aDrmFile);
+			content = CContent::NewL(source.Handle());
+			}
+		else if (sourceType == KUidMMFileSource) 
+			{
+			const TMMFileSource& fileSource = static_cast<const TMMFileSource&>(aDrmFile);
+		
+			TRAPD(err, content = CContent::NewL(fileSource.Name(), EContentShareReadOnly));
+        
+			if(err != KErrNone && err != KErrNoMemory) //We retry in case the client already has the file open.
+				{
+				content = CContent::NewL(fileSource.Name(), EContentShareReadWrite);
+				}
+			}
+		else 
+			{
+			// unknown source type
+			User::Leave(KErrNotSupported);
+			}
+        
+		CleanupStack::PushL(content);
+
+		CData* data = content->OpenContentL(intent, uniqueId);
+		CleanupStack::PushL(data);
+
+		User::LeaveIfError(data->EvaluateIntent(intent));
+	
+		TInt size = 0;
+		data->DataSizeL(size);
+		HBufC8 *readBuffer = HBufC8::NewMaxL(size);
+		CleanupStack::PushL(readBuffer);
+	
+		TPtr8 ptr(readBuffer->Des());
+		TInt pos = 0;
+		User::LeaveIfError(data->Seek(ESeekStart, pos));
+		User::LeaveIfError(data->Read(ptr, size));
+
+		CleanupStack::Pop(3);
+
+		iDecryptedBuffer = readBuffer;
+		iContent = content;
+		iData = data;
+		iIntent = intent;
+		}
+	}
+
+void CImageProcessorDrmInput::ExecuteIntentL()
+	{
+	User::LeaveIfError(iData->ExecuteIntent(iIntent));
+	}
+
+CImageProcessorDrmInput::~CImageProcessorDrmInput() 
+	{
+	delete iDecryptedBuffer;
+	delete iContent;
+	delete iData;
+	}
+
+//EOF