// 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:
// This contains CTestCaseCommDb which is the base class for all 
// the CommDb suite test cases
// 
//

#if (!defined __COMMDBTESTSTEP_H__)
#define __COMMDBTESTSTEP_H__

_LIT(KCommDbName, "C:\\private\\100012a5\\DBS_10004e1d_CDBV3.DAT");


class CTestSuite;
class CTestSuiteCommDb;
class CCommsDatabase;
class CCommsDbTableView;
class CCommsDbProtectTableView;
class CCommsDbProtectConnectPrefTableView;

NONSHARABLE_CLASS(CTestStepCommDb) : public CTestStep
{
public:
	CTestStepCommDb();
	~CTestStepCommDb();

	// pointer to suite which owns this test 
	CTestSuiteCommDb * iCommDbSuite;

	//Functions to set and clear the database objects that will
	//be used by test steps derived from this class.
	//This prevents the test steps from creating their own database objects
	void setRemoteDatabaseObjects( CCommsDatabase* aDb, CCommsDbTableView* aDbView );
	void clearRemoteDatabaseObjects();

	TInt executeStep( CTestStepCommDb& aTestStep );
	TInt executeStep( );
	virtual TInt executeStepL();
	TVerdict doTestStepPostambleL();
	TInt doTestStepWithHeapFailureL( CTestStepCommDb& aTestStep, TInt aReturnValue );
	TInt doTestStepWithHeapFailureDb( CTestStepCommDb& aTestStep, TInt aReturnValue );

	enum TDatabaseNumber
		{
		EDatabase_1,		//Records in ISP tables only
		EDatabase_7			//No records
		};
	TInt copyTestDatabase( TDatabaseNumber aDbNumber );
	TInt copyDatabaseToDefault( TDatabaseNumber aDbNumber );
	void copyFileL (const TDesC& anOld,const TDesC& aNew);
	void deleteFileL (const TDesC& aFileName);

	void DeleteCurrentDatabaseL();
	void CopyDatabaseL(const TDesC& aSource);


	//Pointers to the current database objects
	CCommsDatabase*		iTheDb;
	CCommsDbTableView*	iTheView;


protected:
	//Set by derived steps when local database objects have been allocated
	TBool	iLocalObjects;

	//Opens a database object and assigns it to iTheDb
	TBool openDbL();
	//Opens a database and a table view, assigns them to iTheDb and iTheView
	TBool openDbAndViewL( const TDesC16& aTable );
	//Releases any objects assigned to iTheDb and iTheView
	void popAndDestroyDatabaseObjects();

	TInt ChangeCPRankingL(CCommsDbProtectConnectPrefTableView* aTable, TUint32& Ranking);
	//Functions needed for Protection tests
	void    CheckTableIsProtectedL(CCommsDbProtectTableView* aTable);
	void    CheckTableIsNotProtectedL(CCommsDbProtectTableView* aTable);
	void    GoToPositionL(CCommsDbProtectTableView* aTable,TInt aPos);

	void    UpdateRecordL   (CCommsDbProtectTableView* aTable,TInt aResult);
	void    DeleteRecordL   (CCommsDbProtectTableView* aTable,TInt aResult);
	void    InsertRecordL   (CCommsDbProtectTableView* aTable,TInt aResult);
	void    ModifyRecordL   (CCommsDbProtectTableView* aTable);
	void    PopulateInsertedRecordL(CCommsDbProtectTableView* aTable);

	void    CheckTableIsProtectedL(CCommsDbProtectConnectPrefTableView* aTable);
	void    CheckTableIsNotProtectedL(CCommsDbProtectConnectPrefTableView* aTable);
	void    GoToPositionL(CCommsDbProtectConnectPrefTableView* aTable,TInt aPos);

	void    UpdateRecordL   (CCommsDbProtectConnectPrefTableView* aTable,TInt aResult);
	void    DeleteRecordL   (CCommsDbProtectConnectPrefTableView* aTable,TInt aResult);
	void    InsertRecordL   (CCommsDbProtectConnectPrefTableView* aTable,TInt aResult);
	void    ModifyRecordL   (CCommsDbProtectConnectPrefTableView* aTable);
	void    PopulateInsertedRecordL(CCommsDbProtectConnectPrefTableView* aTable);

	void    CheckRecordAccessL(CCommsDbProtectConnectPrefTableView* aTable, TInt aExpectedAccess);

	void    ProtectRecordL  (CCommsDbProtectTableView* aTable,TInt aResult);
	void    UnprotectRecordL(CCommsDbProtectTableView* aTable,TInt aResult);

    void    ProtectRecordL(CCommsDbProtectConnectPrefTableView* aTable, TInt aResult);
	void    UnprotectRecordL(CCommsDbProtectConnectPrefTableView* aTable,TInt aResult);


private:
	//Set when remote database object are in use
	TBool	iRemoteObjects;

};

#define CDBLEAVE( exp1, exp2 )			{	\
											TInt _r;	\
											_r = (exp1);  \
											if ( _r!=exp2 ) User::Leave(_r);\
										}

_LIT(KInvalidColumnName, "InvalidColumn");

#endif /* __COMMDBTESTSTEP_H__ */
