diff -r b3cee849fa46 -r fad26422216a creator/src/creator_phonebook.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/creator/src/creator_phonebook.cpp Wed Sep 01 12:30:35 2010 +0100 @@ -0,0 +1,514 @@ +/* +* Copyright (c) 2008 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 "creator_phonebook.h" +#include "creator_traces.h" + +#include + +//---------------------------------------------------------------------------- + +CPhonebookParameters::CPhonebookParameters() + { + LOGSTRING("Creator: CPhonebookParameters::CPhonebookParameters"); + + iContactFirstName = HBufC::New(KPhonebookFieldLength); + iContactLastName = HBufC::New(KPhonebookFieldLength); + iContactCompanyName = HBufC::New(KPhonebookFieldLength); + iContactJobTitle = HBufC::New(KPhonebookFieldLength); + iContactPostalAddress = HBufC::New(KPhonebookFieldLength); + iWvUserId = HBufC::New(KPhonebookFieldLength); + iRingingtone = HBufC::New(KPhonebookFieldLength); + iThumbnailImage = HBufC::New(KPhonebookFieldLength); + iContactPhoneNumberGeneral = HBufC::New(KPhonebookFieldLength); + iContactURL = HBufC::New(KPhonebookFieldLength); + iContactEmailAddress = HBufC::New(KPhonebookFieldLength); + iGroupName = HBufC::New(KPhonebookFieldLength); + } + +CPhonebookParameters::~CPhonebookParameters() + { + LOGSTRING("Creator: CPhonebookParameters::~CPhonebookParameters"); + + delete iGroupName; + delete iContactEmailAddress; + delete iContactURL; + delete iContactPhoneNumberGeneral; + delete iThumbnailImage; + delete iRingingtone; + delete iWvUserId; + delete iContactPostalAddress; + delete iContactJobTitle; + delete iContactCompanyName; + delete iContactLastName; + delete iContactFirstName; + } +void CPhonebookParameters::ParseL (CCommandParser* parser, TParseParams /*aCase = 0*/) + { + parser->StrParserL (iContactFirstName, '|'); + parser->StrParserL (iContactLastName, '|'); + parser->StrParserL (iContactCompanyName, '|'); + parser->StrParserL (iContactJobTitle, '|'); + parser->StrParserL (iContactPostalAddress, '|'); + parser->StrParserL (iContactPhoneNumberGeneral, '|'); + parser->StrParserL (iContactURL, '|'); + parser->StrParserL (iContactEmailAddress, '|'); + parser->StrParserL (iWvUserId, '|'); + parser->StrParserL (iRingingtone, '|'); + parser->StrParserL (iThumbnailImage, ';'); + } +//---------------------------------------------------------------------------- + +CCreatorPhonebook* CCreatorPhonebook::NewL(CCreatorEngine* aEngine) + { + CCreatorPhonebook* self = CCreatorPhonebook::NewLC(aEngine); + CleanupStack::Pop(self); + return self; + } + +CCreatorPhonebook* CCreatorPhonebook::NewLC(CCreatorEngine* aEngine) + { + CCreatorPhonebook* self = new (ELeave) CCreatorPhonebook; + CleanupStack::PushL(self); + self->ConstructL(aEngine); + return self; + } + +CCreatorPhonebook::CCreatorPhonebook() + { + } + +void CCreatorPhonebook::ConstructL(CCreatorEngine* aEngine) + { + LOGSTRING("Creator: CCreatorPhonebook::ConstructL"); + + iEngine = aEngine; + iContactDBEngine = CPbkContactEngine::NewL(); + iOpCounter = 0; + SetDefaultParameters(); + } + +CCreatorPhonebook::~CCreatorPhonebook() + { + LOGSTRING("Creator: CCreatorPhonebook::~CCreatorPhonebook"); + + if ( iEngine && iContactIds.Count() ) + { + TRAP_IGNORE( iEngine->WriteEntryIdsToStoreL( iContactIds, KUidDictionaryUidContacts ) ); + } + iContactIds.Reset(); + iContactIds.Close(); + + if ( iEngine && iGroupIds.Count() ) + { + TRAP_IGNORE( iEngine->WriteEntryIdsToStoreL( iGroupIds, KUidDictionaryUidContactGroups ) ); + } + iGroupIds.Reset(); + iGroupIds.Close(); + + iEntriesToDelete.Reset(); + iEntriesToDelete.Close(); + + CompactPbkDatabase( ETrue ); + + delete iContactDBEngine; + + if (iParameters) + delete iParameters; + } + +//---------------------------------------------------------------------------- +TInt CCreatorPhonebook::CreateContactEntryL(CCreatorModuleBaseParameters *aParameters) + { + LOGSTRING("Creator: CCreatorPhonebook::CreateContactEntryL"); + + delete iParameters; + iParameters = 0; + + CPhonebookParameters* parameters = (CPhonebookParameters*) aParameters; + + // random data needed if no predefined data available + if (!parameters) + { + iParameters = new(ELeave) CPhonebookParameters; + + iParameters->iNumberOfPhoneNumberFields = iNumberOfPhoneNumberFields; + iParameters->iNumberOfURLFields = iNumberOfURLFields; + iParameters->iNumberOfEmailAddressFields = iNumberOfEmailAddressFields; + + iParameters->iNumberOfPhoneNumberFields = iNumberOfPhoneNumberFields; + iParameters->iNumberOfURLFields = iNumberOfURLFields; + iParameters->iNumberOfEmailAddressFields = iNumberOfEmailAddressFields; + + iParameters->iContactFirstName->Des() = iEngine->RandomString(CCreatorEngine::EFirstName); + iParameters->iContactLastName->Des() = iEngine->RandomString(CCreatorEngine::ESurname); + iParameters->iContactCompanyName->Des() = iEngine->RandomString(CCreatorEngine::ECompany); + iParameters->iContactJobTitle->Des() = iEngine->RandomString(CCreatorEngine::EJobTitle); + iParameters->iContactPostalAddress->Des() = iEngine->RandomString(CCreatorEngine::EAddress); + + iParameters->iWvUserId->Des().Copy(_L("wv:")); + iParameters->iWvUserId->Des().Append(iParameters->iContactFirstName->Des()); + + // TO-DO..... + //iParameters->iRingingtone->Des() = KNullDesC; + //iParameters->iThumbnailImage->Des() = KNullDesC; + + iParameters->iContactPhoneNumberGeneral->Des() = iEngine->RandomString(CCreatorEngine::EPhoneNumber); + + iParameters->iContactURL->Des().Copy( _L("http://www.") ); + iParameters->iContactURL->Des().Append( iParameters->iContactCompanyName->Des() ); + iParameters->iContactURL->Des().Append( _L(".com/") ); + + iParameters->iContactEmailAddress->Des().Copy( iParameters->iContactFirstName->Des() ); + iParameters->iContactEmailAddress->Des().Append( _L("@") ); + iParameters->iContactEmailAddress->Des().Append( iParameters->iContactCompanyName->Des() ); + iParameters->iContactEmailAddress->Des().Append( _L(".com") ); + + } + else + { + iParameters = parameters; + } + + TInt err = KErrNone; + + // create a new contact item based on the default template + CPbkContactItem* newContact = iContactDBEngine->CreateEmptyContactL(); + CleanupStack::PushL(newContact); + + AddFieldToContactItemL (*newContact, EPbkFieldIdFirstName, iParameters->iContactFirstName->Des()); + AddFieldToContactItemL (*newContact, EPbkFieldIdLastName, iParameters->iContactLastName->Des()); + AddFieldToContactItemL (*newContact, EPbkFieldIdCompanyName, iParameters->iContactCompanyName->Des()); + AddFieldToContactItemL (*newContact, EPbkFieldIdJobTitle, iParameters->iContactJobTitle->Des()); + AddFieldToContactItemL (*newContact, EPbkFieldIdPostalAddress, iParameters->iContactPostalAddress->Des()); + + AddFieldToContactItemL (*newContact, EPbkFieldIdWVID, iParameters->iWvUserId->Des()); + AddFieldToContactItemL (*newContact, EPbkFieldIdPersonalRingingToneIndication, iParameters->iRingingtone->Des()); + AddFieldToContactItemL (*newContact, EPbkFieldIdThumbnailImage, iParameters->iThumbnailImage->Des()); + + for (TInt i=0; iiNumberOfPhoneNumberFields; i++) + { + if (i%6 == 0) + AddFieldToContactItemL (*newContact, EPbkFieldIdPhoneNumberGeneral, iParameters->iContactPhoneNumberGeneral->Des()); + else if (i%6 == 1) + AddFieldToContactItemL (*newContact, EPbkFieldIdPhoneNumberMobile, iParameters->iContactPhoneNumberGeneral->Des()); + else if (i%6 == 2) + AddFieldToContactItemL (*newContact, EPbkFieldIdFaxNumber, iParameters->iContactPhoneNumberGeneral->Des()); + else if (i%6 == 3) + AddFieldToContactItemL (*newContact, EPbkFieldIdPagerNumber, iParameters->iContactPhoneNumberGeneral->Des()); + else if (i%6 == 4) + AddFieldToContactItemL (*newContact, EPbkFieldIdPhoneNumberHome, iParameters->iContactPhoneNumberGeneral->Des()); + else + AddFieldToContactItemL (*newContact, EPbkFieldIdPhoneNumberWork, iParameters->iContactPhoneNumberGeneral->Des()); + } + + for (TInt j=0; jiNumberOfURLFields; j++) + AddFieldToContactItemL (*newContact, EPbkFieldIdURL, iParameters->iContactURL->Des()); + + for (TInt k=0; kiNumberOfEmailAddressFields; k++) + AddFieldToContactItemL (*newContact, EPbkFieldIdEmailAddress, iParameters->iContactEmailAddress->Des()); + + + // add the contact item to the database + iContactDBEngine->AddNewContactL(*newContact); + + // id has been generated, store it for being able to delete + // entries created only with Creator + iContactIds.Append( newContact->Id() ); + + CleanupStack::PopAndDestroy(); // newContact + + CompactPbkDatabase(); + + return err; + } + +//---------------------------------------------------------------------------- + +TInt CCreatorPhonebook::CreateGroupEntryL(CCreatorModuleBaseParameters *aParameters) + { + LOGSTRING("Creator: CCreatorPhonebook::CreateGroupEntryL"); + + // clear any existing parameter definations + if (iParameters) + { + delete iParameters; + iParameters = NULL; + } + + // random data needed if no predefined data available + if (!aParameters) + { + iParameters = new(ELeave) CPhonebookParameters; + + iParameters->iContactsInGroup = iContactsInGroup; + + iParameters->iGroupName->Des().Copy( iEngine->RandomString(CCreatorEngine::EGroupName) ); + iParameters->iGroupName->Des().Append( _L(" #") ); + iParameters->iGroupName->Des().AppendNum( iEngine->RandomNumber(1000, 9999) ); + } + else + { + // otherwise replace the parameters object + iParameters = (CPhonebookParameters*) aParameters; + } + + TInt err(KErrNone); + + // create contact iterator + CPbkContactIter* contactIter = iContactDBEngine->CreateContactIteratorLC(); + + // create contact id array + CContactIdArray* contactIdArray = CContactIdArray::NewLC(); + + // get all contacts + TBool getFirstContact(ETrue); + TContactItemId contactId; + + for (;;) + { + if (getFirstContact) + { + // get first contact + contactId = contactIter->FirstL(); + getFirstContact = EFalse; + } + else + { + // get next contact + contactId = contactIter->NextL(); + } + + // check if valid contact id received + if (contactId == KNullContactId) + { + // no more contacts, so break + break; + } + else + { + // append to array + contactIdArray->AddL(contactId); + } + } + + // create a new contact group + CContactGroup* newGroup = iContactDBEngine->CreateContactGroupL( iParameters->iGroupName->Des() ); + CleanupStack::PushL(newGroup); + + // define amounts of contacts to be added to the group + TInt amountOfContactsToBeAdded; + if (iParameters->iContactsInGroup == KCreateRandomAmountOfGroups) + amountOfContactsToBeAdded = iEngine->RandomNumber(30); + else + amountOfContactsToBeAdded = iParameters->iContactsInGroup; + + + // a simple way to randomise order of contacts in the array + if (iEngine->RandomNumber(1, 2) == 1) + contactIdArray->ReverseOrder(); + + // assign contacts from the array to the group if any contacts available + if (contactIdArray->Count() > 0) + { + // get random start number which defines from which position to start adding contacts + TInt arrayPosCounter = iEngine->RandomNumber(contactIdArray->Count()-1); + TInt addedContacsCounter(0); + + for (TInt y=0; yAddContactToGroupL((*contactIdArray)[arrayPosCounter], newGroup->Id()); + addedContacsCounter++; + arrayPosCounter++; + + // no need to add more contacts than actually available + if (addedContacsCounter >= contactIdArray->Count()) + break; + + // if limit reached, start from the beginning + if (arrayPosCounter >= contactIdArray->Count()) + arrayPosCounter = 0; + } + } + + // id has been generated, store it for being able to delete + // entries created only with Creator + iGroupIds.Append( newGroup->Id() ); + + CleanupStack::PopAndDestroy(3); // newGroup, contactIdArray, contactIter + + CompactPbkDatabase(); + + return err; + } + + +//---------------------------------------------------------------------------- + +TInt CCreatorPhonebook::CreateSubscribedContactEntryL(CCreatorModuleBaseParameters* /*aParameters*/) + { + LOGSTRING("Creator: CCreatorPhonebook::CreateSubscribedContactEntryL"); + + return KErrNotSupported; + } + +//---------------------------------------------------------------------------- + +void CCreatorPhonebook::AddFieldToContactItemL(CPbkContactItem& aItem, TPbkFieldId aFieldId, const TDesC& aFieldText) + { + //LOGSTRING("Creator: CCreatorPhonebook::AddFieldToContactItemL"); + + CPbkFieldInfo* fieldInfo = iContactDBEngine->FieldsInfo().Find( aFieldId ); + if( fieldInfo ) // field was found + { + // add the field and value to contact + TPbkContactItemField* itemField = aItem.AddOrReturnUnusedFieldL( *fieldInfo ); + + if( itemField && aFieldText.Length() > 0 ) // add text also + { + if( itemField->ItemField().StorageType() == KStorageTypeText ) + { + CContactTextField* textField = itemField->ItemField().TextStorage(); + + // clip the text if it doesn't fit to the field + textField->SetTextL( aFieldText.Left( fieldInfo->MaxLength() ) ); + } + } + } + } + +//---------------------------------------------------------------------------- + +void CCreatorPhonebook::CompactPbkDatabase(TBool aCompressImmediately) + { + LOGSTRING("Creator: CCreatorPhonebook::CompactPbkDatabase"); + + iOpCounter++; + + // compress the database immediately or after each 100th operation + if (aCompressImmediately || iOpCounter%100 == 0) + { + CContactDatabase& db = iContactDBEngine->Database(); + + if (db.CompressRequired()) + { + LOGSTRING("Creator: CCreatorPhonebook::CompactPbkDatabase - Compacting..."); + TRAP_IGNORE( db.CompactL() ); + } + } + } +//---------------------------------------------------------------------------- +void CCreatorPhonebook::DeleteAllL() + { + LOGSTRING("Creator: CCreatorPhonebook::DeleteAllL"); + DeleteAllItemsL( KUidDictionaryUidContacts ); + iContactIds.Reset(); + } + +//---------------------------------------------------------------------------- +void CCreatorPhonebook::DeleteAllCreatedByCreatorL() + { + LOGSTRING("Creator: CCreatorPhonebook::DeleteAllCreatedByCreatorL"); + DeleteItemsCreatedWithCreatorL( KUidDictionaryUidContacts ); + iContactIds.Reset(); + } + +//---------------------------------------------------------------------------- +void CCreatorPhonebook::DeleteAllGroupsL() + { + LOGSTRING("Creator: CCreatorPhonebook::DeleteAllGroupsL"); + DeleteAllItemsL( KUidDictionaryUidContactGroups ); + iGroupIds.Reset(); + } + +//---------------------------------------------------------------------------- +void CCreatorPhonebook::DeleteAllGroupsCreatedByCreatorL() + { + LOGSTRING("Creator: CCreatorPhonebook::DeleteAllGroupsCreatedByCreatorL"); + DeleteItemsCreatedWithCreatorL( KUidDictionaryUidContactGroups ); + iGroupIds.Reset(); + } + +//---------------------------------------------------------------------------- +void CCreatorPhonebook::DeleteAllItemsL( TUid aStoreUid ) + { + LOGSTRING("Creator: CCreatorPhonebook::DeleteItemsL"); + __ASSERT_ALWAYS( aStoreUid == KUidDictionaryUidContacts || + aStoreUid == KUidDictionaryUidContactGroups, + User::Panic( _L("CCreatorPb"), KErrArgument ) ); + + CContactIdArray* allContacts = iContactDBEngine->FindLC( _L("") ); + + CPbkContactItem* item; + TInt i(0); + // remove that type of item ids from the array + // that we don't want to delete + while( allContacts && i < allContacts->Count() ) + { + item = iContactDBEngine->ReadContactL( (*allContacts)[i] ); + if ( ( aStoreUid == KUidDictionaryUidContactGroups ) == + ( item->Type() != KUidContactGroup ) ) + { + allContacts->Remove( i ); + } + else + { + i++; + } + delete item; + item = NULL; + } + iContactDBEngine->DeleteContactsL( *allContacts ); + CleanupStack::PopAndDestroy( allContacts ); + + // contacts deleted, remove the store + CDictionaryFileStore* store = iEngine->FileStoreLC(); + if ( store ) + { + store->Remove( aStoreUid ); + store->CommitL(); + } + CleanupStack::PopAndDestroy( store ); + } + +//---------------------------------------------------------------------------- +void CCreatorPhonebook::DeleteItemsCreatedWithCreatorL( TUid aStoreUid ) + { + LOGSTRING("Creator: CCreatorPhonebook::DeleteItemsCreatedWithCreatorL"); + __ASSERT_ALWAYS( aStoreUid == KUidDictionaryUidContacts || + aStoreUid == KUidDictionaryUidContactGroups, + User::Panic( _L("CCreatorPb"), KErrArgument ) ); + + iEntriesToDelete.Reset(); + + // fetch ids of entries created by Creator + iEngine->ReadEntryIdsFromStoreL( iEntriesToDelete, aStoreUid ); + + // delete entries + for ( TInt i = 0; i < iEntriesToDelete.Count(); i++ ) + { + TRAP_IGNORE( iContactDBEngine->DeleteContactL( iEntriesToDelete[i] ) ); + } + + iEntriesToDelete.Reset(); + + // all entries deleted, remove the Logs related registry + iEngine->RemoveStoreL( aStoreUid ); + }