graphicsapitest/graphicssvs/fbserv/src/T_DataFbsBitmap.cpp
author Faisal Memon <faisal.memon@nokia.com>
Fri, 14 May 2010 15:41:33 +0100
branchNewGraphicsArchitecture
changeset 64 5c983aa672ea
parent 0 5d03bc08d59c
permissions -rw-r--r--
Merge 1. Pull in cpp files in the performance enhanced Khronos RI OVG files which are newly added. I've ignored platform-specific cpp files for linux, macosx, and null operating systems because this local solution has its own platform glue (i.e. facility to target Bitmaps but no full windowing support). I've ignored sfEGLInterface.cpp because this is used as a bridge to go from EGL to Nokia's Platsim which offers an EGL service. That's not relevant to this implementation because this is ARM side code, not Intel side. I just left a comment to sfEGLInterface.cpp in case we need to pick up this later on. The current code compiles on winscw. Prior to this fix, the code works on winscw, and can launch the SVG tiger (tiger.exe). That takes about 20 seconds to render. I hope to always be able to show this icon on each commit, and the plan is for the render time to reduce with this series of submissions. On this commit, the tiger renders ok in 20 seconds.

/*
* Copyright (c) 2005-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:
*
*/

/**
@test
@internalComponent
v
This contains CT_DataFbsBitmap
*/

//	User includes
#include "T_DataFbsBitmap.h"
#include "T_GraphicsUtil.h"

//	EPOC includes
#include <graphics\bitmapuid.h>

/*@{*/
///	Parameters
_LIT(KAlways,								"always");
_LIT(KBitmapId,								"bitmap_id");
_LIT(KBuffLength,							"buff_length");
_LIT(KDitherOffsetX,						"dither_offset_x");
_LIT(KDitherOffsetY,						"dither_offset_y");
_LIT(KExpectedBool,							"expected_bool");
_LIT(KExpectedInt,							"expected_int");
_LIT(KFbsBitmapName,						"fbs_bitmap_name");
_LIT(KFileName,								"file_name");
_LIT(KFileOffset,							"file_offset");
_LIT(KHeight,								"height");
_LIT(KHandle,								"handle");
_LIT(KWidth,								"width");
_LIT(KLength,								"length");
_LIT(KNullExpected,							"null_expected");
_LIT(KDevice,								"device");
_LIT(KNumberOfSources,						"number_of_sources");
_LIT(KPixels,								"pixels");
_LIT(KPointX,								"point_x");
_LIT(KPointY,								"point_y");
_LIT(KRectTlX,								"rect_tl_x");
_LIT(KRectTlY,								"rect_tl_y");
_LIT(KRectBrX,								"rect_br_x");
_LIT(KRectBrY,								"rect_br_y");
_LIT(KScanLineCoord,						"scan_line_coord");
_LIT(KSourceFileName0,						"source_file_name_0"); // we don't need more than 3 sources for our test anyway.
_LIT(KSourceFileName1,						"source_file_name_1"); // So that this solution is ok
_LIT(KSourceFileName2,						"source_file_name_2");
_LIT(KSourceBitmapId0,						"source_bitmap_id_0");
_LIT(KSourceBitmapId1,						"source_bitmap_id_1");
_LIT(KSourceBitmapId2,						"source_bitmap_id_2");
_LIT(KShareIfLoaded,						"share_if_loaded");
_LIT(KTwips,								"twips");
_LIT(KUseDitherOffset,						"use_dither_offset");
_LIT(KUseRFile,								"use_rfile");
_LIT(KUseClosedRFile,						"use_closed_rfile");
_LIT(KUseClosedStream,						"use_closed_stream");
_LIT(KUseRequestStatus,						"use_request_status");
_LIT(KUid,									"uid");
_LIT(KPalette,								"palette");
_LIT(KModifiable,							"modifiable");
_LIT(KEntries,								"entries");
_LIT(KRed,									"red");
_LIT(KGreen,								"green");
_LIT(KBlue,									"blue");
_LIT(KDisplayMode,							"displaymode");
_LIT(KBitmapfileCompressionScheme,			"bitmap_compression_scheme");

///	Commands
_LIT(KCmdDisown,								"disown");
_LIT(KCmdNew,								"new");
_LIT(KCmdDestructor,						"~");
_LIT(KCmdCompress,							"Compress");
_LIT(KCmdCompressInBackground,				"CompressInBackground");
_LIT(KCmdCreate,							"Create");
_LIT(KCmdCreateHardwareBitmap,				"CreateHardwareBitmap");
_LIT(KCmdDataAddress,						"DataAddress");
_LIT(KCmdDataStride,						"DataStride");
_LIT(KCmdDisplayMode,						"DisplayMode");
_LIT(KCmdDuplicate,							"Duplicate");
_LIT(KCmdExternalizeL,						"ExternalizeL");
_LIT(KCmdExternalizeRectangleL,				"ExternalizeRectangleL");
_LIT(KCmdGetPalette,						"GetPalette");
_LIT(KCmdGetPixel,							"GetPixel");
_LIT(KCmdGetScanLine,						"GetScanLine");
_LIT(KCmdGetVerticalScanLine,				"GetVerticalScanLine");
_LIT(KCmdHandle,							"Handle");
_LIT(KCmdHardwareBitmapHandle,				"HardwareBitmapHandle");
_LIT(KCmdHeader,							"Header");
_LIT(KCmdHorizontalPixelsToTwips,			"HorizontalPixelsToTwips");
_LIT(KCmdHorizontalTwipsToPixels,			"HorizontalTwipsToPixels");
_LIT(KCmdInitialDisplayMode,				"InitialDisplayMode");
_LIT(KCmdInternalizeL,						"InternalizeL");
_LIT(KCmdIsCompressedInRAM,					"IsCompressedInRAM");
_LIT(KCmdIsFileInRom,						"IsFileInRom");
_LIT(KCmdIsLargeBitmap,						"IsLargeBitmap");
_LIT(KCmdIsMonochrome,						"IsMonochrome");
_LIT(KCmdIsRomBitmap,						"IsRomBitmap");
_LIT(KCmdLoad,								"Load");
_LIT(KCmdLoadAndCompress,					"LoadAndCompress");
_LIT(KCmdLockHeap,							"LockHeap");
_LIT(KCmdLockHeapLC,						"LockHeapLC");
_LIT(KCmdPaletteAttributes,					"PaletteAttributes");
_LIT(KCmdReset,								"Reset");
_LIT(KCmdResize,							"Resize");
_LIT(KCmdSave,								"Save");
_LIT(KCmdScanLineLength,					"ScanLineLength");
_LIT(KCmdSetDisplayMode,					"SetDisplayMode");
_LIT(KCmdSetPalette,						"SetPalette");
_LIT(KCmdSetRomBitmapL,						"SetRomBitmapL");
_LIT(KCmdSetScanLine,						"SetScanLine");
_LIT(KCmdSetSizeInTwips,					"SetSizeInTwips");
_LIT(KCmdSizeInPixels,						"SizeInPixels");
_LIT(KCmdSizeInTwips,						"SizeInTwips");
_LIT(KCmdStoreL,							"StoreL");
_LIT(KCmdSwapWidthAndHeight,				"SwapWidthAndHeight");
_LIT(KCmdUnlockHeap,						"UnlockHeap");
_LIT(KCmdVerticalPixelsToTwips,				"VerticalPixelsToTwips");
_LIT(KCmdVerticalTwipsToPixels,				"VerticalTwipsToPixels");

//??	SetRomBitmapL
//	Begin
//	End
//	GetDecompressionBuffer
//	GetAllBitmapHandles
/*@}*/

/**
* Two phase constructor
*/
CT_DataFbsBitmap* CT_DataFbsBitmap::NewL()
	{
	CT_DataFbsBitmap* ret = new (ELeave) CT_DataFbsBitmap();
	CleanupStack::PushL(ret);
	ret->ConstructL();
	CleanupStack::Pop(ret);
	return ret;
	}

/**
* Protected constructor. First phase construction
*/
CT_DataFbsBitmap::CT_DataFbsBitmap()
:	CDataWrapperBase()
,	iFbsBitmap(NULL)
,	iDisplayMode(ENone)
,	iPopWhenUnlocking(EFalse)
,	iCompressFailed(EFalse)
,	iActiveCompressInBackground(NULL)
	{
	}

/**
* Protected constructor. Second phase construction
*/
void CT_DataFbsBitmap::ConstructL()
	{
	iActiveCompressInBackground=CActiveCallback::NewL(*this);
	}

/**
* Destructor.
*/
CT_DataFbsBitmap::~CT_DataFbsBitmap()
	{
	DestroyData();
	delete iActiveCompressInBackground;
	iActiveCompressInBackground=NULL;
	}

/**
* Contains cleanup implementation
*/
void CT_DataFbsBitmap::DestroyData()
	{
	delete iFbsBitmap;
	iFbsBitmap=NULL;
	}

/**
* Return a pointer to the object that the data wraps
*
* @return pointer to the object that the data wraps
*/
TAny* CT_DataFbsBitmap::GetObject()
	{
	return iFbsBitmap;
	}

void CT_DataFbsBitmap::SetObjectL(TAny* aAny)
    {
    DestroyData();
    iFbsBitmap=static_cast<CFbsBitmap*> (aAny);
    }

void CT_DataFbsBitmap::DisownObjectL()
	{
	iFbsBitmap=NULL;
	}

CFbsBitmap* CT_DataFbsBitmap::GetFbsBitmap() const
	{
	return iFbsBitmap;
	}

/**
* Process a command read from the ini file
*
* @param aDataWrapper	test step requiring command to be processed
* @param aCommand	the command to process
* @param aSection		the entry in the ini file requiring the command to be processed
*
* @return ETrue if the command is processed
*/
TBool CT_DataFbsBitmap::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
	{
	TBool	retVal = ETrue;

	if (aCommand == KCmdNew)
		{
		DoCmdNewL();
		}
	else if (aCommand == KCmdDestructor)
		{
		DoCmdDestructor();
		}
	else if (aCommand == KCmdCompress)
		{
		DoCmdCompress(aSection);
		}
	else if (aCommand == KCmdCompressInBackground)
		{
		DoCmdCompressInBackground(aSection, aAsyncErrorIndex);
		}
	else if (aCommand == KCmdCreate)
		{
		DoCmdCreate(aSection);
		}
	else if (aCommand == KCmdCreateHardwareBitmap)
		{
		DoCmdCreateHardwareBitmap(aSection);
		}
	else if (aCommand == KCmdDataAddress)
		{
		DoCmdDataAddress(aSection);
		}
	else if (aCommand == KCmdDataStride)
		{
		DoCmdDataStride(aSection);
		}
	else if (aCommand == KCmdDisplayMode)
		{
		DoCmdDisplayMode(aSection);
		}
	else if (aCommand == KCmdDuplicate)
		{
		DoCmdDuplicateL(aSection);
		}
	else if (aCommand == KCmdExternalizeL)
		{
		DoCmdExternalizeL(aSection);
		}
	else if (aCommand == KCmdExternalizeRectangleL)
		{
		DoCmdExternalizeRectangleL(aSection);
		}
	else if (aCommand == KCmdGetPalette)
		{
		DoCmdGetPaletteL(aSection);
		}
	else if (aCommand == KCmdGetPixel)
		{
		DoCmdGetPixel(aSection);
		}
	else if (aCommand == KCmdGetScanLine)
		{
		DoCmdGetScanLineL(aSection);
		}
	else if (aCommand == KCmdGetVerticalScanLine)
		{
		DoCmdGetVerticalScanLineL(aSection);
		}
	else if (aCommand == KCmdHandle)
		{
		DoCmdHandle(aSection);
		}
	else if (aCommand == KCmdHardwareBitmapHandle)
		{
		DoCmdHardwareBitmapHandle(aSection);
		}
	else if (aCommand == KCmdHeader)
		{
		DoCmdHeader();
		}
	else if (aCommand == KCmdHorizontalPixelsToTwips)
		{
		DoCmdHorizontalPixelsToTwips(aSection);
		}
	else if (aCommand == KCmdHorizontalTwipsToPixels)
		{
		DoCmdHorizontalTwipsToPixels(aSection);
		}
	else if (aCommand == KCmdInitialDisplayMode)
		{
		DoCmdInitialDisplayMode(aSection);
		}
	else if (aCommand == KCmdInternalizeL)
		{
		DoCmdInternalizeL(aSection);
		}
	else if (aCommand == KCmdIsCompressedInRAM)
		{
		DoCmdIsCompressedInRAM(aSection);
		}
	else if (aCommand == KCmdIsFileInRom)
		{
		DoCmdIsFileInRom(aSection);
		}
	else if (aCommand == KCmdIsLargeBitmap)
		{
		DoCmdIsLargeBitmap(aSection);
		}
	else if (aCommand == KCmdIsMonochrome)
		{
		DoCmdIsMonochrome(aSection);
		}
	else if (aCommand == KCmdIsRomBitmap)
		{
		DoCmdIsRomBitmap(aSection);
		}
	else if (aCommand == KCmdLoad)
		{
		DoCmdLoadL(aSection);
		}
	else if (aCommand == KCmdLoadAndCompress)
		{
		DoCmdLoadAndCompressL(aSection);
		}
	else if (aCommand == KCmdLockHeap)
		{
		DoCmdLockHeap(aSection);
		}
	else if (aCommand == KCmdLockHeapLC)
		{
		DoCmdLockHeapLC(aSection);
		}
	else if (aCommand == KCmdPaletteAttributes)
		{
		DoCmdPaletteAttributes(aSection);
		}
	else if (aCommand == KCmdReset)
		{
		DoCmdReset();
		}
	else if (aCommand == KCmdResize)
		{
		DoCmdResize(aSection);
		}
	else if (aCommand == KCmdSave)
		{
		DoCmdSave(aSection);
		}
	else if (aCommand == KCmdScanLineLength)
		{
		DoCmdScanLineLength(aSection);
		}
	else if (aCommand == KCmdSetDisplayMode)
		{
		DoCmdSetDisplayMode(aSection);
		}
	else if (aCommand == KCmdSetPalette)
		{
		DoCmdSetPaletteL(aSection);
		}
	else if (aCommand == KCmdSetRomBitmapL)
		{
		DoCmdSetRomBitmapL(aSection);
		}
	else if (aCommand == KCmdSetScanLine)
		{
		DoCmdSetScanLineL(aSection);
		}
	else if (aCommand == KCmdSetSizeInTwips)
		{
		DoCmdSetSizeInTwipsL(aSection);
		}
	else if (aCommand == KCmdSizeInPixels)
		{
		DoCmdSizeInPixels(aSection);
		}
	else if (aCommand == KCmdSizeInTwips)
		{
		DoCmdSizeInTwips(aSection);
		}
	else if (aCommand == KCmdStoreL)
		{
		DoCmdStoreL(aSection);
		}
	else if (aCommand == KCmdSwapWidthAndHeight)
		{
		DoCmdSwapWidthAndHeight();
		}
	else if (aCommand == KCmdUnlockHeap)
		{
		DoCmdUnlockHeapL(aSection);
		}
	else if (aCommand == KCmdVerticalPixelsToTwips)
		{
		DoCmdVerticalPixelsToTwips(aSection);
		}
	else if (aCommand == KCmdVerticalTwipsToPixels)
		{
		DoCmdVerticalTwipsToPixels(aSection);
		}
	else if (aCommand == KCmdDisown)
   {
   DisownObjectL();
   }
	else
		{
		retVal=EFalse;
		}

	return retVal;
	}


/** Creates new CFbsBitmap class instance */
void CT_DataFbsBitmap::DoCmdNewL()
	{
	INFO_PRINTF1(_L("Creates new CFbsBitmap class instance"));

	// cleanup if already created
    DestroyData();
	iFbsBitmap=new (ELeave) CFbsBitmap();
	}

/** Calls static CFbsBitmap destructor */
void CT_DataFbsBitmap::DoCmdDestructor()
	{
	DestroyData();
	}

/** Calls CFbsBitmap::Compress() */
void CT_DataFbsBitmap::DoCmdCompress(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::Compress()"));

	TInt							err=KErrNone;
	TBitmapfileCompressionScheme	compressionScheme;
	if ( CT_GraphicsUtil::ReadBitmapfileCompressionScheme(*this, aSection, KBitmapfileCompressionScheme(), compressionScheme) )
		{
		err=GetFbsBitmap()->Compress(compressionScheme);
		}
	else
		{
		// call Compress()
		err=GetFbsBitmap()->Compress();
		}
	// check error code
	if ( err!=KErrNone )
		{
		ERR_PRINTF2(_L("Compress error: %d"), err);
		SetError(err);
		iCompressFailed = ETrue;
		}
	else
	    {
	    iCompressFailed = EFalse;
	    };
	}

/** Calls CFbsBitmap::CompressInBackground() */
void CT_DataFbsBitmap::DoCmdCompressInBackground(const TDesC& aSection, const TInt aAsyncErrorIndex)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::CompressInBackground()"));

	// get a flag if to use requset status from parameters
	TBool	useRequestStatus = EFalse;
	GetBoolFromConfig(aSection, KUseRequestStatus(), useRequestStatus);

	TBitmapfileCompressionScheme	compressionScheme;
	TBool							hasCompressionScheme=CT_GraphicsUtil::ReadBitmapfileCompressionScheme(*this, aSection, KBitmapfileCompressionScheme(), compressionScheme);

	// call CompressInBackground()
	if ( useRequestStatus )
		{
		if ( hasCompressionScheme )
			{
			GetFbsBitmap()->CompressInBackground(iActiveCompressInBackground->iStatus, compressionScheme);
			}
		else
			{
			GetFbsBitmap()->CompressInBackground(iActiveCompressInBackground->iStatus);
			}
		iActiveCompressInBackground->Activate(aAsyncErrorIndex);
		IncOutstanding();
		}
	else
		{
		TInt	err = KErrNone;

		if ( hasCompressionScheme )
			{
			err=GetFbsBitmap()->CompressInBackground(compressionScheme);
			}
		else
			{
			err=GetFbsBitmap()->CompressInBackground();
			}

		// check error code
		if ( err != KErrNone )
			{
			ERR_PRINTF2(_L("Compress in background error: %d"), err);
			SetError(err);
			iCompressFailed = ETrue;
			}
		else
		    {
		    iCompressFailed = EFalse;
		    }
		}
	}

/** Calls CFbsBitmap::Create() */
void CT_DataFbsBitmap::DoCmdCreate(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::Create()"));

	// get size height from parameters
	TInt	height;
	if(!GetIntFromConfig(aSection, KHeight(), height))
		{
		ERR_PRINTF2(_L("No %S"), &KHeight());
		SetBlockResult(EFail);
		}

	// get size width from parameters
	TInt	width;
	if(!GetIntFromConfig(aSection, KWidth(), width))
		{
		ERR_PRINTF2(_L("No %S"), &KWidth());
		SetBlockResult(EFail);
		}

	// get display mode from parameters

	TDisplayMode	displayMode;
	if ( !CT_GraphicsUtil::ReadDisplayMode(*this, aSection, KDisplayMode(), displayMode) )
		{
		ERR_PRINTF1(_L("No display mode"));
		SetBlockResult(EFail);
		}
	else
		{
		// call Create()
		TInt	err = GetFbsBitmap()->Create(TSize(width, height), displayMode);

		// check error code
		if (err != KErrNone)
			{
			ERR_PRINTF2(_L("Creation error: %d"), err);
			SetError(err);
			}
		}
	}

/** Calls CFbsBitmap::CreateHardwareBitmap() */
void CT_DataFbsBitmap::DoCmdCreateHardwareBitmap(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::CreateHardwareBitmap()"));

	// get size height from parameters
	TInt	height;
	if(!GetIntFromConfig(aSection, KHeight(), height))
		{
		ERR_PRINTF2(_L("No %S"), &KHeight());
		SetBlockResult(EFail);
		}

	// get size width from parameters
	TInt	width;
	if(!GetIntFromConfig(aSection, KWidth(), width))
		{
		ERR_PRINTF2(_L("No %S"), &KWidth());
		SetBlockResult(EFail);
		}

	// get display mode from parameters
	TDisplayMode	displayMode;
	if ( !CT_GraphicsUtil::ReadDisplayMode(*this, aSection, KDisplayMode(), displayMode) )
		{
		ERR_PRINTF1(_L("No display mode"));
		SetBlockResult(EFail);
		}

	// get application uid from parameters
	TInt	uidInt;
	if(!GetIntFromConfig(aSection, KUid(), uidInt))
		{
		ERR_PRINTF2(_L("No %S"), &KUid());
		SetBlockResult(EFail);
		}

	// call Create()
	TInt	err = GetFbsBitmap()->CreateHardwareBitmap(TSize(width, height), displayMode, TUid::Uid(uidInt));

	// check error code
	if ( err != KErrNone )
		{
		ERR_PRINTF2(_L("Hardware bitmap creation error: %d"), err);
		SetError(err);
		}
	}

/** Calls CFbsBitmap::DataAddress() locking and unlocking heap by defined in parameters means */
void CT_DataFbsBitmap::DoCmdDataAddress(const TDesC& aSection)
	{
	// call DataAddress()
	TUint32*	address=GetFbsBitmap()->DataAddress();
	INFO_PRINTF2(_L("DataAddress %d"), address);

	// validate returned value if needed
	TInt	expectedValue;
	if(GetIntFromConfig(aSection, KExpectedInt(), expectedValue))
		{
		if (expectedValue != (TInt)address)
			{
			ERR_PRINTF1(_L("The returned value is not as expected"));
			SetBlockResult(EFail);
			}
		}
	}

/** Calls CFbsBitmap::DataStride() */
void CT_DataFbsBitmap::DoCmdDataStride(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::DataStride()"));
	
	// call DataStride()
	TInt value = GetFbsBitmap()->DataStride();
	INFO_PRINTF2(_L("Data stride: %d"), value);

	// validate returned value if needed
	TInt expectedValue;
	if(GetIntFromConfig(aSection, KExpectedInt(), expectedValue))
		{
		if (expectedValue != value)
			{
			ERR_PRINTF3(_L("The returned value is not as expected, expected: %d, actual: %d"), expectedValue, value);
			SetBlockResult(EFail);
			}
		}

	// check the value is not NULL
	if (value <= 0)
		{
		ERR_PRINTF2(_L("The data stride is not expected zero or less, value: %d"), value);
		SetBlockResult(EFail);
		}
	}

/** Checks CFbsBitmap::DisplayMode() value */
void CT_DataFbsBitmap::DoCmdDisplayMode(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Checks CFbsBitmap::DisplayMode() value"));

	// call DisplayMode()
	iDisplayMode=GetFbsBitmap()->DisplayMode();
	INFO_PRINTF2(_L("Display Mode %d"), iDisplayMode);

	// get display mode from parameters
	TDisplayMode	expectedValue;
	if ( CT_GraphicsUtil::ReadDisplayMode(*this, aSection, KDisplayMode(), expectedValue) )
		{
		// check value against NULL
		if ( iDisplayMode!=expectedValue )
			{
			ERR_PRINTF3(_L("The value is not as expected! expected: %d, actual: %d"), expectedValue, iDisplayMode);
			SetBlockResult(EFail);
			}
		}
	}

/** Calls CFbsBitmap::Duplicate() */
void CT_DataFbsBitmap::DoCmdDuplicateL(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::Duplicate()"));
	TInt	handle=GetHandle();
	TPtrC	objectName;
	if ( GetStringFromConfig(aSection, KFbsBitmapName(), objectName) )
		{
		CDataWrapperBase*	wrapper=static_cast<CDataWrapperBase*>(GetDataWrapperL(objectName));
		handle=wrapper->GetHandle();
		}
	else
		{
		GetIntFromConfig(aSection, KHandle(), handle);
		}

	// call Duplicate()
	TInt	err = GetFbsBitmap()->Duplicate(handle);
	if (err != KErrNone)
		{
		ERR_PRINTF2(_L("Duplicate error: %d"), err);
		SetError(err);
		}
	}

/** Calls CFbsBitmap::ExternalizeL() */
void CT_DataFbsBitmap::DoCmdExternalizeL(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::ExternalizeL()"));
	ExternalizeImplL(aSection, TRect(), EFalse);
	}

/** Calls CFbsBitmap::ExternalizeRectangleL() */
void CT_DataFbsBitmap::DoCmdExternalizeRectangleL(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::ExternalizeRectangleL()"));

	// get rectangle top left x-coordinate from parameters
	TInt	tlx;
	if(!GetIntFromConfig(aSection, KRectTlX(), tlx))
		{
		ERR_PRINTF2(_L("No %S"), &KRectTlX());
		SetBlockResult(EFail);
		}

	// get rectangle top left x-coordinate from parameters
	TInt	tly;
	if(!GetIntFromConfig(aSection, KRectTlY(), tly))
		{
		ERR_PRINTF2(_L("No %S"), &KRectTlY());
		SetBlockResult(EFail);
		}

	// get rectangle top left x-coordinate from parameters
	TInt	brx;
	if(!GetIntFromConfig(aSection, KRectBrX(), brx))
		{
		ERR_PRINTF2(_L("No %S"), &KRectBrX());
		SetBlockResult(EFail);
		}

	// get rectangle top left x-coordinate from parameters
	TInt	bry;
	if(!GetIntFromConfig(aSection, KRectBrY(), bry))
		{
		ERR_PRINTF2(_L("No %S"), &KRectBrY());
		SetBlockResult(EFail);
		}

	ExternalizeImplL(aSection, TRect(tlx, tly, brx, bry), ETrue);
	}

/** Calls CFbsBitmap::GetPalette() */
void CT_DataFbsBitmap::DoCmdGetPaletteL(const TDesC& aSection)
	{
	// call GetPalette()
	CPalette*	palette = NULL;
	TInt		err = GetFbsBitmap()->GetPalette(palette);
	INFO_PRINTF2(_L("Calls CFbsBitmap::GetPalette() %d"), palette);

	// check error code
	if (err != KErrNone)
		{
		ERR_PRINTF2(_L("GetPalette error: %d"), err);
		SetError(err);
		}
	else
		{
		//	Verify palette
		CPalette*	expectedPalette = NULL;

		if ( CT_GraphicsUtil::GetPaletteL(*this, aSection, KPalette(), expectedPalette) )
			{
			if ( palette != expectedPalette )
				{
				ERR_PRINTF3(_L("GetPalette palette %d not the expected palette %d"), palette, expectedPalette);
				SetBlockResult(EFail);
				}
			}
		}
	}

/** Calls CFbsBitmap::GetPixel() */
void CT_DataFbsBitmap::DoCmdGetPixel(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::GetPixel()"));

	// get point x-coordinate from parameters
	TInt	pointX;
	if(!GetIntFromConfig(aSection, KPointX(), pointX))
		{
		ERR_PRINTF2(_L("No %S"), &KPointX());
		SetBlockResult(EFail);
		}

	// get point y-coordinate from parameters
	TInt	pointY;
	if(!GetIntFromConfig(aSection, KPointY(), pointY))
		{
		ERR_PRINTF2(_L("No %S"), &KPointY());
		SetBlockResult(EFail);
		}

	// call GetPixel()
	TRgb	color;
	GetFbsBitmap()->GetPixel(color, TPoint(pointX, pointY));

	INFO_PRINTF2(_L("Red    %d"), color.Red());
	INFO_PRINTF2(_L("Green  %d"), color.Green());
	INFO_PRINTF2(_L("Blue   %d"), color.Blue());

	TInt	actual;
	TInt	expected;

	if(GetIntFromConfig(aSection, KRed(), expected))
		{
		actual=color.Red();
		if ( expected != actual )
			{
			ERR_PRINTF3(_L("Expected Red %d does not match actual %d"), expected, actual);
			SetBlockResult(EFail);
			}
		}

	if(GetIntFromConfig(aSection, KGreen(), expected))
		{
		actual=color.Green();
		if ( expected != actual )
			{
			ERR_PRINTF3(_L("Expected Green %d does not match actual %d"), expected, actual);
			SetBlockResult(EFail);
			}
		}
	
	if(GetIntFromConfig(aSection, KBlue(), expected))
		{
		actual=color.Blue();
		if ( expected != actual )
			{
			ERR_PRINTF3(_L("Expected Blue %d does not match actual %d"), expected, actual);
			SetBlockResult(EFail);
			}
		}
	}

/** Calls CFbsBitmap::GetScanLine() */
void CT_DataFbsBitmap::DoCmdGetScanLineL(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::GetScanLine()"));
	TBool								dataOk=ETrue;

	// get point x coordinate from parameters
	TInt	pointX = 0;
	if(!GetIntFromConfig(aSection, KPointX(), pointX))
		{
		ERR_PRINTF2(_L("No %S"), &KPointX());
		SetBlockResult(EFail);
		dataOk=EFalse;
		}

	// get point y coordinate from parameters
	TInt	pointY = 0;
	if(!GetIntFromConfig(aSection, KPointY(), pointY))
		{
		ERR_PRINTF2(_L("No %S"), &KPointY());
		SetBlockResult(EFail);
		dataOk=EFalse;
		}

	// get length from parameters
	TInt	length = 0;
	if(!GetIntFromConfig(aSection, KLength(), length))
		{
		ERR_PRINTF2(_L("No %S"), &KLength());
		SetBlockResult(EFail);
		dataOk=EFalse;
		}

	// get buffer length from parameters
	TInt	buffLength = 0;
	if(!GetIntFromConfig(aSection, KBuffLength(), buffLength))
		{
		ERR_PRINTF2(_L("No %S"), &KBuffLength());
		SetBlockResult(EFail);
		dataOk=EFalse;
		}

	// get display mode from parameters
	TDisplayMode	displayMode;
	if ( !CT_GraphicsUtil::ReadDisplayMode(*this, aSection, KDisplayMode(), displayMode) )
		{
		ERR_PRINTF1(_L("No display mode"));
		SetBlockResult(EFail);
		dataOk=EFalse;
		}

	if ( dataOk )
		{
		// call GetScanLine()
		TUint8*	buffer = new (ELeave) TUint8[buffLength];
		TPtr8	scanline(buffer, buffLength, buffLength);

		GetFbsBitmap()->GetScanLine(scanline, TPoint(pointX, pointY), length, displayMode);

		delete [] buffer;
		}
	}

/** Calls CFbsBitmap::GetVerticalScanLine() */
void CT_DataFbsBitmap::DoCmdGetVerticalScanLineL(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::GetVerticalScanLine()"));
	TBool								dataOk=ETrue;

	// get point x coordinate from parameters
	TInt	pointX = 0;
	if(!GetIntFromConfig(aSection, KPointX(), pointX))
		{
		ERR_PRINTF2(_L("No %S"), &KPointX());
		SetBlockResult(EFail);
		dataOk=EFalse;
		}

	// get if to use dither offset flag from parameters
	TBool	useDitherOffset = EFalse;
	if(!GetBoolFromConfig(aSection, KUseDitherOffset(), useDitherOffset))
		{
		ERR_PRINTF2(_L("No %S"), &KUseDitherOffset());
		SetBlockResult(EFail);
		dataOk=EFalse;
		}

	// get dither offset x coordinate from parameters
	TInt	ditherOffsetX = 0;
	if(useDitherOffset && !GetIntFromConfig(aSection, KDitherOffsetX(), ditherOffsetX))
		{
		ERR_PRINTF2(_L("No %S"), &KDitherOffsetX());
		SetBlockResult(EFail);
		dataOk=EFalse;
		}

	// get dither offset y coordinate from parameters
	TInt	ditherOffsetY = 0;
	if(useDitherOffset && !GetIntFromConfig(aSection, KDitherOffsetY(), ditherOffsetY))
		{
		ERR_PRINTF2(_L("No %S"), &KDitherOffsetY());
		SetBlockResult(EFail);
		dataOk=EFalse;
		}

	// get buffer length from parameters
	TInt	buffLength = 0;
	if(!GetIntFromConfig(aSection, KBuffLength(), buffLength))
		{
		ERR_PRINTF2(_L("No %S"), &KBuffLength());
		SetBlockResult(EFail);
		dataOk=EFalse;
		}

	// get display mode from parameters
	TDisplayMode	displayMode;
	if ( !CT_GraphicsUtil::ReadDisplayMode(*this, aSection, KDisplayMode(), displayMode) )
		{
		ERR_PRINTF1(_L("No display mode"));
		SetBlockResult(EFail);
		dataOk=EFalse;
		}

	if ( dataOk )
		{
		// call GetVerticalScanLine()
		TUint8*	buffer = new (ELeave) TUint8[buffLength];
		TPtr8 	scanline(buffer, buffLength, buffLength);

		if (useDitherOffset)
			{
			GetFbsBitmap()->GetVerticalScanLine(scanline, pointX, displayMode);
			}
		else
			{
			GetFbsBitmap()->GetVerticalScanLine(scanline, pointX, TPoint(ditherOffsetX, ditherOffsetY), displayMode);
			}

		delete [] buffer;
		}
	}

/** Calls CFbsBitmap::Handle() */
void CT_DataFbsBitmap::DoCmdHandle(const TDesC& aSection)
	{
	
	// call Handle()
	TInt	handle=GetFbsBitmap()->Handle();
	INFO_PRINTF2(_L("Calls CFbsBitmap::Handle() %d"), handle);
	SetHandle(handle);

	// validate returned value if needed
	TInt	expectedValue;
	if(GetIntFromConfig(aSection, KExpectedInt(), expectedValue))
		{
		if (expectedValue != handle)
			{
			ERR_PRINTF3(_L("The returned value is not as expected, expected: %d, actual: %d"), expectedValue, handle);
			SetBlockResult(EFail);
			}
		}
	}

/** Checks CFbsBitmap::HardwareBitmapHandle() */
void CT_DataFbsBitmap::DoCmdHardwareBitmapHandle(const TDesC& aSection)
	{
	// call HardwareBitmapHandle()
	TInt	handle=GetFbsBitmap()->HardwareBitmapHandle();
	INFO_PRINTF2(_L("CFbsBitmap::HardwareBitmapHandle() %d"), handle);
	SetHandle(handle);

	// get if null expected flag from parameters
	TBool	nullExpected = EFalse;
	if ( GetBoolFromConfig(aSection, KNullExpected(), nullExpected) )
		{
		// check value againts NULL
		if ( (handle == NULL) != nullExpected )
			{
			ERR_PRINTF2(_L("The value is not as expected! value: %d"), handle);
			SetBlockResult(EFail);
			}
		}
	}

/** Calls CFbsBitmap::Header() */
void CT_DataFbsBitmap::DoCmdHeader()
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::Header()"));

	// call Header()
	SEpocBitmapHeader	header=GetFbsBitmap()->Header();
	INFO_PRINTF2(_L("Header iBitmapSize     &d"), header.iBitmapSize);
	INFO_PRINTF2(_L("Header iBitsPerPixel   &d"), header.iBitsPerPixel);
	INFO_PRINTF2(_L("Header iColor          &d"), header.iColor);
	INFO_PRINTF2(_L("Header iCompression    &d"), header.iCompression);
	INFO_PRINTF2(_L("Header iPaletteEntries &d"), header.iPaletteEntries);
	INFO_PRINTF3(_L("Header iSizeInPixels   &d %d"), header.iSizeInPixels.iWidth, header.iSizeInPixels.iHeight);
	INFO_PRINTF3(_L("Header iSizeInTwips    &d %d"), header.iSizeInTwips.iWidth, header.iSizeInTwips.iHeight);
	INFO_PRINTF2(_L("Header iStructSize     &d"), header.iStructSize);
	}

/** Calls CFbsBitmap::HorizontalPixelsToTwips() */
void CT_DataFbsBitmap::DoCmdHorizontalPixelsToTwips(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::HorizontalPixelsToTwips()"));

	// get pixels from parameters
	TInt	pixels;
	if(!GetIntFromConfig(aSection, KPixels(), pixels))
		{
		ERR_PRINTF2(_L("No %S"), &KPixels());
		SetBlockResult(EFail);
		}

	// call HorizontalPixelsToTwips()
	TInt	value = GetFbsBitmap()->HorizontalPixelsToTwips(pixels);
	INFO_PRINTF2(_L("Twips: %d"), value);

	// validate returned value if needed
	TInt	expectedValue;
	if(GetIntFromConfig(aSection, KExpectedInt(), expectedValue))
		{
		if (expectedValue != value)
			{
			ERR_PRINTF3(_L("The returned value is not as expected, expected: %d, actual: %d"), expectedValue, value);
			SetBlockResult(EFail);
			}
		}
	}

/** Calls CFbsBitmap::HorizontalTwipsToPixels() */
void CT_DataFbsBitmap::DoCmdHorizontalTwipsToPixels(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::HorizontalTwipsToPixels()"));

	// get twips from parameters
	TInt	twips;
	if(!GetIntFromConfig(aSection, KTwips(), twips))
		{
		ERR_PRINTF2(_L("No %S"), &KTwips());
		SetBlockResult(EFail);
		}

	// call HorizontalTwipsToPixels()
	TInt	value = GetFbsBitmap()->HorizontalTwipsToPixels(twips);
	INFO_PRINTF2(_L("Pixels: %d"), value);

	// validate returned value if needed
	TInt	expectedValue;
	if(GetIntFromConfig(aSection, KExpectedInt(), expectedValue))
		{
		if (expectedValue != value)
			{
			ERR_PRINTF3(_L("The returned value is not as expected, expected: %d, actual: %d"), expectedValue, value);
			SetBlockResult(EFail);
			}
		}
	}

/** Checks CFbsBitmap::InitialDisplayMode() value */
void CT_DataFbsBitmap::DoCmdInitialDisplayMode(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Checks CFbsBitmap::InitialDisplayMode() value"));

	// call InitialDisplayMode()
	TInt	actualValue = GetFbsBitmap()->InitialDisplayMode();
	INFO_PRINTF2(_L("Initial Display Mode %d"), actualValue);

	// get display mode from parameters
	TDisplayMode	expectedValue;
	if ( CT_GraphicsUtil::ReadDisplayMode(*this, aSection, KDisplayMode(), expectedValue) )
		{
		// check value againts NULL
		if (actualValue != expectedValue)
			{
			ERR_PRINTF3(_L("The value is not as expected! expecyed: %d, actual: %d"), expectedValue, actualValue);
			SetBlockResult(EFail);
			}
		}
	}

/** Calls CFbsBitmap::InternalizeL() */
void CT_DataFbsBitmap::DoCmdInternalizeL(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::InternalizeL()"));

	// get file name from parameters
	TPtrC	fileName;
	if (!GetStringFromConfig(aSection, KFileName(), fileName))
		{
		ERR_PRINTF2(_L("No %S"), &KFileName());
		SetBlockResult(EFail);
		}

	// get a flag if to use closed stream from parameters
	TBool	useClosedStream = EFalse;
	if(!GetBoolFromConfig(aSection, KUseClosedStream(), useClosedStream))
		{
		ERR_PRINTF2(_L("No %S"), &KUseClosedStream());
		SetBlockResult(EFail);
		}

	// ReadStore creation
	CDirectFileStore*	readstore = CDirectFileStore::OpenL(FileServer(), fileName, EFileStream | EFileRead);
	CleanupStack::PushL(readstore);
	TInt				popCount=1;
	TStreamId			headerid = readstore->Root();
	RStoreReadStream	readstrm;

	// close stream if defined by parameters
	if (!useClosedStream)
		{
		readstrm.OpenL(*readstore, headerid);
		CleanupClosePushL(readstrm);
		popCount=2;
		}

	// call InternalizeL()
	TRAPD(err, GetFbsBitmap()->InternalizeL(readstrm));
	if (err != KErrNone)
		{
		ERR_PRINTF2(_L("Internalize error: %d"), err);
		SetError(err);
		}

	// cleanup
	CleanupStack::PopAndDestroy(popCount, readstore);
	}

/** Calls CFbsBitmap::IsCompressedInRAM() to check againt expected value */
void CT_DataFbsBitmap::DoCmdIsCompressedInRAM(const TDesC& aSection)
	{
	// call IsCompressedInRAM() to get actual value
	TBool	actualValue = GetFbsBitmap()->IsCompressedInRAM();
	INFO_PRINTF2(_L("CFbsBitmap::IsCompressedInRAM() %d"), actualValue);

	// get expected value from parameters
	TBool	expectedValue = EFalse;
	if ( GetBoolFromConfig(aSection, KExpectedBool(), expectedValue) )
		{
		if (actualValue != expectedValue)
			{
			ERR_PRINTF3(_L("Expected value doesn't match to actual! expected: %d, actual: %d"), expectedValue, actualValue);
			if (!iCompressFailed)
			    {
			    SetBlockResult(EFail);
			    };
			}
		}
	}

/** Calls CFbsBitmap::IsFileInRom() and check against expectation */
void CT_DataFbsBitmap::DoCmdIsFileInRom(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::IsFileInRom() and check against expectation"));

	// get file name from parameters

	TPtrC	fileName;
	if ( !GetStringFromConfig(aSection, KFileName(), fileName) )
		{
		ERR_PRINTF2(_L("No %S"), &KFileName());
		SetBlockResult(EFail);
		}

	// get flag if use RFile instance in Save() call from parameters
	TBool	useRFile = EFalse;
	GetBoolFromConfig(aSection, KUseRFile(), useRFile);

	TInt		err = KErrNone;
	TBool		isFileInRom = EFalse;
	TUint32*	addressInRom = NULL;
	if (useRFile)
		{
		// open rfile
		RFile file;
		err = file.Open(FileServer(), fileName, EFileShareReadersOnly);

		// check if failed to open file
		if ( err != KErrNone )
			{
			ERR_PRINTF2(_L("File open error: %d"), err);
			SetBlockResult(EFail);
			}
		else
			{
			// call IsFileInRom()
			isFileInRom = CFbsBitmap::IsFileInRom(file, addressInRom);

			// close rfile
			file.Close();
			}
		}
	else
		{
		isFileInRom = CFbsBitmap::IsFileInRom(fileName, addressInRom);
		}

	// get expected value if is in ROM from parameters
	TBool	expectedIsFileInRom = EFalse;
	if ( GetBoolFromConfig(aSection, KExpectedBool(), expectedIsFileInRom) )
		{
		// check the expectation
		if (expectedIsFileInRom != isFileInRom)
			{
			ERR_PRINTF3(_L("The value is not as expected! expected: %d, actual: %d"), expectedIsFileInRom, isFileInRom);
			SetBlockResult(EFail);
			}
		}

	// check that address is not null if in rom
	if ( isFileInRom && addressInRom == NULL )
		{
		ERR_PRINTF1(_L("The file is in ROM but returned address is NULL"));
		SetBlockResult(EFail);
		}
	}

/** Calls CFbsBitmap::IsLargeBitmap() */
void CT_DataFbsBitmap::DoCmdIsLargeBitmap(const TDesC& aSection)
	{
	// call IsLargeBitmap()
	TBool	value = GetFbsBitmap()->IsLargeBitmap();
	INFO_PRINTF2(_L("Is large bitmap: %d"), value);
	
	// validate returned value if needed
	TBool	expectedBool;
	if(GetIntFromConfig(aSection, KExpectedBool(), expectedBool))
		{
		if (expectedBool != value)
			{
			ERR_PRINTF3(_L("The returned value is not as expected, expected: %d, actual: %d"), expectedBool, value);
			SetBlockResult(EFail);
			}
		}
	}

/** Calls CFbsBitmap::IsMonochrome() */
void CT_DataFbsBitmap::DoCmdIsMonochrome(const TDesC& aSection)
	{

	// call IsMonochrome()
	TBool	value = GetFbsBitmap()->IsMonochrome();
	INFO_PRINTF2(_L("Is monochrome: %d"), value);

	// validate returned value if needed
	TBool	expectedBool;
	if(GetIntFromConfig(aSection, KExpectedBool(), expectedBool))
		{
		if (expectedBool != value)
			{
			ERR_PRINTF3(_L("The returned value is not as expected, expected: %d, actual: %d"), expectedBool, value);
			SetBlockResult(EFail);
			}
		}
	}

/** Calls CFbsBitmap::IsRomBitmap() and check against expectation */
void CT_DataFbsBitmap::DoCmdIsRomBitmap(const TDesC& aSection)
	{
	// call IsRomBitmap()
	TBool	actualValue = GetFbsBitmap()->IsRomBitmap();
	INFO_PRINTF2(_L("CFbsBitmap::IsRomBitmap() %d"), actualValue);

	// get expected value if is in ROM from parameters
	TBool	expectedIsRomBitmap = EFalse;
	if ( GetBoolFromConfig(aSection, KExpectedBool(), expectedIsRomBitmap) )
		{
		// check the expectation
		if (expectedIsRomBitmap != actualValue)
			{
			ERR_PRINTF3(_L("The value is not as expected! expected: %d, actual: %d"), expectedIsRomBitmap, actualValue);
			SetBlockResult(EFail);
			}
		}
	}

/** CFbsBitmap::Load() Call */
void CT_DataFbsBitmap::DoCmdLoadL(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("CFbsBitmap::Load() Call"));
	LoadOrLoadAndCompressL(aSection, EFalse);
	}

/** CFbsBitmap::LoadAndCompress() Call */
void CT_DataFbsBitmap::DoCmdLoadAndCompressL(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("CFbsBitmap::LoadAndCompress() Call"));
	LoadOrLoadAndCompressL(aSection, ETrue);
	}

/** Calls static CFbsBitmap destructor */
void CT_DataFbsBitmap::DoCmdLockHeap(const TDesC& aSection)
	{
	TBool	always=EFalse;
	GetBoolFromConfig(aSection, KAlways(), always);
	GetFbsBitmap()->LockHeap(always);
	}

/** Calls static CFbsBitmap destructor */
void CT_DataFbsBitmap::DoCmdLockHeapLC(const TDesC& aSection)
	{
	TBool	always=EFalse;
	GetBoolFromConfig(aSection, KAlways(), always);

	GetFbsBitmap()->LockHeapLC(always);
	iPopWhenUnlocking=ETrue;
	}

/** Calls CFbsBitmap::PaletteAttributes() */
void CT_DataFbsBitmap::DoCmdPaletteAttributes(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::PaletteAttributes()"));

	// call PaletteAttributes()
	TBool	modifiable;
	TInt	entries;
	GetFbsBitmap()->PaletteAttributes(modifiable, entries);

	INFO_PRINTF3(_L("Modifiable: %d, Number of entries: %d"), modifiable, entries);

	// validate returned value if needed
	TBool	expectedModifiable;
	if(GetBoolFromConfig(aSection, KModifiable(), expectedModifiable))
		{
		if (expectedModifiable != modifiable)
			{
			ERR_PRINTF3(_L("The returned modifaiable value is not as expected, expected: %d, actual: %d"), expectedModifiable, modifiable);
			SetBlockResult(EFail);
			}
		}

	// validate returned value if needed
	TBool	expectedEntries;
	if(GetIntFromConfig(aSection, KEntries(), expectedEntries))
		{
		if (expectedEntries != entries)
			{
			ERR_PRINTF3(_L("The returned modifaiable value is not as expected, expected: %d, actual: %d"), expectedEntries, entries);
			SetBlockResult(EFail);
			}
		}
	}

/** Calls CFbsBitmap::Reset() */
void CT_DataFbsBitmap::DoCmdReset()
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::Reset()"));

	// call Reset()
	GetFbsBitmap()->Reset();
	}

/** Calls CFbsBitmap::Resize() */
void CT_DataFbsBitmap::DoCmdResize(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::Resize()"));

	// get size height from parameters
	TInt	height;
	if(!GetIntFromConfig(aSection, KHeight(), height))
		{
		ERR_PRINTF2(_L("No %S"), &KHeight());
		SetBlockResult(EFail);
		}

	// get size width from parameters
	TInt	width;
	if(!GetIntFromConfig(aSection, KWidth(), width))
		{
		ERR_PRINTF2(_L("No %S"), &KWidth());
		SetBlockResult(EFail);
		}

	// call Resize()
	TInt	err = GetFbsBitmap()->Resize(TSize(width, height));

	// check error code
	if (err != KErrNone)
		{
		ERR_PRINTF2(_L("Resize error: %d"), err);
		SetError(err);
		}
	}

/** Calls CFbsBitmap::Save() */
void CT_DataFbsBitmap::DoCmdSave(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::Save()"));

	// get file name from parameters
	TPtrC	fileName;
	if (!GetStringFromConfig(aSection, KFileName(), fileName))
		{
		ERR_PRINTF2(_L("No %S"), &KFileName());
		SetBlockResult(EFail);
		}

	// get flag if use RFile instance in Save() call from parameters
	TBool	useRFile = EFalse;
	if(!GetBoolFromConfig(aSection, KUseRFile(), useRFile))
		{
		ERR_PRINTF2(_L("No %S"), &KUseRFile());
		SetBlockResult(EFail);
		}

	// get flag if use RFile instance in Load() call from parameters
	TBool	useClosedRFile = EFalse;
	if(GetBoolFromConfig(aSection, KUseClosedRFile(), useClosedRFile))
		{
		if (useClosedRFile && !useRFile)
			{
			ERR_PRINTF3(_L("Cannot use %S parameter if %S is not set to TRUE"), &KUseClosedRFile(), &KUseRFile());
			SetBlockResult(EFail);
			}
		}

	TInt	err = KErrNone;
	if (useRFile)
		{
		// required to allow file handle to be adopted by another process
		FileServer().ShareProtected();

		// open or create rfile
		RFile	file;

		if (!useClosedRFile)
			{
			err = file.Open(FileServer(), fileName, EFileWrite);

			if (err == KErrNotFound)
				{
				err = file.Create(FileServer(), fileName, EFileWrite);

				// check if failed to create file
				if (err != KErrNone)
					{
					ERR_PRINTF2(_L("File create error: %d"), err);
					SetBlockResult(EFail);
					}
				}
			else if (err != KErrNone)
				{
				// if failed to open file
				ERR_PRINTF2(_L("File open error: %d"), err);
				SetBlockResult(EFail);
				}
			}

		// call Save()
		err = GetFbsBitmap()->Save(file);

		// close rfile
		file.Close();
		}
	else
		{
		err = GetFbsBitmap()->Save(fileName);
		}

	// check error code
	if (err != KErrNone)
		{
		ERR_PRINTF2(_L("Save error: %d"), err);
		SetError(err);
		}
	}

/** Calls CFbsBitmap::ScanLineLength() */
void CT_DataFbsBitmap::DoCmdScanLineLength(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::ScanLineLength()"));

	// get length from parameters
	TInt length = 0;
	if(!GetIntFromConfig(aSection, KLength(), length))
		{
		ERR_PRINTF2(_L("No %S"), &KLength());
		SetBlockResult(EFail);
		}

	// get display mode from parameters
	TDisplayMode	displayMode;
	if ( !CT_GraphicsUtil::ReadDisplayMode(*this, aSection, KDisplayMode(), displayMode) )
		{
		ERR_PRINTF1(_L("No display mode"));
		SetBlockResult(EFail);
		}
	else
		{
		TInt actualValue = CFbsBitmap::ScanLineLength(length, displayMode);
		INFO_PRINTF2(_L("CFbsBitmap::ScanLineLength() %d"), actualValue);
	
		TInt expectedValue = 0;
		if ( GetIntFromConfig(aSection, KExpectedInt(), expectedValue) )
			{
			if (actualValue != expectedValue)
				{
				ERR_PRINTF3(_L("Expected value doesn't match to actual! expected: %d, actual: %d"), expectedValue, actualValue);
				SetBlockResult(EFail);
				}
			}
		}
	}

/** Calls CFbsBitmap::SetDisplayMode() */
void CT_DataFbsBitmap::DoCmdSetDisplayMode(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::SetDisplayMode()"));

	// get display mode from parameters
	TDisplayMode	displayMode;
	if ( !CT_GraphicsUtil::ReadDisplayMode(*this, aSection, KDisplayMode(), displayMode) )
		{
		ERR_PRINTF1(_L("No display mode"));
		SetBlockResult(EFail);
		}
	else
		{
		// call SetDisplayMode()
		TInt	err = GetFbsBitmap()->SetDisplayMode(displayMode);

		// check error code
		if (err != KErrNone)
			{
			ERR_PRINTF2(_L("Set display mode error: %d"), err);
			SetError(err);
			}
		}
	}

/** Calls CFbsBitmap::SetPalette() by previously created palette */
void CT_DataFbsBitmap::DoCmdSetPaletteL(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::SetPalette() by previously created palette"));

	// get CPalette object passed as a parameter
	CPalette*	palette = NULL;

	CT_GraphicsUtil::GetPaletteL(*this, aSection, KPalette(), palette);

	// call SetPalette()
	GetFbsBitmap()->SetPalette(palette);
	}

/** Calls CFbsBitmap::SetRomBitmapL() by another bitmap */
void CT_DataFbsBitmap::DoCmdSetRomBitmapL(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::SetRomBitmapL() by another bitmap"));

	// get fbsBitmap passed as a parameter
	CFbsBitmap*		otherFbsBitmap=NULL;

	CT_GraphicsUtil::GetFbsBitmapL(*this, aSection, KFbsBitmapName(), otherFbsBitmap);

	// get romPointer. If the bitmap is ROM bitmap then Handle() returns ROM pointer
	CBitwiseBitmap*	bitmapRomAddress=NULL;
	if ( otherFbsBitmap!=NULL )
		{
		bitmapRomAddress=REINTERPRET_CAST(CBitwiseBitmap*, otherFbsBitmap->Handle());
		}

	// call SetRomBitmapL()
	TInt	bitmapSizeInBytes=0;
	TRAPD(err, GetFbsBitmap()->SetRomBitmapL(bitmapRomAddress, bitmapSizeInBytes));

	// check error code
	if (err != KErrNone)
		{
		ERR_PRINTF2(_L("Set ROM bitmap error: %d"), err);
		SetError(err);
		}
	}

/** Calls CFbsBitmap::SetScanLine() */
void CT_DataFbsBitmap::DoCmdSetScanLineL(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::SetScanLine()"));

	// get scanline coordinate from parameters
	TInt	coordinate = 0;
	if(!GetIntFromConfig(aSection, KScanLineCoord(), coordinate))
		{
		ERR_PRINTF2(_L("No %S"), &KScanLineCoord());
		SetBlockResult(EFail);
		}

	// get file name from parameters
	TPtrC	fileName;
	if (!GetStringFromConfig(aSection, KFileName(), fileName))
		{
		ERR_PRINTF2(_L("No %S"), &KFileName());
		SetBlockResult(EFail);
		}

	// open file
	RFile	file;
	User::LeaveIfError(file.Open(FileServer(), fileName, EFileRead | EFileShareAny));
	CleanupClosePushL(file);

	// get size
	TInt	size = 0;
	User::LeaveIfError(file.Size(size));

	// read file
    HBufC8*	fileDataBuff = HBufC8::NewLC(size);
    TPtr8	fileData = fileDataBuff->Des();

	User::LeaveIfError(file.Read(fileData));

	GetFbsBitmap()->SetScanLine(fileData, coordinate);

    CleanupStack::PopAndDestroy(2, &file);  // fileDataBuff, file
	}

/** Calls CFbsBitmap::SetSizeInTwips() by size parameter */
void CT_DataFbsBitmap::DoCmdSetSizeInTwipsL(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::SetSizeInTwips()"));

	// get if to NULL device pointer flag from parameters
	TPtrC	device;
	if ( GetStringFromConfig(aSection, KDevice(), device) )
		{
		CFbsBitmapDevice*	bitmapDevice=static_cast<CFbsBitmapDevice*>(GetDataObjectL(device));
		GetFbsBitmap()->SetSizeInTwips(bitmapDevice);
		}
	else
		{
		// get size height from parameters
		TInt	height;
		if(!GetIntFromConfig(aSection, KHeight(), height))
			{
			ERR_PRINTF2(_L("No %S"), &KHeight());
			SetBlockResult(EFail);
			}

		// get size width from parameters
		TInt	width;
		if(!GetIntFromConfig(aSection, KWidth(), width))
			{
			ERR_PRINTF2(_L("No %S"), &KWidth());
			SetBlockResult(EFail);
			}

		// call SetSizeInTwips()
		GetFbsBitmap()->SetSizeInTwips(TSize(width, height));
		}
	}

/** Calls CFbsBitmap::SizeInPixels() and checks the size */
void CT_DataFbsBitmap::DoCmdSizeInPixels(const TDesC& aSection)
	{
	// call SizeInTwips()
	TSize	actualSize = GetFbsBitmap()->SizeInPixels();
	INFO_PRINTF3(_L("CFbsBitmap::SizeInPixels() height %d, width %d"), actualSize.iHeight, actualSize.iWidth);

	// get size height from parameters
	TInt	height;
	if ( GetIntFromConfig(aSection, KHeight(), height) )
		{
		if ( actualSize.iHeight != height )
			{
			ERR_PRINTF3(_L("Height mismatch expected: %d, actual: %d"), height, actualSize.iHeight);
			SetBlockResult(EFail);
			}
		}

	// get size width from parameters
	TInt	width;
	if ( GetIntFromConfig(aSection, KWidth(), width) )
		{
		// check that value is as expected
		if ( actualSize.iWidth != width )
			{
			ERR_PRINTF3(_L("Width mismatch expected: %d, actual: %d"), width, actualSize.iWidth);
			SetBlockResult(EFail);
			}
		}
	}

/** Calls CFbsBitmap::SizeInTwips() and compares the result with expected */
void CT_DataFbsBitmap::DoCmdSizeInTwips(const TDesC& aSection)
	{
	// call SizeInTwips()
	TSize	actualSize = GetFbsBitmap()->SizeInTwips();
	INFO_PRINTF3(_L("CFbsBitmap::SizeInTwips() height %d, width %d"), actualSize.iHeight, actualSize.iWidth);

	// get size height from parameters
	TInt	height;
	if ( GetIntFromConfig(aSection, KHeight(), height) )
		{
		if ( actualSize.iHeight != height )
			{
			ERR_PRINTF3(_L("Height mismatch expected: %d, actual: %d"), height, actualSize.iHeight);
			SetBlockResult(EFail);
			}
		}

	// get size width from parameters
	TInt	width;
	if ( GetIntFromConfig(aSection, KWidth(), width) )
		{
		// check that value is as expected
		if ( actualSize.iWidth != width )
			{
			ERR_PRINTF3(_L("Width mismatch expected: %d, actual: %d"), width, actualSize.iWidth);
			SetBlockResult(EFail);
			}
		}
	}

/** Calls CFbsBitmap::StoreL() */
void CT_DataFbsBitmap::DoCmdStoreL(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::StoreL()"));

	TInt	numberOfFiles = 0;
	TInt	numberOfBitmapIds = 0;
	TPtrC	sourceFileName1;
	TPtrC	sourceFileName2;
	TInt	sourceBitmapId0 = -1;
	TInt	sourceBitmapId1 = -1;
	TInt	sourceBitmapId2 = -1;

	// get file name from parameters
	TPtrC	fileName;
	if (!GetStringFromConfig(aSection, KFileName(), fileName))
		{
		ERR_PRINTF2(_L("No %S"), &KFileName());
		SetBlockResult(EFail);
		}

	// get flag if use RFile instance in Save() call from parameters
	TBool	useRFile = EFalse;
	if(!GetBoolFromConfig(aSection, KUseRFile(), useRFile))
		{
		ERR_PRINTF2(_L("No %S"), &KUseRFile());
		SetBlockResult(EFail);
		}

	// get flag if use RFile instance in Load() call from parameters
	TBool	useClosedRFile = EFalse;
	if(GetBoolFromConfig(aSection, KUseClosedRFile(), useClosedRFile))
		{
		if (useClosedRFile && !useRFile)
			{
			ERR_PRINTF3(_L("Cannot use %S parameter if %S is not set to TRUE"), &KUseClosedRFile(), &KUseRFile());
			SetBlockResult(EFail);
			}
		}

	// get up to 3 source file names from parameters
	TPtrC	sourceFileName0;
	if (GetStringFromConfig(aSection, KSourceFileName0(), sourceFileName0))
		{
		numberOfFiles++;
		if (GetStringFromConfig(aSection, KSourceFileName1(), sourceFileName1))
			{
			numberOfFiles++;
			if (GetStringFromConfig(aSection, KSourceFileName2(), sourceFileName2))
				{
				numberOfFiles++;
				}
			}
		}

	// get up to 3 source bitmap ids from parameters
	if (GetIntFromConfig(aSection, KSourceBitmapId0(), sourceBitmapId0))
		{
		numberOfBitmapIds++;
		if (GetIntFromConfig(aSection, KSourceBitmapId1(), sourceBitmapId1))
			{
			numberOfBitmapIds++;
			if (GetIntFromConfig(aSection, KSourceBitmapId2(), sourceBitmapId2))
				{
				numberOfBitmapIds++;
				}
			}
		}

	// get number of sources argument from parameters
	TInt	numberOfSources;
	if(!GetIntFromConfig(aSection, KNumberOfSources(), numberOfSources))
		{
		ERR_PRINTF2(_L("No %S"), &KNumberOfSources());
		SetBlockResult(EFail);
		}

	// create array of file names
 	TFileName** sourceFiles = new (ELeave) TFileName*[numberOfFiles];
 	CleanupStack::PushL(sourceFiles);
	if (numberOfFiles > 0) sourceFiles[0] = new (ELeave) TFileName(sourceFileName0);
	if (numberOfFiles > 1) sourceFiles[1] = new (ELeave) TFileName(sourceFileName1);
	if (numberOfFiles > 2) sourceFiles[2] = new (ELeave) TFileName(sourceFileName2);

	// create array of bitmap ids
	TInt32* bitmapIds = new (ELeave) TInt32[numberOfBitmapIds];
	CleanupStack::PushL(bitmapIds);

	if (numberOfBitmapIds > 0) bitmapIds[0] = sourceBitmapId0;
	if (numberOfBitmapIds > 1) bitmapIds[1] = sourceBitmapId1;
	if (numberOfBitmapIds > 2) bitmapIds[2] = sourceBitmapId2;

	TInt err = KErrNone;
	if (useRFile)
		{
		// required to allow file handle to be adopted by another process
		FileServer().ShareProtected();

		// open rfile
		TBool	openSuccess = EFalse;

		RFile file;
		err = file.Open(FileServer(), fileName, EFileWrite);

		// check if ok, if not fount => try to create new file
		if (err == KErrNone)
			{
			openSuccess = ETrue;
			}
		else if (err == KErrNotFound)
			{
			INFO_PRINTF1(_L("File doesn't exist, trying to create it."));

			err = file.Create(FileServer(), fileName, EFileWrite);

			// check if failed to create file
			if (err == KErrNone)
				{
				openSuccess = ETrue;
				}
			else
				{
				ERR_PRINTF2(_L("File create error: %d"), err);
				SetBlockResult(EFail);
				}
			}
		else
			{
			ERR_PRINTF2(_L("File open error: %d"), err);
			SetBlockResult(EFail);
			}

		// if ok => do store
		if (openSuccess)
			{
			// if we use invalid RFile handle in our test
			if (useClosedRFile)
				{
				file.Close();
				}

			// call StoreL()
			TRAP(err, CFbsBitmap::StoreL(file, numberOfSources, (const TDesC**) sourceFiles, bitmapIds));

			// check error code
			if (err != KErrNone)
				{
				ERR_PRINTF2(_L("Store error: %d"), err);
				SetError(err);
				}

			// close rfile
			file.Close();
			}
		}
	else
		{
		// call StoreL()
		TRAP(err, CFbsBitmap::StoreL(fileName, numberOfSources, (const TDesC**) sourceFiles, bitmapIds));

		// check error code
		if (err != KErrNone)
			{
			ERR_PRINTF2(_L("Store error: %d"), err);
			SetError(err);
			}
		}

 	// Iterate over the file name pointer array and cleanup
 	for (TInt i = 0; i < numberOfFiles; ++i)
 		{
		delete sourceFiles[i];
   		}

 	// Cleanup the arrays allocated on the heap
 	CleanupStack::PopAndDestroy(2, sourceFiles);
	}

/** Calls CFbsBitmap::SwapWidthAndHeight() */
void CT_DataFbsBitmap::DoCmdSwapWidthAndHeight()
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::SwapWidthAndHeight()"));

	// call SwapWidthAndHeight()
	TInt	err = GetFbsBitmap()->SwapWidthAndHeight();

	// check error code
	if (err != KErrNone)
		{
		ERR_PRINTF2(_L("Swap width and height error: %d"), err);
		SetError(err);
		}
	}

/** Calls static CFbsBitmap destructor */
void CT_DataFbsBitmap::DoCmdUnlockHeapL(const TDesC& aSection)
	{

	CFbsBitmap*	bitmap=NULL;
	if ( CT_GraphicsUtil::GetFbsBitmapL(*this, aSection, KFbsBitmapName(), bitmap) )
		{
		CFbsBitmap::UnlockHeap(bitmap);
		}
	else
		{
		TBool	always=EFalse;
		GetBoolFromConfig(aSection, KAlways(), always);

		GetFbsBitmap()->UnlockHeap(always);
		}

	if ( iPopWhenUnlocking )
		{
		iPopWhenUnlocking=EFalse;
		CleanupStack::Pop();
		}
	}

/** Calls CFbsBitmap::VerticalPixelsToTwips() */
void CT_DataFbsBitmap::DoCmdVerticalPixelsToTwips(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::VerticalPixelsToTwips()"));

	// get pixels from parameters
	TInt	pixels;
	if(!GetIntFromConfig(aSection, KPixels(), pixels))
		{
		ERR_PRINTF2(_L("No %S"), &KPixels());
		SetBlockResult(EFail);
		}

	// call VerticalPixelsToTwips()
	TInt	value = GetFbsBitmap()->VerticalPixelsToTwips(pixels);
	INFO_PRINTF2(_L("Twips: %d"), value);

	// validate returned value if needed
	TInt	expectedValue;
	if(GetIntFromConfig(aSection, KExpectedInt(), expectedValue))
		{
		if (expectedValue != value)
			{
			ERR_PRINTF3(_L("The returned value is not as expected, expected: %d, actual: %d"), expectedValue, value);
			SetBlockResult(EFail);
			}
		}
	}

/** Calls CFbsBitmap::VerticalTwipsToPixels() */
void CT_DataFbsBitmap::DoCmdVerticalTwipsToPixels(const TDesC& aSection)
	{
	INFO_PRINTF1(_L("Calls CFbsBitmap::VerticalTwipsToPixels()"));

	// get twips from parameters
	TInt	twips;
	if(!GetIntFromConfig(aSection, KTwips(), twips))
		{
		ERR_PRINTF2(_L("No %S"), &KTwips());
		SetBlockResult(EFail);
		}

	// call VerticalTwipsToPixels()
	TInt	value = GetFbsBitmap()->VerticalTwipsToPixels(twips);
	INFO_PRINTF2(_L("Pixels: %d"), value);

	// validate returned value if needed
	TInt expectedValue;
	if(GetIntFromConfig(aSection, KExpectedInt(), expectedValue))
		{
		if (expectedValue != value)
			{
			ERR_PRINTF3(_L("The returned value is not as expected, expected: %d, actual: %d"), expectedValue, value);
			SetBlockResult(EFail);
			}
		}
	}

/** Calls CFbsBitmap::ExternalizeL() or CFbsBitmap::ExternalizeRectangleL(). Used by DoCmdExternalize() and DoCmdExternalizeRectangle() methods */
void CT_DataFbsBitmap::ExternalizeImplL(const TDesC& aSection, const TRect& aRect, TBool aUseRect)
	{
	// get file name from parameters
	TPtrC	fileName;
	if (!GetStringFromConfig(aSection, KFileName(), fileName))
		{
		ERR_PRINTF2(_L("No %S"), &KFileName());
		SetBlockResult(EFail);
		}

	// get a flag if to use closed stream from parameters
	TBool	useClosedStream = EFalse;
	if(!GetBoolFromConfig(aSection, KUseClosedStream(), useClosedStream))
		{
		ERR_PRINTF2(_L("No %S"), &KUseClosedStream());
		SetBlockResult(EFail);
		}

	// create write store
	CDirectFileStore*	writestore = CDirectFileStore::ReplaceL(FileServer(), fileName, EFileStream | EFileWrite);
	CleanupStack::PushL(writestore);
	TInt				popCount=1;
	TUidType 			uidtype(KDirectFileStoreLayoutUid, KMultiBitmapFileImageUid);

	writestore->SetTypeL(uidtype);

	// create write stream
	RStoreWriteStream	writestrm;

	// close stream set by parameters
	if (!useClosedStream)
		{
		TStreamId	headerid=writestrm.CreateL(*writestore);
		CleanupClosePushL(writestrm);

		++popCount;
		writestore->SetRootL(headerid);
		}

	if (aUseRect)
		{
		// call ExternalizeRectangleL()
		TRAPD(err, GetFbsBitmap()->ExternalizeRectangleL(writestrm, aRect));
		if (err != KErrNone)
			{
			ERR_PRINTF2(_L("Externalize rectangle error: %d"), err);
			SetError(err);
			}
		}
	else
		{
		// call ExternalizaL()
		TRAPD(err, GetFbsBitmap()->ExternalizeL(writestrm));
		if (err != KErrNone)
			{
			ERR_PRINTF2(_L("Externalize error: %d"), err);
			SetError(err);
			}
		}

	// cleanup
	CleanupStack::PopAndDestroy(popCount, writestore);
	}

/** Calls CFbsBitmap::Load() or CFbsBitmap::LoadAndCompress(). Used by DoCmdLoad() and DoCmdLoadAndCompress() methods */
void CT_DataFbsBitmap::LoadOrLoadAndCompressL(const TDesC& aSection, TBool aCompress)
	{

	// get bitmap id from parameters
	TInt	bitmapId;
	if(!GetIntFromConfig(aSection, KBitmapId(), bitmapId))
		{
		ERR_PRINTF2(_L("No %S"), &KBitmapId());
		SetBlockResult(EFail);
		}

	// get file name from parameters
	TPtrC	fileName;
	if (!GetStringFromConfig(aSection, KFileName(), fileName))
		{
		ERR_PRINTF2(_L("No %S"), &KFileName());
		SetBlockResult(EFail);
		}

	// get file offset from parameters
	TInt	fileOffset;
	TBool	useOffset = GetIntFromConfig(aSection, KFileOffset(), fileOffset);

	// get share if loaded from parameters
	TBool	shareIfLoaded = EFalse;
	GetBoolFromConfig(aSection, KShareIfLoaded(), shareIfLoaded);

	// get flag if use RFile instance in Load() call from parameters
	TBool	useRFile = EFalse;
	GetBoolFromConfig(aSection, KUseRFile(), useRFile);

	// get flag if use RFile instance in Load() call from parameters
	TBool	useClosedRFile = EFalse;
	GetBoolFromConfig(aSection, KUseClosedRFile(), useClosedRFile);

	if (useClosedRFile && !useRFile)
		{
		ERR_PRINTF3(_L("Cannot use %S parameter if %S is not set to TRUE"), &KUseClosedRFile(), &KUseRFile());
		SetBlockResult(EFail);
		}

	// load bitmap
	TInt	err = KErrNone;
	if (useRFile)
		{
		// required to allow file handle to be adopted by another process
		FileServer().ShareProtected();

		// open rfile
		RFile	file;

		// if we use invalid RFile handle in our test
		if (!useClosedRFile)
			{
			User::LeaveIfError(file.Open(FileServer(), fileName, EFileShareReadersOnly));
			CleanupClosePushL(file);
			}

		// do load
		if (aCompress)
			{
			if (useOffset)
				{
				err = GetFbsBitmap()->LoadAndCompress(file, bitmapId, shareIfLoaded, fileOffset);
				}
			else
				{
				err = GetFbsBitmap()->LoadAndCompress(file, bitmapId, shareIfLoaded);
				}
			}
		else
			{
			if (useOffset)
				{
				err = GetFbsBitmap()->Load(file, bitmapId, shareIfLoaded, fileOffset);
				}
			else
				{
				err = GetFbsBitmap()->Load(file, bitmapId, shareIfLoaded);
				}
			}

		if (!useClosedRFile)
			{
			CleanupStack::PopAndDestroy(&file);
			}
		}
	else
		{
		if (aCompress)
			{
			if (useOffset)
				{
				err = GetFbsBitmap()->LoadAndCompress(fileName, bitmapId, shareIfLoaded, fileOffset);
				}
			else
				{
				err = GetFbsBitmap()->LoadAndCompress(fileName, bitmapId, shareIfLoaded);
				}
			}
		else
			{
			if (useOffset)
				{
				err = GetFbsBitmap()->Load(fileName, bitmapId, shareIfLoaded, fileOffset);
				}
			else
				{
				err = GetFbsBitmap()->Load(fileName, bitmapId, shareIfLoaded);
				}
			}
		}

	// check error code
	if (err != KErrNone)
		{
		ERR_PRINTF2(_L("Load error: %d"), err);
		SetError(err);
		}
	}

/**
 Virtual RunL - Called on completion of an asynchronous command
 @see MTPActiveCallback
 @param aActive Active Object that RunL has been called on
 @pre N/A
 @post N/A
 @leave system wide error code
*/
void CT_DataFbsBitmap::RunL(CActive* aActive, const TInt aIndex)
	{
	if ( aActive==iActiveCompressInBackground )
		{
		RunCompressInBackground(aIndex);
		}
	else
		{
		ERR_PRINTF1(_L("Stray signal"));
		SetBlockResult(EFail);
		}
	DecOutstanding();
	}

/**
 Virtual DoCancel - Request to cancel the asynchronous command
 @see - MTPActiveCallback
 @param aActive Active Object that DoCancel has been called on
 @pre - N/A
 @post - N/A
 @leave system wide error code
*/
void CT_DataFbsBitmap::DoCancel(CActive* aActive, const TInt aIndex)
	{
	if ( aActive==iActiveCompressInBackground )
		{
		DoCancelCompressInBackground(aIndex);
		}
	else
		{
		ERR_PRINTF1(_L("Stray signal"));
		SetBlockResult(EFail);
		}
	DecOutstanding();
	}

void CT_DataFbsBitmap::RunCompressInBackground(const TInt aIndex)
	{
	TInt	err=iActiveCompressInBackground->iStatus.Int();
	INFO_PRINTF2(_L("RunCompressInBackground %d"), err);
	if ( err!=KErrNone )
		{
		ERR_PRINTF2(_L("RunL Error %d"), err);
		SetAsyncError(aIndex, err);
		}
	}

void CT_DataFbsBitmap::DoCancelCompressInBackground(const TInt /*aIndex*/)
	{
	}