diff -r 000000000000 -r e686773b3f54 phonebookengines/contactsmodel/tsrc/Integration/CntPerfTest/src/TestContactViewDatabaseUtilitiesStep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines/contactsmodel/tsrc/Integration/CntPerfTest/src/TestContactViewDatabaseUtilitiesStep.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,355 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "TestContactViewDatabaseUtilitiesStep.h" + +/** + * Test Step Destructor + */ +CTestContactViewDatabaseUtilitiesStep::~CTestContactViewDatabaseUtilitiesStep() + { + if(iContactUtility) + { + delete iContactUtility; + } + if(iContactViewCollection) + { + delete iContactViewCollection; + } + if(iDb) + { + delete iDb; + } + if(iScheduler) + { + delete iScheduler; + } + } + +/** + * Test Step preamble function, setups the environment required for the test step + */ +TVerdict CTestContactViewDatabaseUtilitiesStep::doTestStepPreambleL() + { + iPimTestServer.Connect(); + CopyDatabaseL(); + InstallActiveSchedularL(); + OpenDataBaseL(); + SetupUtilityL(); + return TestStepResult(); + } + +/** + * Test Step postamble function, part of cleanup activity for the test step + */ +TVerdict CTestContactViewDatabaseUtilitiesStep::doTestStepPostambleL() + { + iPimTestServer.Close(); + CloseDatabaseL(); + UnInstallActiveSchedularL(); + return TestStepResult(); + } + + +/** + * Installs active schedular in the current thread + */ +void CTestContactViewDatabaseUtilitiesStep::InstallActiveSchedularL() + { + iScheduler = new (ELeave) CActiveScheduler; + CActiveScheduler::Install(iScheduler); + } + +/** + * Allocates necessary utility objects + */ +void CTestContactViewDatabaseUtilitiesStep::SetupUtilityL() + { + iContactViewCollection = CContactViewCollection::NewL(); + CTestStep* self = static_cast(this); + iContactUtility = CContactUtilitiesCollection::NewL(*self, DatabaseReference(), ViewCollectionReference()); + } + +/** + * Opens the desired database file based on ini data mentioned in the ini file + */ +void CTestContactViewDatabaseUtilitiesStep::OpenDataBaseL() + { + TBool createDataBase = EFalse; + TPtrC dbName; + GetBoolFromConfig(ConfigSection(), SharedConstants::KCreateDataBase, createDataBase); + GetStringFromConfig(ConfigSection(), SharedConstants::KDbName, dbName); + iDb = CreateAndOpenDataBaseL(dbName, createDataBase); + } + +/** + * Create or open the contact database + * @param aDbName database to be created/opened + * @return CContactDatabase* + */ +CContactDatabase* CTestContactViewDatabaseUtilitiesStep::CreateAndOpenDataBaseL(const TPtrC& aDbName, TBool aCreateDataBase) + { + HBufC* dbName = HBufC::NewLC(aDbName.Length()); + dbName->Des().Copy(aDbName); + CContactDatabase* cntDb = NULL; + if( aCreateDataBase ) + { + TInt err = 0; + // Replace the existing database and opens it + if( aDbName != KNullDesC() ) + { + TRAP(err, cntDb = CContactDatabase::ReplaceL(dbName->Des())); + } + else //if database name is not given then create and open the default DB + { + TRAP(err, cntDb = CContactDatabase::ReplaceL()); + } + + if( err != KErrNone ) + { + ERR_PRINTF2(KErrInCreateDataBase, err); + SetTestStepResult(EFail); + SetTestStepError(err); + } + } + else + { + TRAPD(err, cntDb = CContactDatabase::OpenL(dbName->Des())); + if( err != KErrNone ) + { + ERR_PRINTF2(KErrInOpen, err); + SetTestStepResult(EFail); + SetTestStepError(err); + } + } + CleanupStack::PopAndDestroy(dbName); + return cntDb; + } + +/** + * Constructs the desired contact views based on the data specified in the ini file + */ +void CTestContactViewDatabaseUtilitiesStep::ConstructViewsL() + { + TPtrC listOfViews; + GetStringFromConfig(ConfigSection(), SharedConstants::KListOfViews, listOfViews); + RArray sections; + CleanupClosePushL(sections); + iContactUtility->TokenizeStringL(listOfViews, sections); + iContactUtility->ConstructViewsL(sections); + CleanupStack::PopAndDestroy(§ions); + } + +/** + * Retrieves the desired contact view observer and listens for contact view notifications + * @param aEvent - A TContactViewEvent object that will be updated with the notification received + * @return TBool - An indication whether notification was received or not + */ +TBool CTestContactViewDatabaseUtilitiesStep::ListenForViewEventsL(TContactViewEvent& aEvent) + { + const TInt KNotificationTimeout = 10; // ms + TInt desiredViewIndex = 0; + _LIT(KDesiredViewIndex, "DesiredViewIndex"); + GetIntFromConfig(ConfigSection(), KDesiredViewIndex, desiredViewIndex); + + TPtrC desiredViewType; + _LIT(KDesiredViewType, "DesiredViewType"); + GetStringFromConfig(ConfigSection(), KDesiredViewType, desiredViewType); + + CContactViewEventQueue& contactViewObserver = + ViewCollectionReference().GetDesiredViewObserver(desiredViewType, desiredViewIndex); + + return (contactViewObserver.ListenForEvent(KNotificationTimeout,aEvent)); + } + +/* Here we are trying add blank groups in the database + * Say some 1000 thousand groups are added to the database + */ +void CTestContactViewDatabaseUtilitiesStep::AddGroupsInDatabaseL() + { + _LIT(KNumOfGroups, "numofgroups"); + TInt numOfGroups = 0; + GetIntFromConfig(ConfigSection(), KNumOfGroups, numOfGroups); + + for(TInt i = 0; i < numOfGroups; ++i) + { + CContactItem* contactGroup = DatabaseReference().CreateContactGroupL(); + delete contactGroup; + } + } + + +/* In this section, we edit the desired number of groups in the database + * Set label for them and associate them with desired number of groups + * With this database updation, group views can be constructed and accessed + */ +void CTestContactViewDatabaseUtilitiesStep::IterateThroAllGroupSectionsAndUpdateL() + { + _LIT(KListOfGroupsSectionsString, "listofgroupsections"); + TPtrC listOfGroupsSectionsString; + GetStringFromConfig(ConfigSection(), KListOfGroupsSectionsString, listOfGroupsSectionsString); + + RArray listOfGroupsSections; + CleanupClosePushL(listOfGroupsSections); + ViewUtilityReference().TokenizeStringL(listOfGroupsSectionsString, listOfGroupsSections); + + CCntFilter* filter = CCntFilter::NewL(); + CleanupStack::PushL(filter); + filter->SetContactFilterTypeGroup(ETrue); + DatabaseReference().FilterDatabaseL(*filter); + + for ( TInt i = 0; i < listOfGroupsSections.Count(); ++i ) + { + CContactIdArray* idArray = filter->iIds; + TContactItemId groupId = (*idArray)[i]; + CContactItem* group = DatabaseReference().OpenContactL(groupId); + CleanupStack::PushL(group); + CContactGroup* newGroup = static_cast(group); + UpdateGroupsL(listOfGroupsSections[i], *newGroup); + DatabaseReference().CommitContactL(*group); + DatabaseReference().CloseContactL(groupId); + CleanupStack::PopAndDestroy(group); + } + + CleanupStack::PopAndDestroy(2, &listOfGroupsSections); + } + + +/** + * Updates the specified group with details like group name, number of contacts in the group + * @param aGroupSection - section in the ini file contains necessary details for group update + * @param aGroup - Group to be updated + */ +void CTestContactViewDatabaseUtilitiesStep::UpdateGroupsL(const TPtrC& aGroupSection, CContactGroup& aGroup) + { + _LIT(KGroupName, "groupname"); + TPtrC groupName; + GetStringFromConfig(aGroupSection, KGroupName, groupName); + + aGroup.SetGroupLabelL(groupName); + + _LIT(KNumOfContacts, "numofcontacts"); + TInt numOfContacts; + GetIntFromConfig(aGroupSection, KNumOfContacts, numOfContacts); + + CCntFilter* filter = CCntFilter::NewL(); + CleanupStack::PushL(filter); + filter->SetContactFilterTypeCard(ETrue); + DatabaseReference().FilterDatabaseL(*filter); + + for(TInt i = 0; i < numOfContacts; ++i) + { + CContactIdArray* idArray = filter->iIds; + TContactItemId contactItemId = (*idArray)[i]; + CContactItem* contactItem = DatabaseReference().OpenContactL(contactItemId); + CleanupStack::PushL(contactItem); + TRAP_IGNORE(DatabaseReference().RemoveContactFromGroupL(*contactItem, aGroup)); + TRAP_IGNORE(DatabaseReference().AddContactToGroupL(*contactItem, aGroup)); + CleanupStack::PopAndDestroy(contactItem); + DatabaseReference().CloseContactL(contactItemId); + } + + CleanupStack::PopAndDestroy(filter); + } + + +/** + * Closes the relevant contacts database file + */ +void CTestContactViewDatabaseUtilitiesStep::CloseDatabaseL() + { + if(iContactUtility) + { + delete iContactUtility; + iContactUtility = NULL; + } + if(iContactViewCollection) + { + delete iContactViewCollection; + iContactViewCollection = NULL; + } + if(iDb) + { + delete iDb; + iDb=NULL; + } + } + +/** + * Uninstall scheduler in the current thread + */ +void CTestContactViewDatabaseUtilitiesStep::UnInstallActiveSchedularL() + { + if(iScheduler) + { + delete iScheduler; + iScheduler = NULL; + } + } + +/** + * Handle to the current database in operation + * @return CContactDatabase& - Reference to current database in operation + */ +CContactDatabase& CTestContactViewDatabaseUtilitiesStep::DatabaseReference() + { + return *iDb; + } + +/** + * Handle to the contact view collection + * @return CContactViewCollection& - Reference to current contact view collection + */ +CContactViewCollection& CTestContactViewDatabaseUtilitiesStep::ViewCollectionReference() + { + return *iContactViewCollection; + } + +/** + * Handle to the contact view utilities + * @return CContactUtilitiesCollection& - Reference to current contact view utilities collection + */ +CContactUtilitiesCollection& CTestContactViewDatabaseUtilitiesStep::ViewUtilityReference() + { + return *iContactUtility; + } + +/** + * Handle to the Pim Test Server + * @return RPIMTestServer& - Reference to Pim Test Server + */ +RPIMTestServer& CTestContactViewDatabaseUtilitiesStep::PimTestServerReference() + { + return iPimTestServer; + } + +/** + * Copies database files across folders + */ +void CTestContactViewDatabaseUtilitiesStep::CopyDatabaseL() + { + _LIT(KSourcePath, "sourcepath"); + TPtrC sourcePathString; + GetStringFromConfig(ConfigSection(), KSourcePath, sourcePathString); + + _LIT(KDestinationPath, "destinationpath"); + TPtrC destinationPathString; + GetStringFromConfig(ConfigSection(), KDestinationPath, destinationPathString); + + if(sourcePathString != KNullDesC && destinationPathString != KNullDesC) + { + TRAP_IGNORE(PimTestServerReference().CopyFileL(sourcePathString, destinationPathString)); + } + }