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


const TInt KNumSecondaryClients=3;


class CBenchMarker : public CBase, public MIdleFindObserver
	{
public:
	CBenchMarker();
	~CBenchMarker();
	void ConstructL(const TDesC& aCommandLine);
	void RunL();
private:
	enum TTest
		{
		EOpenNewDb,
		ECreateSecondaryClients,
		EAddContacts,
		ECompactDb,
		EAddAndCompact,
		EGetSortedItems,
		ELogContactSummary,
		ELogContactSummaryFast,
		EOpenRContactView,
		ESetSortOrderOfRContactView,
		EGetSortOrderOfRContactView,
		ELogContactSummaryWithRContactView,
		ELogContactSummaryFastWithRContactView,
		EFindWithRContactView,
		ECloseRContactView,
		EFindFromLargeFieldSetSuceed,
		EFindFromLargeFieldSetFail,
		EFindFromSmallFieldSetSuceed,
		EFindFromSmallFieldSetFail,
		EFindPhoneNumberSuceed,
		EFindPhoneNumberFail,
		EFindEmailAddressSuceed,
		EFindEmailAddressFail,
		EFindAsyncFromLargeFieldSet,
		EFindAsyncFromSmallFieldSet,
		ECloseDb,
		ECloseSecondaryClients,
		EOpenExistingDb,
		EMultiClientSort,
		ENumTests
		};
private: // From MIdleFindObserver.
	void IdleFindCallback();
private:
	void DecodeCommandLineL(const TDesC& aCommandLine);
	void PrepareLogL();
	TInt DoTestL(TTest aTest);
	void StartProfile();
	TReal EndProfile();
	void StartAverageProfile();
	void UpdateAverageProfile(TInt aNumIterations);
	TReal EndAverageProfile();
	TReal AddContactsL();
	TReal AddContactsCompactL();
	void LogContactSummaryL(TBool aFaster);
	void LogContactSummaryFromRContactViewL(TBool aFaster);
	void LogContactSummaryL(TBool aFaster,TContactItemId aContactItemId);
	void DoSortL();
	void OpenRContactViewL();
	void SetSortOrderOfRContactViewL();
	void GetSortOrderOfRContactViewL();
	void FindInRContactViewL();
	void FindFromLargeFieldSetL(const TDesC& aTextToFind);
	void FindFromSmallFieldSetL(const TDesC& aTextToFind);
	void FindPhoneNumberL(const TDesC& aTextToFind);
	void FindMobilePhoneNumberL(const TDesC& aTextToFind);
	void FindEmailAddressL(const TDesC& aTextToFind);
	TReal FindAsyncFromLargeFieldSetL(const TDesC& aTextToFind);
	TReal FindAsyncFromSmallFieldSetL(const TDesC& aTextToFind);
	void DoFindL(const TDesC& aTextToFind,const CContactItemFieldDef& aFieldDef);
	TReal DoFindAsyncL(const TDesC& aTextToFind,const CContactItemFieldDef& aFieldDef);
	void CreateSecondaryClients();
	void CloseSecondaryClients();
	void CreateSortClients();
	void IncVisualCounter();
	void EndVisualCounter();
	TInt DbFileSize();
	void LogResult(TInt aMajorTestNum,TInt aMinorTestNum,const TDesC& aDescription,TInt aResult);
	void LogResult(TInt aMajorTestNum,TInt aMinorTestNum,const TDesC& aDescription,TReal aResult);
private:
	RFs iFs;
	RTest iTest;
	TFileName iLogFileName;
	TFileName iDbFileName;
	CLog* iLog;
	CContactDatabase* iDb;
	CRandomContactGenerator* iGenerator;
	const CContactIdArray* iSortedItems;
	CContactTextDef* iTextDef;
	CIdleFinder* iIdleFinder;
	TInt iVisualCounter;
	TReal iAverageProfileCounter;
	TInt iNumAverageProfiles;
	TBool iNoDataGenerationTests;
	TInt iNumTypicalContacts;
	TInt iNumAtypicalContacts;
	TInt iNumTypicalContactsCompact;
	TInt iNumAtypicalContactsCompact;
	RThread secondaryClient[KNumSecondaryClients];
#ifdef __USE_NEW_INTERFACES
	RContactView iSortedIdList;
#endif
	};


class TThreadCommandLine
	{
public:
	TThreadCommandLine(TRequestStatus* aInitialStatus,TRequestStatus* aCompletionStatus,const TDesC& aDbFileName,TBool aExitAfterSort)
		: iInitialStatus(aInitialStatus),iCompletionStatus(aCompletionStatus),iDbFileName(aDbFileName),iExitAfterSort(aExitAfterSort) {}
	RThread iOwningThread;
	TRequestStatus* iInitialStatus;
	TRequestStatus* iCompletionStatus;
	const TDesC& iDbFileName;
	TBool iExitAfterSort;
	};
