imaging/imaginginttest/src/TestStepConversion.cpp
changeset 0 5752a19fdefe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imaging/imaginginttest/src/TestStepConversion.cpp	Wed Aug 25 12:29:52 2010 +0300
@@ -0,0 +1,2315 @@
+// Copyright (c) 2004-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:
+// TS_MM_ICL_FRM_CP.cpp
+// This file contains the test steps ICL testing
+// 
+//
+
+// EPOC includes
+#include <e32base.h>
+#include <caf/caf.h>
+
+// Test system includes
+#include <testframework.h>
+
+// Specific includes for this test suite
+#include "TestSuite_TSI_ICL_FRM_00.h"
+
+// Specific includes for these test steps
+#include "TestStepConversion.h"
+
+#include "ICLFbsSessionTest.h"
+// use classes in the CAF namespace directly
+using namespace ContentAccess;
+
+const TUid KImageTypeTestUid = {0x101f7bf7};
+const TUid KImageSubTypeTestUid = {0x101f7bf8};
+
+
+const TInt	KDefaultQualityFactor = 50;		//JPEG
+const TInt	KDefaultSampling		= 3;	//JPEG
+
+/* 
+ *
+ * Open and decoder image from file, then compare
+ * with reference bitmap
+ *
+ * @param		"const TDesC& aFilename"
+ *				destination file
+ *				
+ * @return		"TInt"
+ *				Error	
+ */
+TInt	CTestStepConversion::OpenImageForDecodeFromFileL(const TDesC& aFilename, 
+														 TUid aCodecUid)
+	{
+
+	TInt theRes = KErrNone; 
+
+	TFileName theSourceFilename;
+	Directory(EInput, theSourceFilename);
+	theSourceFilename.Append(aFilename);
+
+	User::LeaveIfError(iFs.Connect());
+
+	INFO_PRINTF2(_L("Openning the file : %S"), &theSourceFilename);
+	
+	CImageDecoder *theImageDecoder = NULL;
+	if(aCodecUid.iUid == 0)
+		{
+		TRAP(theRes, theImageDecoder=CImageDecoder::FileNewL(iFs, theSourceFilename));
+		}
+	else
+		{
+		TRAP(theRes, theImageDecoder=CImageDecoder::FileNewL(iFs, theSourceFilename, CImageDecoder::EOptionNone, aCodecUid));
+		}
+	if(theRes != KErrNone)
+		{
+		iFs.Close();
+		INFO_PRINTF2(_L("Cannot open file %S"), &theSourceFilename);
+		return theRes;
+		}
+	
+	if(theImageDecoder == NULL)
+			return KErrUnknown;
+	
+	CleanupStack::PushL(theImageDecoder);
+	INFO_PRINTF2(_L("The file : %S had been opened"), &theSourceFilename);
+
+		//[ Create an active Listener and push it on the cleanup stack]
+	CActiveListener* activeListener = new(ELeave)CActiveListener;
+	CleanupStack::PushL( activeListener );
+
+	CFbsBitmap* theDestination = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(theDestination);
+		
+	const TFrameInfo*	theFrameInfo = &theImageDecoder -> FrameInfo();
+
+	// >>>>>>>>>  WMF ONLY  <<<<<<<<<<<<<<<<
+	// Instead of using the Frame info width and height (in pixels) we use fixed values
+	// that we know are the correct values for the reference raster bitmap
+	// which is used for comparison.
+	// This is because the WMF is a vector image and its exact pixel size depends
+	// on the screen device characteristics, i.e. the Twips to Pixel ratio.
+	// In other words, different Dots Per Inch (DPI) screens will produce different
+	// pixel size image from the same WMF file.
+
+	// known target bitmap size in pixels. Size of the reference bitmap used for comparison.
+	// this is the pixel frame size in wins platform, and it's different to the arm4 equivalent.
+	// if iImageTypeUid == KImageTypeWMFUid and the particular test
+	if (iTestStepName.Compare(_L("MM-ICL-FRM-I-0009-CP")) == 0)
+		{
+		TSize fixedPixelSize(465, 454);
+
+		User::LeaveIfError(theDestination->Create(fixedPixelSize,
+							theFrameInfo->iFrameDisplayMode ));//EColor256));//
+		}
+	else
+		{
+		User::LeaveIfError(theDestination->Create(theFrameInfo->iOverallSizeInPixels,
+							theFrameInfo->iFrameDisplayMode ));//EColor256));//
+		}
+		
+	activeListener ->InitialiseActiveListener();
+		
+	theImageDecoder->Convert(& activeListener -> iStatus, *theDestination, 0);
+	CActiveScheduler::Start();
+
+	theRes = activeListener -> iStatus.Int();
+	
+	if(theRes == KErrNone)
+		INFO_PRINTF2(_L("Conversion of file %S was successfull"), &theSourceFilename);
+	else
+		INFO_PRINTF2(_L("Fail during conversion the file : %S"), &theSourceFilename);
+
+	TFileName				theReferenceFilename;
+	TBuf<KLenBufferExtension>		theExtension;
+
+	Directory(EReference, theReferenceFilename);
+	TInt theSeparatorPos = aFilename.LocateReverse('.') + 1;
+	theReferenceFilename.Append(aFilename.Left(theSeparatorPos));
+	GetImageExtension(KImageTypeMBMUid, theExtension);
+	theReferenceFilename.Append(theExtension);
+	if(theRes == KErrNone)
+		theRes = CheckBitmapL(*theDestination, theReferenceFilename);
+	
+	iFs.Close();
+	
+	theDestination->Reset();	  
+	CleanupStack::PopAndDestroy(3,theImageDecoder);  // theDestination,CActiveListener, CImageDecoder
+		
+	return theRes;
+	}
+	
+/* 
+ *
+ * Open and decode image from file
+ *
+ * @param		"const TDesC& aFilename"
+ *				destination file
+ *				
+ * @return		"TInt"
+ *				Error	
+ */
+TInt	CTestStepConversion::OpenPpmImageForDecodeFromFileL(const TDesC& aFilename, 
+														 TUid aCodecUid,
+														 const TUid aPpmDecodeUid)
+	{
+	TInt theRes = KErrNone; 
+
+	TFileName theSourceFilename;
+	Directory(EInput, theSourceFilename);
+	theSourceFilename.Append(aFilename);
+
+	User::LeaveIfError(iFs.Connect());
+
+	INFO_PRINTF2(_L("Openning the file : %S"), &theSourceFilename);
+	
+	CImageDecoder *theImageDecoder = NULL;
+	if((aCodecUid.iUid == 0)&&(aPpmDecodeUid.iUid == 0))
+		{
+		TRAP(theRes, theImageDecoder=CImageDecoder::FileNewL(iFs, theSourceFilename));
+		}
+	else
+		{
+		TRAP(theRes, theImageDecoder=CImageDecoder::FileNewL(iFs, theSourceFilename, CImageDecoder::EOptionNone, aCodecUid, KNullUid, aPpmDecodeUid));
+		}
+	if(theRes != KErrNone)
+		{
+		iFs.Close();
+		INFO_PRINTF2(_L("Cannot open file %S"), &theSourceFilename);
+		return theRes;
+		}
+	
+	if(theImageDecoder == NULL)
+			return KErrUnknown;
+	
+	CleanupStack::PushL(theImageDecoder);
+	INFO_PRINTF2(_L("The file : %S had been opened"), &theSourceFilename);
+
+		//[ Create an active Listener and push it on the cleanup stack]
+	CActiveListener* activeListener = new(ELeave)CActiveListener;
+	CleanupStack::PushL( activeListener );
+
+	CFbsBitmap* theDestination = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(theDestination);
+		
+	const TFrameInfo*	theFrameInfo = &theImageDecoder -> FrameInfo();
+	User::LeaveIfError(theDestination->Create(theFrameInfo->iOverallSizeInPixels,
+							theFrameInfo->iFrameDisplayMode ));//EColor256));//
+		
+	activeListener ->InitialiseActiveListener();
+		
+	theImageDecoder->Convert(& activeListener -> iStatus, *theDestination, 0);
+	CActiveScheduler::Start();
+
+	theRes = activeListener -> iStatus.Int();
+	
+	if(theRes == KErrNone)
+		{
+		INFO_PRINTF2(_L("Conversion of file %S was successfull"), &theSourceFilename);
+		}
+	else
+		{
+		INFO_PRINTF2(_L("Fail during conversion the file : %S"), &theSourceFilename);
+		}
+
+	iFs.Close();
+	
+	theDestination->Reset();	  
+	CleanupStack::PopAndDestroy(3,theImageDecoder);  // theDestination,CActiveListener, CImageDecoder
+		
+	return theRes;
+	}
+
+void CTestStepConversion::OpenImageForDecodeFromFileWithIntentL(const TDesC& aFilename, 
+																	TIntent aIntent, 
+																	const TDesC8& aMimeType)
+	{
+
+	TInt err = KErrNone; 
+
+	TFileName theSourceFilename;
+	Directory(EInput, theSourceFilename);
+	theSourceFilename.Append(aFilename);
+
+	User::LeaveIfError(iFs.Connect());
+
+	INFO_PRINTF2(_L("Openning the file : %S"), &theSourceFilename);
+
+	CImageDecoder *theImageDecoder = NULL;
+
+	if(aMimeType != KNullDesC8)
+		{
+		TRAP(err, theImageDecoder=CImageDecoder::FileNewL(iFs, theSourceFilename, aMimeType, aIntent));
+		}
+	else
+		{
+		TRAP(err, theImageDecoder=CImageDecoder::FileNewL(iFs, theSourceFilename, aIntent));
+		}
+	if(err != KErrNone)
+		{
+		iFs.Close();
+		INFO_PRINTF2(_L("Cannot open file %S"), &theSourceFilename);
+		User::Leave(err);
+		}
+	
+	if(theImageDecoder == NULL)
+		User::Leave(KErrUnknown);
+	CleanupStack::PushL(theImageDecoder);
+	INFO_PRINTF2(_L("The file : %S had been opened"), &theSourceFilename);
+
+		//[ Create an active Listener and push it on the cleanup stack]
+	CActiveListener* activeListener = new(ELeave)CActiveListener;
+	CleanupStack::PushL( activeListener );
+
+	CFbsBitmap* theDestination = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(theDestination);
+		
+	const TFrameInfo*	theFrameInfo = &theImageDecoder -> FrameInfo();
+	
+	User::LeaveIfError(theDestination->Create(theFrameInfo->iOverallSizeInPixels,
+						theFrameInfo->iFrameDisplayMode ));
+		
+	activeListener ->InitialiseActiveListener();
+		
+	theImageDecoder->Convert(& activeListener -> iStatus, *theDestination, 0);
+	CActiveScheduler::Start();
+
+	err = activeListener -> iStatus.Int();
+	
+	if(err == KErrNone)
+		INFO_PRINTF2(_L("Conversion of file %S was successfull"), &theSourceFilename);
+	else
+		INFO_PRINTF2(_L("Fail during conversion the file : %S"), &theSourceFilename);
+
+	TFileName theReferenceFilename;
+	TBuf<KLenBufferExtension> theExtension;
+
+	Directory(EReference, theReferenceFilename);
+	TInt theSeparatorPos = aFilename.LocateReverse('.') + 1;
+	theReferenceFilename.Append(aFilename.Left(theSeparatorPos));
+	GetImageExtension(KImageTypeMBMUid, theExtension);
+	theReferenceFilename.Append(theExtension);
+
+	if(err == KErrNone)
+		err = CheckBitmapL(*theDestination, theReferenceFilename);
+
+	iFs.Close();
+	theDestination->Reset();
+	  
+	CleanupStack::PopAndDestroy(3,theImageDecoder);  // theDestination,CActiveListener, CImageDecoder
+
+	User::LeaveIfError(err);
+		
+	}
+
+void CTestStepConversion::OpenImageForDecodeFromFileWithIntentL(const TDesC& aFilename, 
+																	TIntent aIntent, 
+																TUid aImageTypeUid,
+																TUid aDecoderUid)
+	{
+
+	TInt err = KErrNone; 
+
+	TFileName theSourceFilename;
+	Directory(EInput, theSourceFilename);
+	theSourceFilename.Append(aFilename);
+
+	User::LeaveIfError(iFs.Connect());
+
+	INFO_PRINTF2(_L("Openning the file : %S"), &theSourceFilename);
+
+	CImageDecoder *theImageDecoder = NULL;
+	
+	TRAP(err, theImageDecoder=CImageDecoder::FileNewL(iFs, theSourceFilename, aIntent, CImageDecoder::EOptionNone, aImageTypeUid, KNullUid, aDecoderUid));
+
+	if(err != KErrNone)
+		{
+		iFs.Close();
+		INFO_PRINTF2(_L("Cannot open file %S"), &theSourceFilename);
+		User::Leave(err);
+		}
+	
+	if(theImageDecoder == NULL)
+		User::Leave(KErrUnknown);
+	
+	CleanupStack::PushL(theImageDecoder);
+	INFO_PRINTF2(_L("The file : %S had been opened"), &theSourceFilename);
+
+		//[ Create an active Listener and push it on the cleanup stack]
+	CActiveListener* activeListener = new(ELeave)CActiveListener;
+	CleanupStack::PushL( activeListener );
+
+	CFbsBitmap* theDestination = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(theDestination);
+		
+	const TFrameInfo*	theFrameInfo = &theImageDecoder -> FrameInfo();
+	User::LeaveIfError(theDestination->Create(theFrameInfo->iOverallSizeInPixels,
+						theFrameInfo->iFrameDisplayMode ));
+		
+	activeListener ->InitialiseActiveListener();
+		
+	theImageDecoder->Convert(& activeListener -> iStatus, *theDestination, 0);
+	CActiveScheduler::Start();
+
+	err = activeListener -> iStatus.Int();
+	
+	if(err == KErrNone)
+		INFO_PRINTF2(_L("Conversion of file %S was successfull"), &theSourceFilename);
+	else
+		INFO_PRINTF2(_L("Fail during conversion the file : %S"), &theSourceFilename);
+
+	TFileName theReferenceFilename;
+	TBuf<KLenBufferExtension> theExtension;
+
+	Directory(EReference, theReferenceFilename);
+	TInt theSeparatorPos = aFilename.LocateReverse('.') + 1;
+	theReferenceFilename.Append(aFilename.Left(theSeparatorPos));
+	GetImageExtension(KImageTypeMBMUid, theExtension);
+	theReferenceFilename.Append(theExtension);
+
+	if(err == KErrNone)
+		err = CheckBitmapL(*theDestination, theReferenceFilename);
+
+	iFs.Close();
+	theDestination->Reset();
+		  //Active Listiner
+	CleanupStack::PopAndDestroy(3,theImageDecoder);  // theDestination,CActiveListener, CImageDecoder
+
+	User::LeaveIfError(err);
+		
+	}
+
+
+/* 
+ *
+ * get size of step to increment
+ *
+ * @param		"TInt aValue"
+ *				wanted buffer size
+ *				
+ * @return		"TInt"
+ *				step	
+ */
+inline TInt CTestStepConversion::StreamIncrement(TInt aValue)
+	{
+	return (aValue<KStreamBreakpoint)?KStreamInitialIncrement:KStreamSecondaryIncrement;
+
+	}
+
+/* 
+ *
+ * Read and decode an image incrementally then compare with reference
+ *
+ * @param		"const TDesC& aFileName"
+ *				"TInt aStepBeforeCancel"
+ *				request cancel of load/decode from the client app before completion
+ *				(only if aStepBeforeCancel > 0 )
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt CTestStepConversion::ReadAndDecodeIncrementallyL(const TDesC& aFileName, TInt aStepBeforeCancel)
+	{
+	TInt aFrameNo = 0;
+	TInt	theRes;
+	
+	User::LeaveIfError(iFs.Connect());
+
+	TFileName		sourceFileName;
+	Directory(EInput, sourceFileName);
+	sourceFileName.Append(aFileName);
+
+	theRes = iFile.Open(iFs, sourceFileName, EFileShareReadersOnly|EFileStream|EFileRead);
+	
+	if(theRes != KErrNone)
+		{
+		iFs.Close();
+		INFO_PRINTF2(_L("Cannot open file : %S"), &sourceFileName);
+
+		return theRes;
+		}
+	else
+		{
+		INFO_PRINTF2(_L("File %S was opened successfully"), &sourceFileName);
+		}
+	
+	CleanupClosePushL(iFile);
+	TInt fileSize = 0;
+	User::LeaveIfError(iFile.Size(fileSize));
+
+	TPtr8 buffer(STATIC_CAST(TUint8*, User::AllocLC(1024)), 0, 1024);
+
+	RFile destFile;
+
+	TFileName		destFileName;
+	Directory(EOutput, destFileName);
+	destFileName.Append(aFileName);
+	TInt  destFileLength = 0;
+
+	theRes = destFile.Create(iFs, destFileName, EFileShareAny|EFileStream|EFileWrite);
+	//theRes = destFile.Create(iFs, destFileName, EFileShareAny);
+	if(theRes == KErrAlreadyExists)
+		User::LeaveIfError(theRes = destFile.Replace(iFs, destFileName, EFileShareAny|EFileStream|EFileWrite));
+	else if(theRes)
+		{
+		INFO_PRINTF2(_L("Cannot create destination file %S"), &destFileName);
+		User::LeaveIfError(theRes);
+		}
+	
+	CleanupClosePushL(destFile);
+
+	INFO_PRINTF2(_L("Destination file %S was created successfully"), &destFileName);
+
+	TInt wantedBufferSize=1;
+
+	User::LeaveIfError(iFile.Read(buffer, wantedBufferSize));
+	ASSERT(buffer.Length()==wantedBufferSize); // should always work on emulator
+	User::LeaveIfError(destFile.Write(buffer));
+	destFileLength += wantedBufferSize;
+	CImageDecoder *theImageDecoder = NULL;
+	// gradually increment buffer size until we can open the decoder
+	for (;;)
+		{
+		TRAPD(error, theImageDecoder = CImageDecoder::FileNewL(iFs, destFileName, 
+								CImageDecoder::EOptionNone));//, 
+		if (error==KErrNone)
+			break;
+		if (error!=KErrUnderflow || wantedBufferSize>=fileSize)
+			{
+			INFO_PRINTF2(_L("Cannot create image decoder for file %S"), &destFileName);
+			
+			if(KErrAccessDenied == error)
+				INFO_PRINTF1(_L("Access denied"));
+
+			User::Leave(error);
+			}
+		TInt increment = StreamIncrement(wantedBufferSize); 
+		wantedBufferSize = Min(fileSize, wantedBufferSize+increment);
+		TInt extra = wantedBufferSize - destFileLength;
+		ASSERT(extra>0);
+		User::LeaveIfError(iFile.Read(buffer, extra));
+		ASSERT(buffer.Length()==extra); // should always work on emulator
+		User::LeaveIfError(destFile.Write(buffer));
+		destFileLength += extra;
+		}
+	CleanupStack::PushL(theImageDecoder);
+
+	// gradually increment buffer size until we get info about the given frame
+	
+	while (theImageDecoder->IsImageHeaderProcessingComplete() == (TBool)EFalse && 
+		wantedBufferSize<fileSize)
+		{
+		TInt increment = StreamIncrement(wantedBufferSize); 
+		wantedBufferSize = Min(fileSize, wantedBufferSize+increment);
+		TInt extra = wantedBufferSize - destFileLength;
+		ASSERT(extra>0);
+		User::LeaveIfError(iFile.Read(buffer, extra));
+		ASSERT(buffer.Length()==extra); // should always work on emulator
+		User::LeaveIfError(destFile.Write(buffer));
+		destFileLength += extra;
+
+		theImageDecoder->ContinueProcessingHeaderL();
+		}
+
+	// resize the bitmap - since we now know the size
+	TFrameInfo frameInfo(theImageDecoder->FrameInfo());
+	TSize frameSize(frameInfo.iFrameCoordsInPixels.Width(),
+			frameInfo.iFrameCoordsInPixels.Height());
+	
+	CFbsBitmap*	theBitmap = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL( theBitmap );
+	User::LeaveIfError(theBitmap->Create(frameSize, frameInfo.iFrameDisplayMode)); 
+
+	// the conversion itself
+	TBool first = ETrue;
+	CActiveListener* activeListener = new(ELeave)CActiveListener;
+	CleanupStack::PushL( activeListener );
+	if(aStepBeforeCancel > 0)
+		iActiveScheduler->SetDecoder(theImageDecoder, activeListener, aStepBeforeCancel);
+	for(;;)
+		{
+		activeListener->InitialiseActiveListener();
+		if (first)
+			theImageDecoder->Convert(&activeListener->iStatus,*theBitmap,aFrameNo);
+		else
+			theImageDecoder->ContinueConvert(&activeListener->iStatus);
+
+		first = EFalse;
+
+		CActiveScheduler::Start();
+		TInt error = activeListener->iStatus.Int();
+		if (error==KErrNone)
+			break;
+		
+		if(error == KErrCancel)
+			{
+			//The incremental load was canceled at the client before completion
+			theRes = KErrCancel;
+			break;
+			}
+		if (error!=KErrUnderflow || wantedBufferSize>=fileSize)
+			User::Leave(error);
+		TInt increment = StreamIncrement(wantedBufferSize); 
+		wantedBufferSize = Min(fileSize, wantedBufferSize+increment);
+		TInt extra = wantedBufferSize - destFileLength;
+		
+		ASSERT(extra>0);
+		
+		if(iFile.SubSessionHandle())
+			User::LeaveIfError(iFile.Read(buffer, extra));
+		
+		ASSERT(buffer.Length()==extra); // should always work on emulator
+		
+		if(destFile.SubSessionHandle())
+			{
+			User::LeaveIfError(destFile.Write(buffer));
+			destFileLength += extra;
+			}
+		}
+	
+	TFileName	refFileName;
+	TBuf<KLenBufferExtension>		imageExtension;
+	Directory(EReference, refFileName);
+	refFileName.Append(aFileName.Left(aFileName.Length()-3));
+	GetImageExtension(KImageTypeMBMUid, imageExtension);
+	refFileName.Append(imageExtension);
+	
+	if(theRes == KErrNone && aStepBeforeCancel == 0)
+		theRes = CheckBitmapL(*theBitmap, refFileName);
+	
+	theBitmap->Reset();
+	CleanupStack::PopAndDestroy(6); // theImageDecoder, destFile, buffer, file, theBitmap, activeListener
+
+	iFs.Close();
+	
+	return theRes;
+	}
+
+
+/* 
+ *
+ * Read and decode image from buffer
+ *
+ * @param		"const TDesC& aFileName"
+ *				"TUid aUid"
+ *				using for negative test
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::OpenImageForDecodeFromBufferL(const TDesC& aFilename, TUid aUid)
+	{
+
+	TInt theRes = KErrNone;
+
+	TFileName theSourceFilename;
+	Directory(EInput, theSourceFilename);
+	theSourceFilename.Append(aFilename);
+
+	User::LeaveIfError(iFs.Connect());
+	
+	TInt fileSize = 0;
+
+	theRes = iFile.Open(iFs, theSourceFilename, EFileRead);
+
+	if(theRes == KErrNone)
+		iFile.Size(fileSize);
+	// if aFilename.Length() == 0 - we try negative test "Request data where no frame is loaded
+	else if(aFilename.Length() != 0)
+		{
+		INFO_PRINTF2(_L("Cannot open source file %S"), &theSourceFilename);
+		return theRes;
+		}
+
+	HBufC8 *theImageFromFile = HBufC8::NewMaxLC(fileSize);
+	
+	TPtr8 imageFromFilePtr = theImageFromFile->Des();
+	if(iFile.SubSessionHandle())
+		iFile.Read(imageFromFilePtr);
+	iFile.Close();
+	
+	CImageDecoder* theImageDecoder = NULL;
+	
+	if(aUid.iUid == 0)
+		{
+		TRAP(theRes, theImageDecoder = CImageDecoder::DataNewL(iFs, imageFromFilePtr));
+		}
+	else
+		{//for negative testing
+		TRAP(theRes, theImageDecoder = CImageDecoder::DataNewL(iFs, imageFromFilePtr, CImageDecoder::EOptionNone, KImageTypeWMFUid));
+		}
+	
+	iFs.Close();
+	
+	if(theRes != KErrNone)
+		{
+		CleanupStack::PopAndDestroy(theImageFromFile);
+		
+		INFO_PRINTF1(_L("Cannot create image decoder from file's pointer"));
+		return theRes;
+		}
+		
+	if(theImageDecoder == NULL)
+		{
+		CleanupStack::PopAndDestroy(theImageFromFile);
+		return KErrUnknown;
+		}
+		
+	CleanupStack::PushL(theImageDecoder);	
+
+	CFbsBitmap* theDestination = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(theDestination);
+		
+	const TFrameInfo*	theFrameInfo = &theImageDecoder-> FrameInfo();
+	User::LeaveIfError(theDestination->Create(theFrameInfo->iOverallSizeInPixels, 
+							theFrameInfo->iFrameDisplayMode ));
+		// Create an active Listener and push it on the cleanup stack
+	CActiveListener* activeListener = new(ELeave)CActiveListener;
+	CleanupStack::PushL( activeListener );
+	activeListener->InitialiseActiveListener();
+
+	theImageDecoder->Convert(& activeListener -> iStatus, *theDestination);
+	CActiveScheduler::Start();
+	theRes = activeListener -> iStatus.Int();
+	if(theRes == KErrNone)
+		{
+		INFO_PRINTF2(_L("File %S was converted successfully"), &theSourceFilename);
+		}
+	else
+		{
+		INFO_PRINTF2(_L("Fail during conversion file %S"), &theSourceFilename);
+		}
+
+	TFileName				theReferenceFilename;
+	TBuf<KLenBufferExtension>		theExtension;
+
+	Directory(EReference, theReferenceFilename);
+	theReferenceFilename.Append(aFilename.Left(aFilename.Length()-3));
+	GetImageExtension(KImageTypeMBMUid, theExtension);
+	theReferenceFilename.Append(theExtension);
+
+	if(theRes == KErrNone)
+		theRes = CheckBitmapL(*theDestination, theReferenceFilename);
+				
+	theDestination->Reset();	  
+	CleanupStack::PopAndDestroy(4,theImageFromFile); // CActiveListener, theDestination, theImageDecoder, theImageFromFile
+	return theRes;
+	}
+
+/* 
+	Read and decode a given frame from an image buffer with a specific codec (Uid) and decode options
+	@param const TDesC&	aFileName	The file to be read into a data buffer (for use in CImageDecoder::DataNewL())
+	@param TInt	aFrameNumber		The frame to be decoded (0 is the first frame).
+	@param TUid	aUid				The Uid of the codec to be used for the decode.
+	@param CImageDecoder::TOptions aOptions	Any decoder options (EOptionNone is the default).
+ */
+void CTestStepConversion::OpenBufferedImageL(const TDesC& aFilename, TInt aFrameNumber, TUid aUid, const CImageDecoder::TOptions aOptions)
+	{
+	TInt err = KErrNone;
+
+	TFileName theSourceFilename;
+	Directory(EInput, theSourceFilename);
+	theSourceFilename.Append(aFilename);
+
+	User::LeaveIfError(iFs.Connect());
+	
+	TInt fileSize = 0;
+
+	err = iFile.Open(iFs, theSourceFilename, EFileRead);
+
+	if(err == KErrNone)
+		{
+		iFile.Size(fileSize);
+		}
+	else
+		{
+		INFO_PRINTF2(_L("Cannot open source file %S"), &theSourceFilename);
+		User::Leave(err);
+		}
+
+	HBufC8* theImageFromFile = HBufC8::NewMaxLC(fileSize);
+		
+	TPtr8 imageFromFilePtr = theImageFromFile->Des();
+	if(iFile.SubSessionHandle())
+		{
+		iFile.Read(imageFromFilePtr);
+		}
+	iFile.Close();
+	
+	CImageDecoder* theImageDecoder = NULL;
+	
+	TRAP(err, theImageDecoder = CImageDecoder::DataNewL(iFs, imageFromFilePtr, aOptions, KNullUid, KNullUid, aUid));
+	
+	iFs.Close();
+	
+	if(err != KErrNone)
+		{
+		INFO_PRINTF1(_L("Cannot create image decoder from file's pointer"));
+		User::Leave(err);
+		}
+	
+	CleanupStack::PushL(theImageDecoder);
+	
+	if(aFrameNumber >= theImageDecoder->FrameCount())
+		{
+		INFO_PRINTF1(_L("Requested to decode unavailable image frame."));
+		User::Leave(KErrArgument);
+		}
+
+	CFbsBitmap* theDestination = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(theDestination);
+
+	const TFrameInfo* theFrameInfo = &theImageDecoder->FrameInfo(aFrameNumber);
+	User::LeaveIfError(theDestination->Create(theFrameInfo->iOverallSizeInPixels,
+						theFrameInfo->iFrameDisplayMode));
+	
+	// Create an active Listener and push it on the cleanup stack
+	CActiveListener* activeListener = new(ELeave)CActiveListener;
+	CleanupStack::PushL(activeListener);
+	activeListener->InitialiseActiveListener();
+	theImageDecoder->Convert(&activeListener->iStatus, *theDestination, aFrameNumber);
+	
+	CActiveScheduler::Start();
+	
+	err = activeListener->iStatus.Int();
+	if(err == KErrNone)
+		{
+		INFO_PRINTF3(_L("Frame %d of file %S was converted successfully"), aFrameNumber, &theSourceFilename);
+		}
+	else
+		{
+		INFO_PRINTF3(_L("Fail during conversion of frame %d of file %S"), aFrameNumber, &theSourceFilename);
+		User::Leave(err);
+		}
+
+	TFileName theReferenceFilename;
+	TBuf<KLenBufferExtension> theExtension;
+
+	Directory(EReference, theReferenceFilename);
+	TInt theSeparatorPos = aFilename.LocateReverse('.') + 1;
+	theReferenceFilename.Append(aFilename.Left(theSeparatorPos));
+	GetImageExtension(KImageTypeMBMUid, theExtension);
+	theReferenceFilename.Append(theExtension);
+
+//  Uncomment to save the decoded bitmap	
+//	User::LeaveIfError(theDestination->Save(theReferenceFilename));
+	
+	if(err == KErrNone)
+		{
+		TInt err1 = KErrNone;
+		TRAP(err, err1 = CheckBitmapL(*theDestination, theReferenceFilename));
+		if(err != KErrNone || err1 != KErrNone)
+			{
+			INFO_PRINTF1(_L("Bitmap check failed"));
+			User::Leave(KErrGeneral);
+			}
+		}
+	
+	theDestination->Reset();	  
+	CleanupStack::PopAndDestroy(4, theImageFromFile); // CActiveListener, theDestination, theImageDecoder, theImageFromFile
+	}
+
+
+/* 
+ *
+ * Read and encode image from file to memory
+ *
+ * @param		"const TDesC& aFileName"
+ *				"TUid		aTypeImage"
+ *				codec Uid 
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::EncodeImageToMemoryL(const TDesC& aFilename, 
+												   TUid		aTypeImage)
+	{
+	TInt	theRes = KErrNone;
+	CICLFbsSessionTest* fbsSession = CICLFbsSessionTest::NewLC();
+
+	TFileName	theSourceFileName;
+	Directory( EReference, theSourceFileName);
+	theSourceFileName.Append(aFilename);
+
+	CFbsBitmap	*theBitmap = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(theBitmap);
+	theRes = theBitmap->Load(theSourceFileName);
+	
+	if(theRes == KErrNone)
+		theRes = EncodeImageFromBitmapToMemoryL(aFilename, 
+												    theBitmap,
+													aTypeImage);
+	else
+		INFO_PRINTF2(_L("File : %S not found"), &theSourceFileName);
+
+	CleanupStack::PopAndDestroy(2, fbsSession);
+
+	return theRes;
+	}
+
+
+/* 
+ *
+ * Read and encode image from bitmap to memory
+ *
+ * @param		"const TDesC& aFileName"
+ *				"CFbsBitmap	*theBitmap"
+ *				"TUid		aTypeImage"
+ *				codec Uid 
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::EncodeImageFromBitmapToMemoryL(const TDesC& aFilename, 
+												    CFbsBitmap	*theBitmap,
+													TUid		aImageTypeId)
+	{
+
+	TInt	theRes = KErrNone;
+	
+	TFileName	theSourceFileName;
+	Directory( EReference, theSourceFileName);
+	theSourceFileName.Append(aFilename);
+
+	HBufC8 *theDestinationImage = NULL;
+	CImageEncoder *theImageEncoder = NULL;
+	
+	// creating encoder
+	TBuf<KLenBufferExtension>	theExtension;
+	GetImageExtension(aImageTypeId, theExtension);
+	ERR_PRINTF3(_L("Creating encoder %S, Uid = %d"), &theExtension, aImageTypeId); 
+	
+	TRAP(theRes, theImageEncoder = CImageEncoder::DataNewL( theDestinationImage, 
+		CImageEncoder::EOptionNone, aImageTypeId ));
+	if(theRes != KErrNone)
+		{
+		ERR_PRINTF2(_L("Cannot create image encoder buffer for Uid = %d"), 
+			aImageTypeId.iUid);
+		return theRes;
+		
+		}
+	CleanupStack::PushL(theImageEncoder);
+	
+	ERR_PRINTF1(_L("Image buffer was created successfully")); 
+
+	//prepare encode data
+	TConvertInfo	theConvInfo;
+	theConvInfo.iImageTypeId = iImageTypeUid;
+	theConvInfo.iDisplayMode = theBitmap->DisplayMode();
+	
+	TImageDataBlock*	imageData = NULL;
+	TFrameDataBlock*	frameData = NULL;
+	
+	CFrameImageData* theFrameImageData = CFrameImageData::NewL();
+	CleanupStack::PushL(theFrameImageData);
+		
+	theRes	 = PrepareEncodeDataL(theConvInfo, &imageData, &frameData);
+	//
+	if(imageData)
+		{
+		CleanupStack::PushL(imageData);
+		User::LeaveIfError(theFrameImageData->AppendImageData(imageData));
+		CleanupStack::Pop(imageData);
+		}
+	if(frameData)
+		{
+		CleanupStack::PushL(frameData);	
+		User::LeaveIfError(theFrameImageData->AppendFrameData(frameData));
+		CleanupStack::Pop(frameData);
+		}
+	// do conversion
+	CActiveListener* activeListener = new(ELeave)CActiveListener;
+	CleanupStack::PushL( activeListener );
+	
+	activeListener->InitialiseActiveListener();
+	theImageEncoder->Convert(&activeListener->iStatus,*theBitmap, theFrameImageData);
+	CActiveScheduler::Start();
+
+	theRes = activeListener->iStatus.Int();
+
+	if(theRes == KErrNone)
+		ERR_PRINTF1(_L("Conversion was successful")); 
+	else
+		ERR_PRINTF1(_L("Fail during conversion")); 
+
+	if(theRes == KErrNone)
+		theRes = CompareFileL(aFilename, theDestinationImage, 
+									aImageTypeId, 
+									EInput); 
+	//
+	delete theDestinationImage;
+	theDestinationImage = NULL;
+
+	CleanupStack::PopAndDestroy(3, theImageEncoder);
+	
+	return theRes; 
+	}
+
+
+/* 
+ *
+ * Read and encode image from bitmap to file
+ * After encoding load file into a flat buffer and do bitwise compare
+ *
+ * @param		"const TDesC& aFileName"
+ *				"TUid		aTypeImage"
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::EncodeImageFromBitmapToFileL(const TDesC& aFilename, 
+												   TUid		aImageTypeId)
+	{
+	TFileName	theSourceFile;
+	Directory(EReference, theSourceFile);
+	theSourceFile.Append(aFilename);
+
+	CFbsBitmap	*theBitmap = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(theBitmap);
+	TInt theRes = theBitmap->Load(theSourceFile);
+	
+	if(theRes != KErrNone)
+		{
+		CleanupStack::PopAndDestroy(theBitmap);
+
+		ERR_PRINTF2(_L("File %S cannot be louded" ), &theSourceFile); 
+		return theRes;
+		}
+	
+	User::LeaveIfError(iFs.Connect());
+
+	// call for a convertor
+	//
+	TFileName	theDestinationFileName; 
+	TBuf<KLenBuffer>		theExtinsion;
+
+	Directory(EOutput, theDestinationFileName);
+	theDestinationFileName.Append(aFilename.Left(aFilename.Length()-3));
+
+	GetImageExtension(aImageTypeId, theExtinsion);
+	theDestinationFileName.Append(theExtinsion);
+	
+	CImageEncoder* theImageEncoder = NULL;
+	TRAP(theRes, theImageEncoder = 
+		CImageEncoder::FileNewL(iFs, theDestinationFileName, 
+		CImageEncoder::EOptionNone, aImageTypeId));
+
+	if(theRes != KErrNone)
+		{
+		CleanupStack::PopAndDestroy(theBitmap);
+
+		iFs.Close();
+		ERR_PRINTF3(_L("Error during creating Image Encoder UId %d to file %S" ), aImageTypeId, &theDestinationFileName); 
+		if(KErrPathNotFound == theRes)
+			ERR_PRINTF2(_L("Path %S not found" ), &theDestinationFileName); 
+		
+		if(theRes == KErrAccessDenied)
+			ERR_PRINTF1(_L("Access denied" )); 
+
+		return theRes;	
+		}
+	CleanupStack::PushL(theImageEncoder);
+	//-----------
+	//prepare encode data
+	TConvertInfo	theConvInfo;
+	theConvInfo.iImageTypeId = iImageTypeUid;
+	theConvInfo.iDisplayMode = theBitmap->DisplayMode();
+	
+	//TJpegImageData::TColorSampling iSampling;
+	//TInt iQualityFactor; // 0 to 100 inclusive
+	TImageDataBlock*	imageData = NULL;
+	TFrameDataBlock*	frameData = NULL;
+
+	CFrameImageData* theFrameImageData = CFrameImageData::NewL();
+	CleanupStack::PushL(theFrameImageData);
+		
+	theRes	 = PrepareEncodeDataL(theConvInfo, &imageData, &frameData);
+	//
+	if(imageData)
+		{
+		CleanupStack::PushL(imageData);
+		User::LeaveIfError(theFrameImageData->AppendImageData(imageData));
+		CleanupStack::Pop(imageData);
+		}
+	if(frameData)
+		{
+		CleanupStack::PushL(frameData);	
+		User::LeaveIfError(theFrameImageData->AppendFrameData(frameData));
+		CleanupStack::Pop(frameData);
+		}
+	//--------------
+	// do conversion
+	CActiveListener* activeListener = new(ELeave)CActiveListener;
+	CleanupStack::PushL( activeListener );
+
+	iActiveScheduler->SetEncoder(theImageEncoder, activeListener, 0);
+	iActiveScheduler->SetStep(this);
+
+	activeListener->InitialiseActiveListener();
+	theImageEncoder->Convert(&activeListener->iStatus, *theBitmap, theFrameImageData);
+	CActiveScheduler::Start();
+	
+
+	theRes = activeListener->iStatus.Int();
+	iActiveScheduler->SetStep(NULL);
+
+	//  ! this function will be removed from API
+	//TInt nSize = iImageEncoder->CurrentImageSizeL();
+	//
+
+	CleanupStack::PopAndDestroy(4, theBitmap); //active sheduler
+
+	if(theRes != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error during conversion" )); 
+		return theRes;
+		}
+	else
+		{
+		ERR_PRINTF1(_L("Conversion was successful" )); 
+		}
+	//
+	//compare two file into a flat buffer
+	
+	TInt fileSize;
+	
+	iFile.Open(iFs, theDestinationFileName, EFileRead);
+	iFile.Size(fileSize);
+	HBufC8 *theCreatedImage = HBufC8::NewMaxLC(fileSize);
+
+	TPtr8 imageFromFilePtr = theCreatedImage->Des();
+	iFile.Read(imageFromFilePtr);
+	iFile.Close();
+
+	theRes = CompareFileL(aFilename, theCreatedImage, aImageTypeId, EInput); 
+
+	CleanupStack::PopAndDestroy(theCreatedImage);
+	//
+	iFs.Close();
+
+	return theRes; 
+	}
+
+ 
+
+/* 
+ *
+ * Prepare encode data
+ *
+ * @param		"TConvertInfo &aConvInfo"
+ *				input information
+ *				"TImageDataBlock**	imageData"
+ *				"TFrameDataBlock**	frameData"
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::PrepareEncodeDataL(TConvertInfo &aConvInfo, 
+											   TImageDataBlock** aImageData, 
+											   TFrameDataBlock** aFrameData)
+	{
+	TBuf<KLenBuffer>	nameSection;
+	TInt theRes = KErrNone;
+	TBool theColor = ETrue;
+	if(aConvInfo.iDisplayMode == EGray2)
+		theColor = EFalse;
+	
+	if(aConvInfo.iImageTypeId == KImageTypeMBMUid)
+		{
+		*aFrameData = new (ELeave) TMbmEncodeData;
+		TMbmEncodeData*	data = STATIC_CAST(TMbmEncodeData*, *aFrameData);
+		TInt	displaymode;
+		data->iDisplayMode = aConvInfo.iDisplayMode;
+			//
+		if(GetIntFromConfig(nameSection, _L("displaymode"), displaymode) == (TBool)ETrue)
+			{
+				switch(displaymode)
+					{
+					case 1: data->iDisplayMode = EGray2; break;
+					case 2: data->iDisplayMode = EGray4; break;
+					case 3: data->iDisplayMode = EGray16;break;
+					case 4: data->iDisplayMode = EGray256;break;
+					case 5: data->iDisplayMode = EColor16;break;
+					case 6: data->iDisplayMode = EColor256;break;
+					case 7: data->iDisplayMode = EColor64K;break;
+					case 8: data->iDisplayMode = EColor16M;break;
+					default: break;
+					}
+			}
+		}
+	else if(aConvInfo.iImageTypeId == KImageTypeGIFUid)
+		{
+		//the encoder is not configurable	
+		}
+	else if(aConvInfo.iImageTypeId == KImageTypeBMPUid)
+		{
+		*aImageData= new(ELeave) TBmpImageData;
+		TBmpImageData*	data = STATIC_CAST(TBmpImageData*, *aImageData);
+
+		TPtrC ptr = iTestStepName;
+		nameSection = ptr.Right(KLenNameInSection);
+		TInt nBitsPerPixel = 0;
+		if(GetIntFromConfig(nameSection, _L("BitsPerPixel"), nBitsPerPixel) == EFalse)
+			{
+		
+			switch(aConvInfo.iDisplayMode)
+				{
+				case EGray2: data->iBitsPerPixel = 1; break;
+				case EGray4: data->iBitsPerPixel = 2; break;
+				case EGray16: data->iBitsPerPixel = 4; break;
+				case EGray256: data->iBitsPerPixel = 8;break;
+				case EColor16: data->iBitsPerPixel = 4; break;
+				case EColor256: data->iBitsPerPixel = 8; break;
+				case EColor64K: data->iBitsPerPixel = 16;break;
+				case EColor16M: data-> iBitsPerPixel = 24;break;
+				default: data->iBitsPerPixel = 0; break;
+				}
+			}
+			else 
+				data->iBitsPerPixel = nBitsPerPixel;
+		}
+	else if(aConvInfo.iImageTypeId == KImageTypeJPGUid)
+		{
+			// read config file
+			TInt		theQualityFactor = KDefaultQualityFactor;
+			TInt		theSampling = KDefaultSampling;
+
+			TPtrC ptr = iTestStepName;
+			nameSection = ptr.Right(KLenNameInSection);
+			GetIntFromConfig(nameSection, _L("QualityFactor"), theQualityFactor);
+			GetIntFromConfig(nameSection, _L("Sampling"), theSampling);
+			//
+
+			*aImageData = new (ELeave) TJpegImageData;
+			TJpegImageData* data = STATIC_CAST(TJpegImageData*, *aImageData);
+
+			if(!theColor)
+				data->iSampleScheme = TJpegImageData::EMonochrome;
+			else 
+				data->iSampleScheme=TJpegImageData::TColorSampling(theSampling);
+			data->iQualityFactor=theQualityFactor; 
+		}
+
+	return theRes;
+	}
+/* 
+ *
+ * List all available decoders MIME types
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::ListAvailableMIMEDecoders()
+	{
+	TInt	theRes;
+	RFileExtensionMIMETypeArray		theFileExtensionArray;
+	
+	TRAP(theRes, CImageDecoder::GetFileTypesL(theFileExtensionArray));	
+	
+	if(theRes != KErrNone)
+		{
+		theFileExtensionArray.ResetAndDestroy();
+		return theRes;
+		}
+
+	
+	INFO_PRINTF1(_L("A List of decoder file extensions and MIME types"));
+	
+	for (TInt index=0; index<theFileExtensionArray.Count(); index++)
+		{
+		CFileExtensionMIMEType& fileExtAndMIMEType = *theFileExtensionArray[index];
+		
+		const TDesC& extension = fileExtAndMIMEType.FileExtension();
+		const TDesC8& mimeType = fileExtAndMIMEType.MIMEType();
+		TBuf<KLenBuffer>	mimeType16;
+
+		mimeType16.Copy(mimeType);
+		
+		INFO_PRINTF3(_L("Extension : %S, MIME Type : %S"), &extension, &mimeType16);
+		
+		}
+	
+	theFileExtensionArray.ResetAndDestroy();
+	
+	return theRes;
+	}
+
+
+/* 
+ *
+ * List all available encoders MIME types
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::ListAvailableMIMEEncoders()
+	{
+	TInt	theRes = KErrNone;
+	
+	RFileExtensionMIMETypeArray		theFileExtensionArray;
+
+	TRAP(theRes, CImageEncoder::GetFileTypesL(theFileExtensionArray));	
+	
+	if(theRes != KErrNone)
+		{
+		theFileExtensionArray.ResetAndDestroy();
+		return theRes;
+		}
+	INFO_PRINTF1(_L("\n"));
+	INFO_PRINTF1(_L("A List of encoder file extensions and MIME types"));
+	
+	for (TInt index=0; index<theFileExtensionArray.Count(); index++)
+		{
+		CFileExtensionMIMEType& fileExtAndMIMEType = *theFileExtensionArray[index];
+		
+		const TDesC& extension = fileExtAndMIMEType.FileExtension();
+		const TDesC8& mimeType = fileExtAndMIMEType.MIMEType();
+		TBuf<KLenBuffer> mimeType16;
+
+		mimeType16.Copy(mimeType);
+		
+		INFO_PRINTF3(_L("Extension: %S, MIME Type : %S") , &extension, &mimeType16);
+		
+		}
+	theFileExtensionArray.ResetAndDestroy();
+	
+	return theRes; 
+	}
+
+/* 
+ *
+ * List all available decoders 
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::ListAllAvailableDecoders()
+	{
+	TInt theRes = KErrNone;
+
+
+	// find out UID and then name of the codec
+	RImageTypeDescriptionArray imageDecTypeArray;
+	TRAP(theRes, CImageDecoder::GetImageTypesL(imageDecTypeArray));
+	// find a description with the same image type and, if subtype given, subtype too
+	
+	if(theRes != KErrNone)
+		{
+		return theRes;
+		}
+	
+	TInt index;
+	
+	if(imageDecTypeArray.Count() > 0)
+		INFO_PRINTF1(_L("A List of available Decoder plugins!"));
+
+	for (index=0; index<imageDecTypeArray.Count(); index++)
+		{
+		CImageTypeDescription& description = *imageDecTypeArray[index];
+		
+		const TDesC& theBufDes = description.Description();
+ 
+		INFO_PRINTF1(theBufDes);
+		//
+		TUid theUid = description.ImageType();
+		RImageTypeDescriptionArray	theSubTypeArray;
+		
+		TInt theRes1;
+		TRAP(theRes1, CImageDecoder::GetImageSubTypesL(theUid, theSubTypeArray));
+		
+		if(theRes1 == KErrNone)
+			{
+			if(theSubTypeArray.Count() > 0)
+				INFO_PRINTF1(_L("A List of available Sub Types:"));
+			TInt index1;
+			for (index1=0; index1<theSubTypeArray.Count(); index1++)
+				{
+				CImageTypeDescription& description1 = *theSubTypeArray[index1];
+				const TDesC& theBufDes1 = description1.Description();
+ 
+				INFO_PRINTF2(_L("   %S"), &theBufDes1);
+				
+				}	
+			theSubTypeArray.ResetAndDestroy();
+			}
+		//
+		INFO_PRINTF1(_L("\n"));
+		}
+	imageDecTypeArray.ResetAndDestroy();
+
+	return theRes; //
+	}
+
+/* 
+ *
+ * List all available encoders 
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::ListAllAvailableEncoders()
+	{
+	TInt theRes = KErrNone;
+
+	// find out UID and then name of the codec
+	RImageTypeDescriptionArray imageEncTypeArray;
+	
+	TRAP(theRes, CImageEncoder::GetImageTypesL(imageEncTypeArray));
+
+	if(theRes != KErrNone)
+		return theRes;
+	// find a description with the same image type and, if subtype given, subtype too
+	TInt index;
+	
+	if(imageEncTypeArray.Count() > 0)
+		INFO_PRINTF1(_L("A List of available Encoder plugins!"));
+
+	for (index=0; index<imageEncTypeArray.Count(); index++)
+		{
+		CImageTypeDescription& description = *imageEncTypeArray[index];
+		
+		const TDesC&	theBufDes = description.Description();
+		
+		INFO_PRINTF1(theBufDes);
+
+		//
+		TUid theUid = description.ImageType();
+		RImageTypeDescriptionArray	theSubTypeArray;
+		
+		TInt theRes1;
+		TRAP(theRes1, CImageEncoder::GetImageSubTypesL(theUid, theSubTypeArray));
+		
+		if(theRes1 == KErrNone)
+			{
+			if(theSubTypeArray.Count() > 0)
+				INFO_PRINTF1(_L("A List of available Sub Types:"));
+			TInt index1;
+			for (index1=0; index1<theSubTypeArray.Count(); index1++)
+				{
+				CImageTypeDescription& description1 = *theSubTypeArray[index1];
+				const TDesC& theBufDes1 = description1.Description();
+ 
+				INFO_PRINTF2(_L("   %S"), &theBufDes1);
+				
+				}	
+			theSubTypeArray.ResetAndDestroy();
+			}
+		//
+
+		}
+	imageEncTypeArray.ResetAndDestroy();
+
+	return theRes; 
+	}
+
+/* 
+ *
+ * Enquire MIME type of an unopened image  
+ *
+ * @param		"const TDesC& aFileName"
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::FindMimeTypeL(const TDesC& aFileName)
+	{
+	TInt theRes = KErrNone;
+
+	TBuf8<KLenBuffer>	theMimeType;
+
+	INFO_PRINTF1(_L("Enquire MIME type of an unopened images"));
+	
+	User::LeaveIfError(iFs.Connect());
+
+	TFileName	theSourceFilename;
+	Directory(EInput, theSourceFilename);
+	theSourceFilename.Append(aFileName);
+
+	CImageDecoder::GetMimeTypeFileL(iFs, theSourceFilename, theMimeType);
+	TBuf<KLenBuffer>	mimeType;
+	mimeType.Copy(theMimeType);
+	INFO_PRINTF3(_L("File : %S, MimeType %S"), &theSourceFilename, &mimeType);
+	//-------------
+	TInt fileSize;
+
+	iFile.Open(iFs, theSourceFilename, EFileRead);
+	iFile.Size(fileSize);
+	HBufC8 *theImageFromFile = HBufC8::NewMaxLC(fileSize);
+
+	TPtr8 imageFromFilePtr = theImageFromFile->Des();
+	iFile.Read(imageFromFilePtr);
+	iFile.Close();
+
+	iFs.Close();
+
+	TBuf8<KLenBuffer>	theMimeType1;
+
+	CImageDecoder::GetMimeTypeDataL(imageFromFilePtr, theMimeType1);
+	
+	mimeType.Copy(theMimeType1);
+	INFO_PRINTF3(_L("Reading from buffer, File : %S, MimeType %S\n"), 
+		&theSourceFilename, &mimeType);
+	
+	CleanupStack::PopAndDestroy();
+
+	return theRes; 
+	}
+
+
+/* 
+ *
+ * Enquire UID of a loaded decoder & Implementation Info
+ *
+ * @param		"const TDesC& aFileName"
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::EnquireDecoderUIDAndImplementationInfoL(const TDesC& aFileName)
+	{
+	TInt theRes = KErrNone;
+
+	User::LeaveIfError(iFs.Connect());
+
+	TFileName	theSourceFilename;
+	Directory(EInput, theSourceFilename);
+	theSourceFilename.Append(aFileName);
+
+	CImageDecoder *theImageDecoder = CImageDecoder::FileNewL(iFs, theSourceFilename);
+	if(theImageDecoder == NULL)
+			return KErrUnknown;
+
+	TUid uid = theImageDecoder->ImplementationUid();
+	INFO_PRINTF3(_L("UID of a loaded decoder during reading file %S = %x\n"), 
+		&theSourceFilename, uid);
+
+	delete theImageDecoder;
+	theImageDecoder = NULL;
+	//------------------------
+	TInt fileSize;
+
+	iFile.Open(iFs, theSourceFilename, EFileRead);
+	iFile.Size(fileSize);
+	HBufC8 *theImageFromFile = HBufC8::NewMaxLC(fileSize);
+
+	TPtr8 imageFromFilePtr = theImageFromFile->Des();
+	iFile.Read(imageFromFilePtr);
+	iFile.Close();
+	iFs.Close();
+
+	
+	theImageDecoder = CImageDecoder::DataNewL(iFs, imageFromFilePtr);
+	if(theImageDecoder == NULL)
+			return KErrUnknown;
+	CleanupStack::PushL(theImageDecoder);
+	TUid uid1 = theImageDecoder->ImplementationUid();
+	
+	INFO_PRINTF2(_L("UID of a loaded decoder from buffer = 0x%08x\n"), 
+		uid1);
+//------
+	//Request ImplementationInformation
+	CImplementationInformationType* theImplementationInfo = 
+		CImageDecoder::GetImplementationInformationL(uid1);
+	CleanupStack::PushL(theImplementationInfo);
+	TInt theVersion = theImplementationInfo->Version();
+	const TDesC& dispName = theImplementationInfo->DisplayName();
+	const TDesC8&  dataType8 = theImplementationInfo->DataType();
+	const TDesC8&  opaqueData8 = theImplementationInfo->OpaqueData();
+	
+	TBuf<KLenBuffer>	dataType;
+	TBuf<KLenBuffer>	opaqueData;
+
+	dataType.Copy(dataType8);
+	opaqueData.Copy(opaqueData8);
+	//------------------
+	TUid	theUid;
+	TUid	theUidSubType;
+
+	theImageDecoder->ImageType(0, theUid, theUidSubType);
+
+	TInt versionNo = 0;
+	TBuf<KLenBuffer>	bufDisplayName;
+	const TUint8*		defaultDataPtr = NULL;		
+	const TUint8*		opaqueDataPtr = NULL;
+	TInt		lenDefaultData = 0;
+	TInt		lenOpaqueData = 0;
+
+	TInt versionNoJPEG = 1;
+	const TUint8 defaultDataJPEG[] = {0xFF, 0xD8};
+	static const TUint8 opaqueDataJPEG[] = {0, 0x10, 0x1F, 0x45, 0xD8, 0, 0, 0, 0, 1, 0x2E, 0x6A, 0x70, 0x67, 0x0D, 1, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x6A, 0x70, 0x65, 0x67, 0x0D};
+	
+	TInt versionNoGIF = 1;
+	const TUint8 defaultDataGIF[] = {0x47, 0x49, 0x46, 0x38, 0x3F, 0x61};
+	static const TUint8 opaqueDataGIF[] = {0, 0x10, 0x1F, 0x45, 0xB3, 0, 0, 0, 0, 1, 0x2E, 0x67, 0x69, 0x66, 0x0D, 1, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x67, 0x69, 0x66, 0x0D};
+
+	TInt versionNoBMP = 1;
+	const TUint8 defaultDataBMP[] = {0x42, 0x4D};
+	static const TUint8 opaqueDataBMP[] = {0, 0x10, 0x1F, 0x45, 0xB0, 0, 0, 0, 0, 1, 0x2E, 0x62, 0x6D, 0x70, 0x0D, 2, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x78, 0x2D, 0x62, 0x6D, 0x70, 0x0D, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x62, 0x6D, 0x70, 0x0D};
+
+	if(theUid == KImageTypeJPGUid)
+		{
+			versionNo = versionNoJPEG;
+			bufDisplayName = _L("JPEG");
+			defaultDataPtr = defaultDataJPEG;
+			opaqueDataPtr  = opaqueDataJPEG;	
+			lenDefaultData = sizeof(defaultDataJPEG) / sizeof(defaultDataJPEG[0]);
+			lenOpaqueData = sizeof(opaqueDataJPEG) / sizeof(opaqueDataJPEG[0]);
+		}
+	else if(theUid == KImageTypeGIFUid)
+		{
+			versionNo = versionNoGIF;
+			bufDisplayName = _L("GIF");
+			defaultDataPtr = defaultDataGIF;
+			opaqueDataPtr  = opaqueDataGIF;	
+			lenDefaultData = sizeof(defaultDataGIF) / sizeof(defaultDataGIF[0]);
+			lenOpaqueData = sizeof(opaqueDataGIF) / sizeof(opaqueDataGIF[0]);
+		}
+	else if(theUid == KImageTypeBMPUid)
+		{
+			versionNo = versionNoBMP;
+			bufDisplayName = _L("BMP");
+			defaultDataPtr = defaultDataBMP;
+			opaqueDataPtr  = opaqueDataBMP;	
+			lenDefaultData = sizeof(defaultDataBMP) / sizeof(defaultDataBMP[0]);
+			lenOpaqueData = sizeof(opaqueDataBMP) / sizeof(opaqueDataBMP[0]);
+		}
+	
+	if(versionNo != theVersion)
+		theRes = KErrNotIdentical;
+
+	if(theRes == KErrNone)
+		theRes = Mem::Compare(defaultDataPtr, lenDefaultData, 
+			dataType8.Ptr(), dataType8.Length());
+
+
+
+	if(theRes == KErrNone)
+		{
+		theRes = Mem::Compare(opaqueDataPtr, lenOpaqueData, 
+			opaqueData8.Ptr(), opaqueData8.Length());
+		if (theUid == KImageTypeJPGUid && theRes!=KErrNone)
+			{
+			INFO_PRINTF1(_L("Known issue: EXIF plug-in has got different data, ignoring diffs."));
+			theRes=KErrNone;
+			}			
+		}
+	//------------
+	INFO_PRINTF1(_L("Implementation information"));
+	INFO_PRINTF2(_L("Display name : %S"), &dispName);
+	INFO_PRINTF2(_L("Version : %d"), theVersion);
+	//INFO_PRINTF2(_L("Data type : %S"), &dataType);
+	//INFO_PRINTF2(_L("Opaque data : %S"), &opaqueData);
+
+//-------
+	CleanupStack::PopAndDestroy(3, theImageFromFile); //theImageDecoder, theImageFromFile, theImplementationInfo
+	
+	return theRes; //
+	}
+
+/* 
+ *
+ * Enquire UID of a loaded encoder 
+ *
+ * @param		"const TDesC& aFileName"
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::EnquireEncoderUIDL(const TDesC& aFileName, 
+											   TUid		aTypeImageUid)
+	{
+	TInt theRes = KErrNotSupported;
+
+
+	User::LeaveIfError(iFs.Connect());
+
+	TFileName	theDestinationFilename;
+	Directory(EOutput, theDestinationFilename);
+	theDestinationFilename.Append(aFileName);
+	
+	CImageEncoder *theImageEncoder = NULL;
+	TRAP(theRes, theImageEncoder = CImageEncoder::FileNewL(iFs, theDestinationFilename, 
+		CImageEncoder::EOptionNone, aTypeImageUid));
+	if(theRes != KErrNone)
+		{
+		iFs.Close();
+		INFO_PRINTF2(_L("Cannot create file with Uid  = %d\n"), 
+				aTypeImageUid);
+		
+		if(KErrPathNotFound == theRes)
+			INFO_PRINTF2(_L("Path %S not found"), &theDestinationFilename);
+		return theRes;
+		}
+	CleanupStack::PushL(theImageEncoder);	
+	TUid uid1 = theImageEncoder->ImplementationUid();
+	INFO_PRINTF3(_L("UID of a loaded decoder during openning file %S = %d\n"), 
+		&theDestinationFilename, uid1);
+
+	CleanupStack::PopAndDestroy(theImageEncoder);
+
+	return theRes; 
+	}
+
+/* 
+ *
+ * Request number frames in image 
+ *
+ * @param		"const TDesC& aFileName"
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::RequestNumberFramesL(const TDesC& aFileName)
+	{
+	TInt	theRes 	= KErrNone;
+
+	User::LeaveIfError(iFs.Connect());
+
+	TFileName	theSourceFilename;
+	Directory(EInput, theSourceFilename);
+	theSourceFilename.Append(aFileName);
+
+	CImageDecoder *theImageDecoder = CImageDecoder::FileNewL(iFs, theSourceFilename);
+	CleanupStack::PushL(theImageDecoder);
+	if(theImageDecoder == NULL)
+			return KErrUnknown;
+
+	TInt	theFrameCount = theImageDecoder->FrameCount();
+
+	CleanupStack::PopAndDestroy(theImageDecoder);
+
+	iFs.Close();
+
+	INFO_PRINTF3(_L("Number of frames from a file %S = %d\n"), 
+		&theSourceFilename, theFrameCount);
+
+	return theRes;
+	}
+
+
+/* 
+ *
+ * Print frame information 
+ *
+ * @param		"const TFrameInfo& aFrameInfo"
+ *
+ */
+TAny	CTestStepConversion::PrintFrameInfo(const TFrameInfo& aFrameInfo)
+	{
+	TBuf<KLenBuffer>	theBuf;
+	//TRect iFrameCoordsInPixels;
+	//TSize iFrameSizeInTwips;
+	//TInt iBitsPerPixel;
+	//TTimeIntervalMicroSeconds iDelay;
+	//TUint32 iFlags;
+	//TSize iOverallSizeInPixels;
+	//TDisplayMode iFrameDisplayMode;
+	//TRgb iBackgroundColor;
+
+	INFO_PRINTF5(_L("Frame's coordinates (left, top, right, bottom)  = %d, %d, %d, %d\n"), 
+			aFrameInfo.iFrameCoordsInPixels.iTl.iX, aFrameInfo.iFrameCoordsInPixels.iTl.iY,
+			aFrameInfo.iFrameCoordsInPixels.iBr.iX, aFrameInfo.iFrameCoordsInPixels.iBr.iY);
+
+	INFO_PRINTF3(_L("Frame's size in twips  = %d, %d\n"), 
+			aFrameInfo.iFrameSizeInTwips.iWidth, aFrameInfo.iFrameSizeInTwips.iHeight);
+
+	INFO_PRINTF2(_L("Bits per pixel  = %d\n"), 
+				aFrameInfo.iBitsPerPixel);
+
+	TInt64	int64 = aFrameInfo.iDelay.Int64();
+	TInt	delay = I64INT(int64);
+
+	INFO_PRINTF2(_L("Delay in microseconds = %d\n"), 
+				delay);
+	
+	INFO_PRINTF3(_L("Overall size in pixel = %d, %d\n"),  
+		aFrameInfo.iOverallSizeInPixels.iWidth, aFrameInfo.iOverallSizeInPixels.iHeight);
+	
+	FrameDisplayMode(aFrameInfo.iFrameDisplayMode, theBuf);
+		INFO_PRINTF2(_L("Frame display mode  = %S\n"), 
+				&theBuf);
+
+	INFO_PRINTF4(_L("Background color Red, Green, Blue = %d, %d, %d \n"), 
+				aFrameInfo.iBackgroundColor.Red(), 
+				aFrameInfo.iBackgroundColor.Green(),
+				aFrameInfo.iBackgroundColor.Blue());
+
+	}
+
+/* 
+ *
+ * Request decode information & options for frames in a loaded image
+ *	and print it
+ *
+ * @param		"const TDesC& aFileName"
+ *				"TInt	aParam"
+ *				KShowFrameInformation - show Frame Information
+ *				KShowFrameOption - show frame option 
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::RequestDecodeDataL(const TDesC& aFileName, TInt aParam)
+	{
+	TInt	theErr = KErrNone;
+
+	User::LeaveIfError(iFs.Connect());
+
+	TFileName	theSourceFilename;
+	Directory(EInput, theSourceFilename);
+	theSourceFilename.Append(aFileName);
+	
+	CImageDecoder *theImageDecoder = NULL;
+	TRAP(theErr, theImageDecoder = CImageDecoder::FileNewL(iFs, theSourceFilename));
+	CleanupStack::PushL(theImageDecoder);
+	if(theErr != KErrNone)
+		{
+		INFO_PRINTF2(_L("Cannot open decoder for file %S\n"), &theSourceFilename);
+		
+
+		return theErr;
+		}
+	INFO_PRINTF2(_L("The file %S had been loaded successfully\n"), &theSourceFilename);
+
+	//frames loop
+	TInt	theFrameCount = theImageDecoder->FrameCount();
+	for(TInt theCurFrame = 0; theCurFrame < theFrameCount;theCurFrame++ )
+		{
+		const TFrameInfo& theFrameInfo = theImageDecoder->FrameInfo(theCurFrame);
+			
+		INFO_PRINTF1(_L("------------\n"));
+		INFO_PRINTF2(_L("The frame number %d\n"), 
+				theCurFrame);
+		if(aParam & KShowFrameInformation)
+			{	
+			PrintFrameInfo(theFrameInfo);
+
+		//---------------------
+			const CFrameImageData&	theFrameData = theImageDecoder->FrameData(theCurFrame);
+			TInt theImageDataCount = theFrameData.ImageDataCount();
+			TInt theFrameCount = theFrameData.FrameDataCount();
+			INFO_PRINTF2(_L("Number frame data entries %d"), theFrameCount);
+			TInt	index;
+			for(index = 0; index < theFrameCount; index++)
+				{
+				const TFrameDataBlock* theFrameDataBlock = theFrameData.GetFrameData(index);
+				INFO_PRINTF3(_L("Frame Data Block # %d, UId %d"),
+					index, theFrameDataBlock->DataType());
+
+				}
+
+			INFO_PRINTF2(_L("Number image data entries %d"), theImageDataCount);
+			for(index = 0; index < theImageDataCount; index++)
+				{
+				const TImageDataBlock* theImageDataBlock = theFrameData.GetImageData(index);
+				INFO_PRINTF3(_L("Image Data Block # %d, UId %d"),
+					index, theImageDataBlock->DataType());
+
+				}
+			}
+		//--------------
+
+		if(aParam & KShowFrameOption)
+			PrintFrameOptions(theFrameInfo);
+		}
+	  
+	CleanupStack::PopAndDestroy(theImageDecoder);
+	iFs.Close();
+
+	return theErr;
+	}
+
+
+/* 
+ *
+ * Print frame options 
+ *
+ * @param		"const TFrameInfo& aFrameInfo"
+ *
+ */
+TAny CTestStepConversion::PrintFrameOptions(const TFrameInfo& aFrameInfo)
+	{
+	_LIT(theBufYes, "Yes");
+	_LIT(theBufNo, "No");
+	
+	// iFlags;
+			
+			//EColor					= 0x00000001 Grayscale if not set
+			//ETransparencyPossible	= 0x00000002 Fully opaque if not set
+			//EFullyScaleable			= 0x00000004 Will only scale to 1/2,1/4 & 1/8th if not set
+			//EConstantAspectRatio	= 0x00000008 Scaling need not maintain aspect ratio if not set
+			//ECanDither				= 0x00000010 Will not use error diffusion if not set
+			//EAlphaChannel			= 0x00000020 Set if the image contains alpha-blending information
+			//ELeaveInPlace			= 0x00000040
+			//ERestoreToBackground	= 0x00000080 Mutually exclusive image disposal methods
+			//ERestoreToPrevious		= 0x00000100
+			//EPartialDecodeInvalid   = 0x00000200   Where CImageDecoder::Convert fails on KErrUnderflow, image not suitable for display
+
+	if(TFrameInfo::EColor & aFrameInfo.iFlags)
+		INFO_PRINTF2(_L("Color = %S \n"),
+								&theBufYes);
+	else
+		INFO_PRINTF2(_L("Color = %S \n"),
+								&theBufNo);
+				
+	if(TFrameInfo::ETransparencyPossible & aFrameInfo.iFlags)
+		INFO_PRINTF2(_L("Transparency = %S \n"),
+								&theBufYes);
+	else
+		INFO_PRINTF2(_L("Transparency = %S \n"),
+								&theBufNo);
+
+	if(TFrameInfo::EFullyScaleable & aFrameInfo.iFlags)
+		INFO_PRINTF2(_L("Fully scaleable = %S \n"),
+								&theBufYes);
+	else
+		INFO_PRINTF2(_L("Fully scaleable = %S \n"),
+								&theBufNo);
+
+	if(TFrameInfo::EConstantAspectRatio & aFrameInfo.iFlags)
+		INFO_PRINTF2(_L("Aspect ratio = %S \n"),
+								&theBufYes);
+	else
+		INFO_PRINTF2(_L("Aspect ratio = %S \n"),
+								&theBufNo);
+
+	if(TFrameInfo::ECanDither & aFrameInfo.iFlags)
+		INFO_PRINTF2(_L("Can dither = %S \n"),
+						&theBufYes);
+	else
+		INFO_PRINTF2(_L("Can dither = %S \n"),
+						&theBufNo);
+
+	if(TFrameInfo::EAlphaChannel & aFrameInfo.iFlags)
+		INFO_PRINTF2(_L("Alpha channel = %S \n"),
+						&theBufYes);
+	else
+		INFO_PRINTF2(_L("Alpha channel = %S \n"),
+						&theBufNo);
+
+	if(TFrameInfo::ELeaveInPlace & aFrameInfo.iFlags)
+		INFO_PRINTF2(_L("Leave in place = %S \n"),
+								&theBufYes);
+	else
+		INFO_PRINTF2(_L("Leave in place = %S \n"),
+						&theBufNo);
+
+	if(TFrameInfo::ERestoreToBackground & aFrameInfo.iFlags)
+			INFO_PRINTF2(_L("Restore to background = %S \n"),
+								&theBufYes);
+	else
+		INFO_PRINTF2(_L("Restore to background = %S \n"),
+							&theBufNo);
+
+	if(TFrameInfo::ERestoreToPrevious & aFrameInfo.iFlags)
+		INFO_PRINTF2(_L("Restore to previos = %S \n"),
+								&theBufYes);
+	else
+		INFO_PRINTF2(_L("Restore to previos = %S \n"),
+								&theBufNo);
+
+	if(TFrameInfo::EPartialDecodeInvalid & aFrameInfo.iFlags)
+		INFO_PRINTF2(_L("Partial decode invalid = %S \n"),
+								&theBufYes);
+	else
+		INFO_PRINTF2(_L("Partial decode invalid = %S \n"),
+								&theBufNo);
+
+	}
+
+/* 
+ *
+ *	Open image and retrieve embedded image comments
+ *
+ * @param		"TUid aImageTypeId"
+ *				Uid encoder
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::RetrieveEmbeddedCommentsL(const TDesC& aFilename)
+	{
+
+	TInt theRes = KErrNone; 
+		
+	TFileName theSourceFilename;
+	Directory(EInput, theSourceFilename);
+	theSourceFilename.Append(aFilename);
+
+	User::LeaveIfError(iFs.Connect());
+
+		//
+	CImageDecoder *theImageDecoder = NULL;	
+	TRAP(theRes, (theImageDecoder = CImageDecoder::FileNewL(iFs, theSourceFilename)));//,
+
+	if(theRes != KErrNone)
+		{
+		INFO_PRINTF2(_L("Cannot open file %S"),
+						&theSourceFilename);
+		return theRes;
+		
+		}
+	if(theImageDecoder == NULL)
+			return KErrUnknown;
+	CleanupStack::PushL(theImageDecoder);
+	TInt	theNumComment=theImageDecoder->NumberOfImageComments();
+	
+	INFO_PRINTF3(_L("Number of image comments in the file %S  = %d\n"),
+						&theSourceFilename,
+						theNumComment);		
+	for(TInt theCurComment = 0; theCurComment < theNumComment ;theCurComment++)
+		{
+		HBufC* commentBuf = theImageDecoder->ImageCommentL(theCurComment);
+		if(commentBuf)
+			{
+
+			TPtr imageCommentPtr = commentBuf->Des();
+
+			INFO_PRINTF3(_L("Frame %d, comment - %S \n"),
+						theCurComment,		
+						&imageCommentPtr);
+					
+			delete commentBuf;
+			}
+		}
+	
+	CleanupStack::PopAndDestroy(theImageDecoder);
+	
+	iFs.Close();
+		
+	return theRes;
+	}
+
+/* 
+ *
+ *	Open image and retrieve frame info
+ *
+ * @param		"const TDesC& aFilename"
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt	CTestStepConversion::RetrieveFrameInfoL(const TDesC& aFilename)
+	{
+	TInt theRes = KErrNone; 
+
+	TFileName theSourceFilename;
+	Directory(EInput, theSourceFilename);
+	theSourceFilename.Append(aFilename);
+
+	User::LeaveIfError(iFs.Connect());
+		//
+	CImageDecoder* theImageDecoder = NULL;
+	TRAP(theRes, (theImageDecoder = CImageDecoder::FileNewL(iFs, theSourceFilename, 
+		CImageDecoder::EOptionNone)));
+	CleanupStack::PushL(theImageDecoder);
+	if(theRes != KErrNone)
+		{
+		INFO_PRINTF2(_L("Cannot open file %S"),
+						&theSourceFilename);
+		return theRes;
+		
+		}
+	if(theImageDecoder == NULL)
+			return KErrUnknown;
+
+	TInt theNumOfFrameComments = theImageDecoder->NumberOfFrameComments(0);
+	INFO_PRINTF2(_L("Number of frame comments : %d"), theNumOfFrameComments);
+
+// GIF doesn't support frame comments
+//	HBufC*  theBuf = iImageDecoder->FrameCommentL(0, 0);
+//	TPtr	theBufPtr = theBuf->Des();
+//	INFO_PRINTF2(_L("Frame comments : %S\n"), &theBufPtr);
+//
+//	delete theBuf;
+//	theBuf = NULL;
+
+	TInt imageComments = theImageDecoder->NumberOfImageComments();
+	INFO_PRINTF2(_L("Number of image comments : %d"), imageComments);
+
+	HBufC*  theBuf = theImageDecoder->ImageCommentL(0);
+	TPtr	theBufPtr = theBuf->Des();
+	INFO_PRINTF2(_L("Image comments : %S\n"), &theBufPtr);
+
+	delete theBuf;
+	theBuf = NULL;
+	
+
+	INFO_PRINTF1(_L("Call function FrameInfoStringsL\n"));
+	CFrameInfoStrings*	theStr = theImageDecoder->FrameInfoStringsL(0);
+
+	TInt index;
+	for(index = 0; index < theStr->Count(); index++)
+		{
+			const TPtrC str = theStr->String(index);
+			INFO_PRINTF3(_L("String # %d : %S"),
+						index, &str);
+		}
+	delete 	theStr;
+	theStr = NULL;
+	
+	INFO_PRINTF1(_L("Call function FrameInfoStringsLC"));
+	CFrameInfoStrings*	theStr1 = theImageDecoder->FrameInfoStringsLC(0);
+	for(index = 0; index < theStr1->Count(); index++)
+		{
+			const TPtrC str = theStr1->String(index);
+			INFO_PRINTF3(_L("String # %d : %S"),
+						index, &str);
+		}
+	
+	CleanupStack::Pop();
+	delete 	theStr1;
+	
+	TInt theFrameNumber = 0;
+	TUid theImageType;
+	TUid theImageSubType;
+
+	theImageDecoder->ImageType(theFrameNumber, theImageType, theImageSubType);
+	INFO_PRINTF5(_L("Image type Uid: %d (expected %d), Image sub type Uid %d (expected %d)"),
+						theImageType, KImageTypeTestUid, theImageSubType, 
+						KImageSubTypeTestUid);
+	
+	CleanupStack::PopAndDestroy(theImageDecoder);
+	iFs.Close();
+
+	return theRes;
+	}
+
+// dummy Hal call for heap balance on target
+// Need to do this BEFORE doing any allocation testing !
+TInt CTestStepConversion::DummyHalCall()
+	{
+    TInt err1 = FbsStartup();
+    if (err1 != KErrNone)
+        {
+        INFO_PRINTF2(_L("FbsStartup failed, err = %d"), err1);
+        return EInconclusive;
+        }
+
+    err1 = RFbsSession::Connect();
+    if (err1 != KErrNone)
+        {
+        INFO_PRINTF2(_L("RFbsSession::Connect() failed, err = %d"), err1);
+        return EInconclusive;
+        }
+		
+	TInt displayMode = EColor256;
+	CFbsScreenDevice* screenDevice = NULL;	
+	TInt err;
+	while(displayMode < EColorLast) 
+		{
+		TRAP(err, screenDevice = CFbsScreenDevice::NewL(_L("NotUsed"),(TDisplayMode)displayMode));
+		delete screenDevice;
+		screenDevice = NULL;	
+		if(err == KErrNone)
+			{
+			break;
+			}
+		displayMode++;
+		}			
+	
+	RFbsSession::Disconnect();
+	if (err != KErrNone)
+		{
+		INFO_PRINTF2(_L("Unable to create CFbsScreenDevice, err = %d"), err);
+		}
+	return err;
+  	}
+
+//MS3.4 File Handles//
+/* 
+ *
+ * Decode a Bitmap, supplied a Decoder Object
+ * After encoding load file into a flat buffer and do bitwise compare
+ *
+ * @param		"CImageDecoder& aImageDecoder"
+ *				"TDesC& aFileName"
+ *
+ * @return		"TInt"
+ *				error	
+ */
+TInt CTestStepConversion::DecodeUsingDecoderL(const TDesC& aFileName)
+	{
+	TInt theRes = KErrNone;
+
+	if(iImageDecoder == NULL)
+		{
+		return KErrUnknown;
+		}
+
+	//[ Create an active Listener and push it on the cleanup stack ]
+	CActiveListener* activeListener = new(ELeave)CActiveListener;
+	CleanupStack::PushL( activeListener );
+
+	//[ Create a destination Bitmap ]
+	CFbsBitmap* theDestination = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(theDestination);
+	
+	const TFrameInfo* theFrameInfo = &iImageDecoder->FrameInfo();
+	User::LeaveIfError(theDestination->Create(theFrameInfo->iOverallSizeInPixels, theFrameInfo->iFrameDisplayMode));//EColor256));// 
+	
+	//[ Convert Method of the Decoder ]
+	activeListener->InitialiseActiveListener();
+	iImageDecoder->Convert(&activeListener->iStatus, *theDestination, 0);
+		
+	CActiveScheduler::Start();
+	theRes = activeListener->iStatus.Int();
+
+	if(theRes == KErrNone)
+		{
+		INFO_PRINTF2(_L("Decoding of file %S was successful"), &aFileName);
+		}
+	else
+		{
+		INFO_PRINTF2(_L("Failed to Decode the file : %S"), &aFileName);
+		}
+
+	//[ Checking with Reference Bitmaps at the end ]
+	TFileName theReferenceFilename;
+	TBuf<KLenBufferExtension> theExtension;
+
+	Directory(EReference, theReferenceFilename);
+	TInt theSeparatorPos = aFileName.LocateReverse('.') + 1;
+	theReferenceFilename.Append(aFileName.Left(theSeparatorPos));
+	GetImageExtension(KImageTypeMBMUid, theExtension);
+	theReferenceFilename.Append(theExtension);
+	
+	if(theRes == KErrNone)
+		{
+		theRes = CheckBitmapL(*theDestination, theReferenceFilename);
+		}
+	theDestination->Reset();	
+	CleanupStack::PopAndDestroy(2,activeListener);  // theDestination,CActiveListener
+	
+	return theRes;
+	}
+
+/* 
+ *
+ * Read and encode image from bitmap to file
+ * After encoding load file into a flat buffer and do bitwise compare
+ *
+ * @param		"const TDesC& aFileName"
+ *				"TUid		aTypeImage"
+ *
+ */
+void CTestStepConversion::EncodeUsingEncoderL(const TDesC& aFileNameSrc)
+	{
+	TInt theRes = KErrNone; 
+
+	if(iImageEncoder == NULL)
+		{
+		User::Leave(KErrUnknown);
+		}
+
+	//[ Open the Source Bitmap ]
+	TFileName theSourceFile;
+	Directory(EReference, theSourceFile);
+	theSourceFile.Append(aFileNameSrc);
+
+	CFbsBitmap *theBitmap = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(theBitmap);
+	
+	theRes = theBitmap->Load(theSourceFile);
+	
+	if(theRes != KErrNone)
+		{
+		ERR_PRINTF2(_L("File %S cannot be loaded." ), &theSourceFile); 
+		User::Leave(theRes);
+		}
+	
+	//[ Prepare Encode Data ]
+	TConvertInfo theConvInfo;
+	theConvInfo.iImageTypeId = iImageTypeUid;
+	theConvInfo.iDisplayMode = theBitmap->DisplayMode();
+	
+	TImageDataBlock* imageData = NULL;
+	TFrameDataBlock* frameData = NULL;
+	
+	CFrameImageData* theFrameImageData = CFrameImageData::NewL();
+	CleanupStack::PushL(theFrameImageData);
+
+	theRes	 = PrepareEncodeDataL(theConvInfo, &imageData, &frameData);
+	//
+	if(imageData)
+		{
+		CleanupStack::PushL(imageData);
+		User::LeaveIfError(theFrameImageData->AppendImageData(imageData));
+		CleanupStack::Pop(imageData);
+		}
+	if(frameData)
+		{
+		CleanupStack::PushL(frameData);	
+		User::LeaveIfError(theFrameImageData->AppendFrameData(frameData));
+		CleanupStack::Pop(frameData);
+		}
+		
+	//[ Create an active Listener and push it on the cleanup stack ]
+	CActiveListener* activeListener = new(ELeave)CActiveListener;
+	CleanupStack::PushL( activeListener );
+
+	iActiveScheduler->SetEncoder(iImageEncoder, activeListener, 0);
+	iActiveScheduler->SetStep(this);
+	
+	//[ Convert Method of the Encoder ]
+	activeListener->InitialiseActiveListener();
+	iImageEncoder->Convert(&activeListener->iStatus, *theBitmap, theFrameImageData);
+	CActiveScheduler::Start();
+	theRes = activeListener->iStatus.Int();
+	iActiveScheduler->SetStep(NULL);
+
+	if(theRes == KErrNone)
+		{
+		INFO_PRINTF2(_L("Encoding of file %S was successful"), &aFileNameSrc);
+		}
+	else
+		{
+		INFO_PRINTF2(_L("Failed to Encode the file : %S"), &aFileNameSrc);
+		User::Leave(theRes);
+		}
+
+	//[ Compare two files into a flat buffer ]
+	TFileName theDestinationFileName; 
+	TBuf<KLenBuffer> theExtension;
+
+	Directory(EOutput, theDestinationFileName);
+	theDestinationFileName.Append(aFileNameSrc.Left(aFileNameSrc.Length()-3));
+	GetImageExtension(iImageTypeUid, theExtension);
+	theDestinationFileName.Append(theExtension);
+	
+	iFile.Close(); //- As a precaution.
+	
+	TInt fileSize;
+	theRes = iFile.Open(iFs, theDestinationFileName, EFileWrite);
+	if(theRes != KErrNone)
+		{
+		INFO_PRINTF2(_L("Cannot open file: %S to Compare"), &theDestinationFileName);
+		User::Leave(theRes);
+		}
+	iFile.Size(fileSize);
+	HBufC8 *theCreatedImage = HBufC8::NewMaxLC(fileSize);
+
+	TPtr8 imageFromFilePtr = theCreatedImage->Des();
+	iFile.Read(imageFromFilePtr);
+	
+	iFile.Close();
+	
+	//[ Call the CompareFileL Function ]
+	theRes = CompareFileL(aFileNameSrc, theCreatedImage, iImageTypeUid, EInput);
+	User::LeaveIfError(theRes);
+	//[ Delete the Local Objects ]
+	CleanupStack::PopAndDestroy(4,theBitmap); //CActiveListener
+	}
+