--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/creator/engine/src/creator_phonebook.cpp Tue Aug 31 15:15:20 2010 +0300
@@ -0,0 +1,770 @@
+/*
+* Copyright (c) 2010 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 "engine.h"
+#include "enginewrapper.h"
+#include "creator_contactsetcache.h"
+
+#include "creator_phonebook.h"
+#include "creator_traces.h"
+
+#include <bautils.h>
+
+_LIT(KTempPath, "C:\\Data\\Creator\\");
+
+
+typedef struct {
+TInt iFieldCode;
+TInt iRandomType;
+} DetailFieldInfo;
+static const TInt RND_TYPE_UNDEF = -99;
+DetailFieldInfo CreatorPbkMiscTextFields[] = {
+ {CCreatorPhonebookWrapper::EFirstName, (TInt) CCreatorEngine::EFirstName},
+ {CCreatorPhonebookWrapper::EFirstNameReading, (TInt) CCreatorEngine::EFirstName},
+ {CCreatorPhonebookWrapper::ELastName, (TInt) CCreatorEngine::ESurname},
+ {CCreatorPhonebookWrapper::ELastNameReading, (TInt) CCreatorEngine::ESurname},
+ {CCreatorPhonebookWrapper::ECompanyName, (TInt) CCreatorEngine::ECompany},
+ {CCreatorPhonebookWrapper::EJobTitle, (TInt) CCreatorEngine::EJobTitle},
+ {CCreatorPhonebookWrapper::EPrefix, (TInt) CCreatorEngine::EPrefix},
+ {CCreatorPhonebookWrapper::ESuffix, (TInt) CCreatorEngine::ESuffix},
+ {CCreatorPhonebookWrapper::ESecondName, (TInt) CCreatorEngine::EFirstName},
+ {CCreatorPhonebookWrapper::EAddrLabelGen, (TInt) CCreatorEngine::EAddress},
+ {CCreatorPhonebookWrapper::EAddrPoGen, (TInt) CCreatorEngine::EPobox},
+ {CCreatorPhonebookWrapper::EAddrExtGen, (TInt) CCreatorEngine::EAddress},
+ {CCreatorPhonebookWrapper::EAddrStreetGen, (TInt) CCreatorEngine::EAddress},
+ {CCreatorPhonebookWrapper::EAddrLocalGen, (TInt) CCreatorEngine::ECity},
+ {CCreatorPhonebookWrapper::EAddrRegionGen, (TInt) CCreatorEngine::EState},
+ {CCreatorPhonebookWrapper::EAddrPostCodeGen, (TInt) CCreatorEngine::EPostcode},
+ {CCreatorPhonebookWrapper::EAddrCountryGen, (TInt) CCreatorEngine::ECountry},
+ {CCreatorPhonebookWrapper::EAddrLabelHome, (TInt) CCreatorEngine::EAddress},
+ {CCreatorPhonebookWrapper::EAddrPoHome, (TInt) CCreatorEngine::EPobox},
+ {CCreatorPhonebookWrapper::EAddrExtHome, (TInt) CCreatorEngine::EAddress},
+ {CCreatorPhonebookWrapper::EAddrStreetHome, (TInt) CCreatorEngine::EAddress},
+ {CCreatorPhonebookWrapper::EAddrLocalHome, (TInt) CCreatorEngine::ECity},
+ {CCreatorPhonebookWrapper::EAddrRegionHome, (TInt) CCreatorEngine::EState},
+ {CCreatorPhonebookWrapper::EAddrPostCodeHome, (TInt) CCreatorEngine::EPostcode},
+ {CCreatorPhonebookWrapper::EAddrCountryHome, (TInt) CCreatorEngine::ECountry},
+ {CCreatorPhonebookWrapper::EAddrLabelWork, (TInt) CCreatorEngine::EAddress},
+ {CCreatorPhonebookWrapper::EAddrPoWork, (TInt) CCreatorEngine::EPobox},
+ {CCreatorPhonebookWrapper::EAddrExtWork, (TInt) CCreatorEngine::EAddress},
+ {CCreatorPhonebookWrapper::EAddrStreetWork, (TInt) CCreatorEngine::EAddress},
+ {CCreatorPhonebookWrapper::EAddrLocalWork, (TInt) CCreatorEngine::ECity},
+ {CCreatorPhonebookWrapper::EAddrRegionWork, (TInt) CCreatorEngine::EState},
+ {CCreatorPhonebookWrapper::EAddrPostCodeWork, (TInt) CCreatorEngine::EPostcode},
+ {CCreatorPhonebookWrapper::EAddrCountryWork, (TInt) CCreatorEngine::ECountry},
+ {CCreatorPhonebookWrapper::EPoc, (TInt) CCreatorEngine::EPhoneNumber},
+ {CCreatorPhonebookWrapper::ESwis, (TInt) CCreatorEngine::EPhoneNumber},
+ {CCreatorPhonebookWrapper::ESip, (TInt) CCreatorEngine::EPhoneNumber},
+ {CCreatorPhonebookWrapper::EDtmfString, (TInt) CCreatorEngine::EFirstName},
+ {CCreatorPhonebookWrapper::ENote,(TInt) CCreatorEngine::EMemoText},
+ {CCreatorPhonebookWrapper::EMiddleName, (TInt) CCreatorEngine::EFirstName},
+ {CCreatorPhonebookWrapper::EDepartment, (TInt) CCreatorEngine::ECompany},
+ {CCreatorPhonebookWrapper::EAsstName, (TInt) CCreatorEngine::EFirstName},
+ {CCreatorPhonebookWrapper::ESpouse, (TInt) CCreatorEngine::EFirstName},
+ {CCreatorPhonebookWrapper::EChildren, (TInt) CCreatorEngine::EFirstName},
+ {CCreatorPhonebookWrapper::ESyncClass, RND_TYPE_UNDEF},
+ {CCreatorPhonebookWrapper::ELocPrivacy, RND_TYPE_UNDEF},
+ {CCreatorPhonebookWrapper::EGenLabel, (TInt) CCreatorEngine::EFirstName},
+ {CCreatorPhonebookWrapper::EWVAddress, (TInt) CCreatorEngine::EPhoneNumber},
+ {CCreatorPhonebookWrapper::ERingTone, RND_TYPE_UNDEF},
+ {CCreatorPhonebookWrapper::EThumbnailPic, RND_TYPE_UNDEF},
+ {CCreatorPhonebookWrapper::ECallerObjText, (TInt) CCreatorEngine::EFirstName}
+ };
+
+
+TInt CreatorPbkBinaryFields[] = {
+ CCreatorPhonebookWrapper::ECallerObjImg//,
+ //R_VPBK_FIELD_TYPE_THUMBNAILPATH
+ };
+
+TInt CreatorPbkDateTimeFields[] = {
+ CCreatorPhonebookWrapper::EAnniversary
+ };
+
+//----------------------------------------------------------------------------
+TInt CreatorPbkPhoneNumberFields[] =
+ {
+ CCreatorPhonebookWrapper::ELandPhoneGen,
+ CCreatorPhonebookWrapper::ELandPhoneHome,
+ CCreatorPhonebookWrapper::ELandPhoneWork,
+ CCreatorPhonebookWrapper::EMobilePhoneGen,
+ CCreatorPhonebookWrapper::EMobilePhoneHome,
+ CCreatorPhonebookWrapper::EMobilePhoneWork,
+ CCreatorPhonebookWrapper::EFaxNumberGen,
+ CCreatorPhonebookWrapper::EFaxNumberHome,
+ CCreatorPhonebookWrapper::EFaxNumberWork,
+ CCreatorPhonebookWrapper::EPagerNumber,
+ CCreatorPhonebookWrapper::EVideoNumberGen,
+ CCreatorPhonebookWrapper::EVideoNumberHome,
+ CCreatorPhonebookWrapper::EVideoNumberWork,
+ CCreatorPhonebookWrapper::EVoipGen,
+ CCreatorPhonebookWrapper::EVoipHome,
+ CCreatorPhonebookWrapper::EVoipWork,
+ CCreatorPhonebookWrapper::EAsstPhone,
+ CCreatorPhonebookWrapper::ECarPhone
+ };
+
+TInt CreatorPbkUrlFields[] =
+ {
+ CCreatorPhonebookWrapper::EUrlGen,
+ CCreatorPhonebookWrapper::EUrlHome,
+ CCreatorPhonebookWrapper::EUrlWork
+ };
+
+TInt CreatorPbkEmailFields[] =
+ {
+ CCreatorPhonebookWrapper::EEmailGen,
+ CCreatorPhonebookWrapper::EEmailHome,
+ CCreatorPhonebookWrapper::EEmailWork
+ };
+
+CPhonebookParameters::CPhonebookParameters()
+ {
+ LOGSTRING("Creator: CPhonebookParameters::CVirtualPhonebookParameters");
+ iGroupName = HBufC::New(KPhonebookFieldLength);
+ }
+
+CPhonebookParameters::~CPhonebookParameters()
+ {
+ LOGSTRING("Creator: CPhonebookParameters::~CPhonebookParameters");
+
+ delete iGroupName;
+ for( TCreatorContactFields::iterator it = iContactFields.begin(); it != iContactFields.end(); ++it)
+ {
+ HBufC* temp = (*it).second;
+ iContactFields.erase(it);
+ delete temp;
+ }
+ iLinkIds.Reset();
+ iLinkIds.Close();
+ }
+
+void CPhonebookParameters::ParseL(CCommandParser* /*parser*/, TParseParams /*aCase = 0*/)
+ {
+ }
+
+TInt CPhonebookParameters::ScriptLinkId() const
+ {
+ return iLinkId;
+ }
+
+void CPhonebookParameters::SetScriptLinkId(TInt aLinkId)
+ {
+ iLinkId = aLinkId;
+ }
+
+
+//----------------------------------------------------------------------------
+
+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()
+ {
+ iAddAllFields = EFalse;
+ }
+
+void CCreatorPhonebook::ConstructL(CCreatorEngine* aEngine)
+ {
+ LOGSTRING("Creator: CCreatorPhonebook::ConstructL");
+
+ iEngine = aEngine;
+
+ iPhonebookWrapper = CCreatorPhonebookWrapper::NewL();
+
+ SetDefaultParameters();
+ }
+
+
+CCreatorPhonebook::~CCreatorPhonebook()
+ {
+ LOGSTRING("Creator: CCreatorPhonebook::~CCreatorPhonebook");
+
+ if ( iContactsToDelete.Count() )
+ {
+ TRAP_IGNORE( StoreLinksForDeleteL( iContactsToDelete, KUidDictionaryUidContacts ) );
+ }
+ if ( iContactGroupsToDelete.Count() )
+ {
+ TRAP_IGNORE( StoreLinksForDeleteL( iContactGroupsToDelete, KUidDictionaryUidContactGroups ) );
+ }
+
+ if( iPhonebookWrapper )
+ {
+ delete iPhonebookWrapper;
+ }
+
+ if (iParameters)
+ {
+ delete iParameters;
+ }
+
+ }
+
+//----------------------------------------------------------------------------
+
+TInt CCreatorPhonebook::CreateContactEntryL(CCreatorModuleBaseParameters *aParameters)
+ {
+ TInt err = KErrNone;
+ delete iParameters;
+ iParameters = 0;
+ CPhonebookParameters* parameters = 0;
+
+ if( aParameters == 0 )
+ {
+ InitializeContactParamsL();
+ parameters = iParameters;
+ }
+ else
+ {
+ parameters = (CPhonebookParameters*) aParameters;
+ }
+
+ int numberOfFields = parameters->iContactFields.size();
+ // create a new contact item
+
+ TUint32 contactId = iPhonebookWrapper->CreateContactEntryL( parameters->iContactFields ); //wrapper should return contact id to store
+ iContactsToDelete.Append( contactId );
+
+
+ // If this contact has a link id in script (i.e. belongs to a contact-set), we must cache the contact id:
+ if( parameters->ScriptLinkId() > 0 )
+ {
+ RPointerArray<CCreatorContactSet>& contactsets = ContactLinkCache::Instance()->ContactSets();
+ TBool setFound(EFalse);
+ for(TInt i = 0; i < contactsets.Count(); ++i )
+ {
+ if( contactsets[i]->LinkId() == parameters->ScriptLinkId() )
+ {
+ if( contactId )
+ {
+ contactsets[i]->AppendL( contactId );
+ iContactLinkArray.AppendL( contactId );
+ }
+ setFound = ETrue;
+ break;
+ }
+ }
+ if( !setFound )
+ {
+ LOGSTRING2("Error: Contact set id %d not found.", parameters->ScriptLinkId());
+ }
+ }
+
+ return err;
+ }
+
+
+//----------------------------------------------------------------------------
+
+
+
+//----------------------------------------------------------------------------
+
+void CCreatorPhonebook::DeleteAllL()
+ {
+ iPhonebookWrapper->DeleteAllL();
+ }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DeleteAllCreatedByCreatorL()
+ {
+ LOGSTRING("Creator: CCreatorPhonebook::DeleteAllCreatedByCreatorL");
+ DeleteItemsCreatedWithCreatorL( KUidDictionaryUidContacts );
+ }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DeleteAllGroupsL()
+ {
+ LOGSTRING("Creator: CCreatorPhonebook::DeleteAllGroupsL");
+ iPhonebookWrapper->DeleteAllGroupsL();
+ }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DeleteAllGroupsCreatedByCreatorL()
+ {
+ LOGSTRING("Creator: CCreatorPhonebook::DeleteAllGroupsCreatedByCreatorL");
+ DeleteItemsCreatedWithCreatorL( KUidDictionaryUidContactGroups );
+ }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DeleteContactsL( RArray<TUint32>& aContactsToDelete, TUid aStoreUid )
+ {
+ iPhonebookWrapper->DeleteContactsL( aContactsToDelete, aStoreUid );
+ }
+
+//----------------------------------------------------------------------------
+
+
+void CCreatorPhonebook::DeleteItemsCreatedWithCreatorL( TUid aStoreUid )
+ {
+ CDictionaryFileStore* store = iEngine->FileStoreLC();
+ User::LeaveIfNull( store );
+
+ RArray<TUint32> contacts;
+ // backup previous contact links from store
+ // otherwise they would be overwritten when calling out.WriteL
+ TUint32 creatorLink;
+ if ( store->IsPresentL( aStoreUid ) )
+ {
+ RDictionaryReadStream in;
+ in.OpenLC( *store, aStoreUid );
+ TRAP_IGNORE(
+ do{
+ creatorLink = in.ReadUint32L();
+ contacts.AppendL( creatorLink );
+ }while( creatorLink );
+ );
+
+ CleanupStack::PopAndDestroy(); // in
+ }
+
+
+ iPhonebookWrapper->DeleteContactsL( contacts, aStoreUid );
+
+ store->Remove( aStoreUid );
+ store->CommitL();
+
+ CleanupStack::PopAndDestroy( store );
+ }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DoDeleteItemsCreatedWithCreatorL( TUid /*aStoreUid*/, CDictionaryFileStore* /*aStore*/ )
+ {
+
+ }
+
+//----------------------------------------------------------------------------
+TBool CCreatorPhonebook::HasOtherThanGroupsL()
+ {
+ LOGSTRING("Creator: CCreatorPhonebook::HasOtherThanGroupsL");
+ TBool result( EFalse );
+ return result;
+ }
+
+
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::StoreLinksForDeleteL( RArray<TUint32>& aLinks, TUid aStoreUid )
+ {
+ LOGSTRING("Creator: CCreatorPhonebook::StoreLinksForDeleteL");
+ CDictionaryFileStore* store = iEngine->FileStoreLC();
+ User::LeaveIfNull( store );
+
+ // backup previous contact links from store
+ // otherwise they would be overwritten when calling out.WriteL
+ TUint32 previousLink;
+ if ( store->IsPresentL( aStoreUid ) )
+ {
+ RDictionaryReadStream in;
+ in.OpenLC( *store, aStoreUid );
+ bool r = false;
+ TRAP_IGNORE(
+ do{ //iContactMngr->CreateLinksLC( in )) != NULL ) // will leave with KErrEof
+ previousLink = in.ReadUint32L();
+ iPreviousDeleteLinks.Append( previousLink );
+ if(previousLink)
+ {
+ r=true;
+ }
+ else
+ {
+ r=false;
+ }
+ }while(r==true); );
+
+ CleanupStack::PopAndDestroy(); // in
+ }
+
+ RDictionaryWriteStream out;
+ out.AssignLC( *store, aStoreUid );
+
+ // restore previous links
+ for ( TInt i = 0; i < iPreviousDeleteLinks.Count(); i++ )
+ {
+ out.WriteUint32L( iPreviousDeleteLinks[i] );
+ }
+
+ // write new links
+ for(int i=0; i < aLinks.Count(); i++)
+ {
+ out.WriteUint32L( aLinks[i] );
+ }
+ out.CommitL();
+ CleanupStack::PopAndDestroy(); // out
+
+ store->CommitL();
+
+ CleanupStack::PopAndDestroy( store );
+ }
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+void CCreatorPhonebook::InitializeContactParamsL()
+ {
+ LOGSTRING("Creator: CCreatorPhonebook::InitializeContactParamsL");
+
+ iParameters = new (ELeave) CPhonebookParameters;
+
+ iParameters->iNumberOfPhoneNumberFields = iNumberOfPhoneNumberFields;
+ iParameters->iNumberOfURLFields = iNumberOfURLFields;
+ iParameters->iNumberOfEmailAddressFields = iNumberOfEmailAddressFields;
+
+ TPtrC fname = iEngine->RandomString(CCreatorEngine::EFirstName);
+ TPtrC lname = iEngine->RandomString(CCreatorEngine::ESurname);
+
+
+ if( iAddAllFields )
+ {
+ TInt textFieldCount = sizeof(CreatorPbkMiscTextFields) / sizeof(DetailFieldInfo);
+ for( TInt tfIndex = 0; tfIndex < textFieldCount; ++tfIndex )
+ {
+ CCreatorContactField* field = CCreatorContactField::NewL();
+ CleanupStack::PushL(field);
+ field->AddFieldToParamL( iEngine,iParameters, CreatorPbkMiscTextFields[tfIndex].iFieldCode, CreatorPbkMiscTextFields[tfIndex].iRandomType );
+ CleanupStack::Pop(field);
+ }
+
+ // Add binary fields:
+
+ RFs& fs = CCoeEnv::Static()->FsSession();
+
+ TBuf<KMaxFileName> srcPath;
+ iEngine->RandomPictureFileL(srcPath);
+ TBuf<KMaxFileName> destPath(KTempPath);
+
+ if(!BaflUtils::FolderExists( fs, destPath ))
+ {
+ BaflUtils::EnsurePathExistsL( fs, destPath );
+ }
+
+ TInt err=BaflUtils::CopyFile( fs, srcPath, destPath );
+
+ TParse temp;
+ temp.Set( srcPath,NULL,NULL );
+ destPath.Append(temp.NameAndExt());
+ TPtrC picture;
+ picture.Set(destPath);
+ CCreatorContactField* picturefield = CCreatorContactField::NewL();
+ CleanupStack::PushL(picturefield);
+ picturefield->AddFieldToParamL( iParameters, CCreatorPhonebookWrapper::EThumbnailPic, picture );
+ CleanupStack::Pop(picturefield);
+ // Add date-time fields:
+ TPtrC anniv;
+ TBuf<20> timeString;
+ TTime datetime = iEngine->RandomDate( CCreatorEngine::EDateFuture );
+ _LIT(KDateString,"%D%M%Y%/0%1%/1%2%/2%3%/3");
+ TRAP_IGNORE( datetime.FormatL(timeString, KDateString) );
+
+ anniv.Set(timeString);
+
+ CCreatorContactField* fieldAnniv = CCreatorContactField::NewL();
+ CleanupStack::PushL( fieldAnniv );
+ fieldAnniv->AddFieldToParamL(iParameters,CCreatorPhonebookWrapper::EAnniversary, anniv );
+ CleanupStack::Pop( fieldAnniv );
+ //***************************************************************************
+
+ }
+ else
+ {
+ CCreatorContactField* field = CCreatorContactField::NewL();
+ CleanupStack::PushL(field);
+ field->AddFieldToParamL( iParameters, CCreatorPhonebookWrapper::EFirstName, fname );
+ field->AddFieldToParamL( iParameters, CCreatorPhonebookWrapper::ELastName, lname );
+ CleanupStack::Pop(field);
+ }
+
+ // Phone numbers:
+ TInt phoneFieldCount = sizeof(CreatorPbkPhoneNumberFields) / sizeof(TInt);
+
+ TInt inc=0;
+ for( TInt i=0; i<iNumberOfPhoneNumberFields; i++ )
+ {
+
+ if(inc >= phoneFieldCount )
+ {
+ inc = 0;
+ }
+
+ CCreatorContactField* field = CCreatorContactField::NewL();
+ CleanupStack::PushL(field);
+ field->AddFieldToParamL(iEngine, iParameters, CreatorPbkPhoneNumberFields[inc] );
+ CleanupStack::Pop(field);
+
+ inc++;
+ }
+
+
+
+ // URLs:
+ TInt urlFieldCount = sizeof(CreatorPbkUrlFields) / sizeof(TInt);
+ inc = 0;
+ for( TInt i=0; i<iNumberOfURLFields; i++ )
+ {
+
+ if(inc >= urlFieldCount )
+ {
+ inc = 0;
+ }
+
+ CCreatorContactField* field = CCreatorContactField::NewL();
+ CleanupStack::PushL(field);
+ field->AddFieldToParamL(iEngine, iParameters, CreatorPbkUrlFields[inc] );
+ CleanupStack::Pop(field);
+ inc++;
+ }
+
+ // EMail addresses:
+ TInt emailFieldCount = sizeof(CreatorPbkEmailFields) / sizeof(TInt);
+ inc = 0;
+ for( int i=0; i<iNumberOfEmailAddressFields; i++ )
+ {
+ if(inc >= emailFieldCount )
+ {
+ inc = 0;
+ }
+ CCreatorContactField* field = CCreatorContactField::NewL();
+ CleanupStack::PushL(field);
+ field->AddFieldToParamL(iEngine, iParameters, CreatorPbkEmailFields[inc] );
+ CleanupStack::Pop(field);
+ inc++;
+ }
+
+ TestPrintOut(iParameters);
+
+ }
+
+void CCreatorPhonebook::TestPrintOut(CPhonebookParameters* aParam)
+ {
+ LOGSTRING("Creator: CCreatorPhonebook::TestPrintOut");
+ for( TCreatorContactFields::iterator it = aParam->iContactFields.begin(); it != aParam->iContactFields.end(); ++it)
+ {
+ HBufC* temp = (*it).second;
+ if(temp)
+ {
+ LOGSTRING3("Type: %d Content:%S ", (*it).first, &temp->Des() );
+ }
+ }
+ }
+
+// Checks if the link is a group or not
+TBool CCreatorPhonebook::IsContactGroupL( TUint32& aLink )
+ {
+ //not used right now
+ return EFalse;
+ }
+
+
+TInt CCreatorPhonebook::CreateGroupEntryL(CCreatorModuleBaseParameters *aParameters)
+ {
+ LOGSTRING("Creator: CCreatorPhonebook::CreateGroupEntryL");
+ TInt err = KErrNone;
+
+ delete iParameters;
+ iParameters = 0;
+
+ CPhonebookParameters* parameters = (CPhonebookParameters*) aParameters;
+
+ if( !parameters )
+ {
+ 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) );
+ parameters = iParameters;
+ }
+
+ // create a new contact group
+
+ TUint32 newGroupId = iPhonebookWrapper->CreateGroupEntryL( parameters->iGroupName );
+
+ // define amounts of contacts to be added to the group
+ TInt amountOfContactsToBeAdded = 0;
+ if (parameters->iContactsInGroup == KCreateRandomAmountOfGroups)
+ {
+ amountOfContactsToBeAdded = iEngine->RandomNumber(30);
+ }
+ else
+ {
+ amountOfContactsToBeAdded = parameters->iContactsInGroup;
+ }
+
+ if( parameters->iLinkIds.Count() > 0 )
+ {
+ for( TInt i = 0; i < parameters->iLinkIds.Count(); ++i )
+ {
+ const CCreatorContactSet& set = ContactLinkCache::Instance()->ContactSet(parameters->iLinkIds[i].iLinkId);
+
+ const RArray<TUint32> links = set.ContactLinks();//ContactLinkCache::Instance()->ContactSets();//set.ContactLinks();
+ TInt numberOfExplicitLinks = links.Count(); // Number of defined contacts in contact-set
+ TInt numberOfExistingContacts = set.NumberOfExistingContacts(); // Number of existing contacts in contact-set
+ TInt maxAmount = numberOfExplicitLinks + numberOfExistingContacts;
+
+ if( parameters->iLinkIds[i].iLinkAmount > 0 )
+ maxAmount = parameters->iLinkIds[i].iLinkAmount; // Max amount is limited
+
+ TInt addedMembers = 0;
+
+ for( TInt j = 0; j < links.Count() && addedMembers < maxAmount; ++j )
+ {
+
+ addedMembers += iPhonebookWrapper->AddContactToGroup(newGroupId,links[j]);
+
+ }
+ if( addedMembers < maxAmount )
+ {
+ // Add existing contacts, withing the limits set by maxAmount:
+ amountOfContactsToBeAdded += maxAmount - addedMembers;
+ }
+ }
+ }
+ if( amountOfContactsToBeAdded > 0 )
+ {
+ TInt addedContacts = iPhonebookWrapper->AddToGroup(newGroupId, amountOfContactsToBeAdded);
+
+ }
+
+ // store the link to contact, so that Creator is able to delete
+ // it when user requests deletion of contacts that were created with Creator
+ iContactGroupsToDelete.Append( newGroupId );
+
+ return err;
+ }
+
+//----------------------------------------------------------------------------
+
+TInt CCreatorPhonebook::CreateSubscribedContactEntryL(CCreatorModuleBaseParameters* /*aParameters*/)
+ {
+ LOGSTRING("Creator: CCreatorPhonebook::CreateSubscribedContactEntryL");
+
+ return KErrNotSupported;
+ }
+
+//----------------------------------------------------------------------------
+
+CCreatorContactField::CCreatorContactField()
+ {
+ }
+CCreatorContactField::~CCreatorContactField()
+ {
+ }
+
+CCreatorContactField* CCreatorContactField::NewL()
+ {
+ CCreatorContactField* self = new (ELeave) CCreatorContactField();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+void CCreatorContactField::ConstructL()
+ {
+ }
+
+
+void CCreatorContactField::AddFieldToParamL( CCreatorEngine* aEngine, CPhonebookParameters* aParam, TInt aType, TInt aRand )
+ {
+ HBufC* content = NULL;
+ if( aRand == KErrNotFound )
+ {
+ TInt textFieldCount = sizeof(CreatorPbkPhoneNumberFields)/sizeof(TInt);;
+ for( TInt tfIndex = 0; tfIndex < textFieldCount; ++tfIndex )
+ {
+ if( CreatorPbkPhoneNumberFields[tfIndex] == aType )
+ {
+ content = aEngine->RandomString(CCreatorEngine::EPhoneNumber).AllocL();
+ break;
+ }
+ }
+
+ textFieldCount = sizeof(CreatorPbkUrlFields)/sizeof(TInt);;
+ for( TInt tfIndex = 0; tfIndex < textFieldCount; ++tfIndex )
+ {
+ if( CreatorPbkUrlFields[tfIndex] == aType )
+ {
+ content = aEngine->CreateHTTPUrlLC();
+ CleanupStack::Pop();
+ break;
+ }
+ }
+ textFieldCount = sizeof(CreatorPbkEmailFields)/sizeof(TInt);;
+ for( TInt tfIndex = 0; tfIndex < textFieldCount; ++tfIndex )
+ {
+ if( CreatorPbkEmailFields[tfIndex] == aType )
+ {
+ content = aEngine->CreateEmailAddressLC();
+ CleanupStack::Pop();
+ break;
+ }
+ }
+
+
+ //if there is textfield without specified random number
+ textFieldCount = sizeof(CreatorPbkMiscTextFields) / sizeof(DetailFieldInfo);
+ for( TInt tfIndex = 0; tfIndex < textFieldCount; ++tfIndex )
+ {
+ if( CreatorPbkMiscTextFields[tfIndex].iFieldCode == aType && CreatorPbkMiscTextFields[tfIndex].iRandomType != RND_TYPE_UNDEF )
+ {
+ TInt rand = CreatorPbkMiscTextFields[tfIndex].iRandomType;
+ content = aEngine->RandomString((CCreatorEngine::TRandomStringType) rand).AllocL();
+ break;
+ }
+ }
+ }
+
+ if( aRand != KErrNotFound && aRand != RND_TYPE_UNDEF )
+ {
+ TInt textFieldCount = sizeof(CreatorPbkMiscTextFields) / sizeof(DetailFieldInfo);
+ for( TInt tfIndex = 0; tfIndex < textFieldCount; ++tfIndex )
+ {
+ if( CreatorPbkMiscTextFields[tfIndex].iFieldCode == aType )
+ {
+ content = aEngine->RandomString((CCreatorEngine::TRandomStringType) aRand).AllocL();
+ }
+ }
+ }
+
+ aParam->iContactFields.insert( TCreatorContactField(aType, content) );
+ }
+
+void CCreatorContactField::AddFieldToParamL( CPhonebookParameters* aParam, TInt aType, TPtrC aContent )
+ {
+ aParam->iContactFields.insert( TCreatorContactField(aType, aContent.AllocL()) );
+ }
+
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+