creator/src/creator_virtualphonebook.cpp
changeset 0 d6fe6244b863
equal deleted inserted replaced
-1:000000000000 0:d6fe6244b863
       
     1 /*
       
     2 * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 #include "creator_virtualphonebook.h" 
       
    21 #include "creator_traces.h"
       
    22 #include "creator_contactsetcache.h"
       
    23 
       
    24 #include <CVPbkContactStoreUriArray.h>
       
    25 #include <VPbkContactStoreUris.h>
       
    26 #include <TVPbkContactStoreUriPtr.h>
       
    27 #include <MVPbkContactGroup.h>
       
    28 #include <MVPbkContactStore.h>
       
    29 #include <CVPbkContactManager.h>
       
    30 #include <MVPbkContactStoreList.h>
       
    31 #include <MVPbkContactStoreListObserver.h>
       
    32 #include <MVPbkContactOperationBase.h>
       
    33 #include <MVPbkStoreContact.h>
       
    34 #include <MVPbkContactStoreProperties.h>
       
    35 #include <MVPbkContactFieldData.h>
       
    36 #include <MVPbkFieldType.h>
       
    37 #include <MVPbkContactFieldTextData.h>
       
    38 #include <MVPbkContactFieldBinaryData.h>
       
    39 #include <MVPbkContactFieldDateTimeData.h>
       
    40 #include <CVPbkContactViewDefinition.h>
       
    41 #include <MVPbkContactView.h>
       
    42 
       
    43 #include <VPbkContactView.hrh>
       
    44 #include <VPbkEng.rsg>
       
    45 
       
    46 typedef struct {
       
    47 TInt iFieldCode;
       
    48 TInt iRandomType;
       
    49 } FieldInfo;
       
    50 static const TInt RND_TYPE_UNDEF = -99;
       
    51 FieldInfo CreatorVPbkMiscTextFields[] = {        
       
    52         {R_VPBK_FIELD_TYPE_FIRSTNAME, (TInt) CCreatorEngine::EFirstName},
       
    53         {R_VPBK_FIELD_TYPE_FIRSTNAMEREADING, (TInt) CCreatorEngine::EFirstName},
       
    54         {R_VPBK_FIELD_TYPE_LASTNAME, (TInt) CCreatorEngine::ESurname},
       
    55         {R_VPBK_FIELD_TYPE_LASTNAMEREADING, (TInt) CCreatorEngine::ESurname},
       
    56         {R_VPBK_FIELD_TYPE_COMPANYNAME, (TInt) CCreatorEngine::ECompany},
       
    57         {R_VPBK_FIELD_TYPE_JOBTITLE, (TInt) CCreatorEngine::EJobTitle},
       
    58         {R_VPBK_FIELD_TYPE_PREFIX, (TInt) CCreatorEngine::EPrefix},
       
    59         {R_VPBK_FIELD_TYPE_SUFFIX, (TInt) CCreatorEngine::ESuffix},
       
    60         {R_VPBK_FIELD_TYPE_SECONDNAME, (TInt) CCreatorEngine::EFirstName},
       
    61         {R_VPBK_FIELD_TYPE_ADDRLABELGEN, (TInt) CCreatorEngine::EAddress},
       
    62         {R_VPBK_FIELD_TYPE_ADDRPOGEN, (TInt) CCreatorEngine::EPobox},
       
    63         {R_VPBK_FIELD_TYPE_ADDREXTGEN, (TInt) CCreatorEngine::EAddress},
       
    64         {R_VPBK_FIELD_TYPE_ADDRSTREETGEN, (TInt) CCreatorEngine::EAddress},
       
    65         {R_VPBK_FIELD_TYPE_ADDRLOCALGEN, (TInt) CCreatorEngine::ECity},
       
    66         {R_VPBK_FIELD_TYPE_ADDRREGIONGEN, (TInt) CCreatorEngine::EState},
       
    67         {R_VPBK_FIELD_TYPE_ADDRPOSTCODEGEN, (TInt) CCreatorEngine::EPostcode},
       
    68         {R_VPBK_FIELD_TYPE_ADDRCOUNTRYGEN, (TInt) CCreatorEngine::ECountry},
       
    69         {R_VPBK_FIELD_TYPE_ADDRLABELHOME, (TInt) CCreatorEngine::EAddress},
       
    70         {R_VPBK_FIELD_TYPE_ADDRPOHOME, (TInt) CCreatorEngine::EPobox},
       
    71         {R_VPBK_FIELD_TYPE_ADDREXTHOME, (TInt) CCreatorEngine::EAddress},
       
    72         {R_VPBK_FIELD_TYPE_ADDRSTREETHOME, (TInt) CCreatorEngine::EAddress},
       
    73         {R_VPBK_FIELD_TYPE_ADDRLOCALHOME, (TInt) CCreatorEngine::ECity},
       
    74         {R_VPBK_FIELD_TYPE_ADDRREGIONHOME, (TInt) CCreatorEngine::EState},
       
    75         {R_VPBK_FIELD_TYPE_ADDRPOSTCODEHOME, (TInt) CCreatorEngine::EPostcode},
       
    76         {R_VPBK_FIELD_TYPE_ADDRCOUNTRYHOME, (TInt) CCreatorEngine::ECountry},
       
    77         {R_VPBK_FIELD_TYPE_ADDRLABELWORK, (TInt) CCreatorEngine::EAddress},
       
    78         {R_VPBK_FIELD_TYPE_ADDRPOWORK, (TInt) CCreatorEngine::EPobox},
       
    79         {R_VPBK_FIELD_TYPE_ADDREXTWORK, (TInt) CCreatorEngine::EAddress},
       
    80         {R_VPBK_FIELD_TYPE_ADDRSTREETWORK, (TInt) CCreatorEngine::EAddress},
       
    81         {R_VPBK_FIELD_TYPE_ADDRLOCALWORK, (TInt) CCreatorEngine::ECity},
       
    82         {R_VPBK_FIELD_TYPE_ADDRREGIONWORK, (TInt) CCreatorEngine::EState},
       
    83         {R_VPBK_FIELD_TYPE_ADDRPOSTCODEWORK, (TInt) CCreatorEngine::EPostcode},
       
    84         {R_VPBK_FIELD_TYPE_ADDRCOUNTRYWORK, (TInt) CCreatorEngine::ECountry},
       
    85         {R_VPBK_FIELD_TYPE_POC, (TInt) CCreatorEngine::EPhoneNumber},
       
    86         {R_VPBK_FIELD_TYPE_SWIS, (TInt) CCreatorEngine::EPhoneNumber},
       
    87         {R_VPBK_FIELD_TYPE_SIP, (TInt) CCreatorEngine::EPhoneNumber},
       
    88         {R_VPBK_FIELD_TYPE_DTMFSTRING, (TInt) CCreatorEngine::EFirstName},
       
    89         {R_VPBK_FIELD_TYPE_NOTE,(TInt)  CCreatorEngine::EMemoText},
       
    90         {R_VPBK_FIELD_TYPE_MIDDLENAME, (TInt) CCreatorEngine::EFirstName},
       
    91         {R_VPBK_FIELD_TYPE_DEPARTMENT, (TInt) CCreatorEngine::ECompany},
       
    92         {R_VPBK_FIELD_TYPE_ASSTNAME, (TInt) CCreatorEngine::EFirstName},
       
    93         {R_VPBK_FIELD_TYPE_SPOUSE, (TInt) CCreatorEngine::EFirstName},
       
    94         {R_VPBK_FIELD_TYPE_CHILDREN, (TInt) CCreatorEngine::EFirstName},
       
    95         {R_VPBK_FIELD_TYPE_SYNCCLASS, RND_TYPE_UNDEF},
       
    96         {R_VPBK_FIELD_TYPE_LOCPRIVACY, RND_TYPE_UNDEF},
       
    97         {R_VPBK_FIELD_TYPE_GENLABEL, (TInt) CCreatorEngine::EFirstName},
       
    98         {R_VPBK_FIELD_TYPE_WVADDRESS, (TInt) CCreatorEngine::EPhoneNumber},
       
    99         {R_VPBK_FIELD_TYPE_RINGTONE, RND_TYPE_UNDEF},
       
   100         {R_VPBK_FIELD_TYPE_THUMBNAILPIC, RND_TYPE_UNDEF},
       
   101         {R_VPBK_FIELD_TYPE_CALLEROBJTEXT, (TInt) CCreatorEngine::EFirstName}
       
   102         };
       
   103                     
       
   104 TInt CreatorVPbkBinaryFields[] = {
       
   105         R_VPBK_FIELD_TYPE_CALLEROBJIMG//,
       
   106         //R_VPBK_FIELD_TYPE_THUMBNAILPATH
       
   107         };
       
   108 
       
   109 TInt CreatorVPbkDateTimeFields[] = {
       
   110         R_VPBK_FIELD_TYPE_ANNIVERSARY
       
   111         };
       
   112 
       
   113 //----------------------------------------------------------------------------
       
   114 TInt CreatorVPbkPhoneNumberFields[] =
       
   115     {
       
   116     R_VPBK_FIELD_TYPE_LANDPHONEGEN,
       
   117     R_VPBK_FIELD_TYPE_LANDPHONEHOME,
       
   118     R_VPBK_FIELD_TYPE_LANDPHONEWORK,                        
       
   119     R_VPBK_FIELD_TYPE_MOBILEPHONEGEN,
       
   120     R_VPBK_FIELD_TYPE_MOBILEPHONEHOME,
       
   121     R_VPBK_FIELD_TYPE_MOBILEPHONEWORK,
       
   122     R_VPBK_FIELD_TYPE_FAXNUMBERGEN,
       
   123     R_VPBK_FIELD_TYPE_FAXNUMBERHOME,
       
   124     R_VPBK_FIELD_TYPE_FAXNUMBERWORK,
       
   125     R_VPBK_FIELD_TYPE_PAGERNUMBER,           
       
   126     R_VPBK_FIELD_TYPE_VIDEONUMBERGEN,
       
   127     R_VPBK_FIELD_TYPE_VIDEONUMBERHOME,
       
   128     R_VPBK_FIELD_TYPE_VIDEONUMBERWORK,
       
   129     R_VPBK_FIELD_TYPE_VOIPGEN,
       
   130     R_VPBK_FIELD_TYPE_VOIPHOME,
       
   131     R_VPBK_FIELD_TYPE_VOIPWORK,
       
   132     R_VPBK_FIELD_TYPE_ASSTPHONE,
       
   133     R_VPBK_FIELD_TYPE_CARPHONE
       
   134     };
       
   135 
       
   136 TInt CreatorVPbkUrlFields[] =
       
   137     {
       
   138     R_VPBK_FIELD_TYPE_URLGEN,
       
   139     R_VPBK_FIELD_TYPE_URLHOME,
       
   140     R_VPBK_FIELD_TYPE_URLWORK
       
   141     };
       
   142 
       
   143 TInt CreatorVPbkEmailFields[] =
       
   144     {
       
   145     R_VPBK_FIELD_TYPE_EMAILGEN,
       
   146     R_VPBK_FIELD_TYPE_EMAILHOME,
       
   147     R_VPBK_FIELD_TYPE_EMAILWORK
       
   148     };
       
   149 
       
   150 //----------------------------------------------------------------------------
       
   151 
       
   152 CVirtualPhonebookParameters::CVirtualPhonebookParameters()
       
   153     {
       
   154     LOGSTRING("Creator: CVirtualPhonebookParameters::CVirtualPhonebookParameters");
       
   155     iGroupName = HBufC::New(KPhonebookFieldLength);  
       
   156     }
       
   157 
       
   158 CVirtualPhonebookParameters::~CVirtualPhonebookParameters()
       
   159     {
       
   160     LOGSTRING("Creator: CVirtualPhonebookParameters::~CVirtualPhonebookParameters");
       
   161 
       
   162     delete iGroupName;   
       
   163     iContactFields.ResetAndDestroy();
       
   164     iContactFields.Close();
       
   165     iLinkIds.Reset();
       
   166     iLinkIds.Close();
       
   167     }
       
   168 
       
   169 void CVirtualPhonebookParameters::ParseL(CCommandParser* /*parser*/, TParseParams /*aCase = 0*/)
       
   170 	{
       
   171 	}
       
   172 
       
   173 TInt CVirtualPhonebookParameters::ScriptLinkId() const
       
   174     {
       
   175     return iLinkId;
       
   176     }
       
   177 
       
   178 void CVirtualPhonebookParameters::SetScriptLinkId(TInt aLinkId)
       
   179     {
       
   180     iLinkId = aLinkId;
       
   181     }
       
   182 
       
   183 //----------------------------------------------------------------------------
       
   184 
       
   185 CCreatorVirtualPhonebook* CCreatorVirtualPhonebook::NewL(CCreatorEngine* aEngine)
       
   186     {
       
   187     CCreatorVirtualPhonebook* self = CCreatorVirtualPhonebook::NewLC(aEngine);
       
   188     CleanupStack::Pop(self);
       
   189     return self;
       
   190     }
       
   191 
       
   192 CCreatorVirtualPhonebook* CCreatorVirtualPhonebook::NewLC(CCreatorEngine* aEngine)
       
   193     {
       
   194     CCreatorVirtualPhonebook* self = new (ELeave) CCreatorVirtualPhonebook;
       
   195     CleanupStack::PushL(self);
       
   196     self->ConstructL(aEngine);
       
   197     return self;
       
   198     }
       
   199 
       
   200 CCreatorVirtualPhonebook::CCreatorVirtualPhonebook()
       
   201     {    
       
   202     iAddAllFields = EFalse;
       
   203     }
       
   204 
       
   205 void CCreatorVirtualPhonebook::ConstructL(CCreatorEngine* aEngine)
       
   206     {
       
   207     LOGSTRING("Creator: CCreatorVirtualPhonebook::ConstructL");
       
   208 
       
   209     iContactLinkArray = CVPbkContactLinkArray::NewL();
       
   210     iContactsToDelete = CVPbkContactLinkArray::NewL();
       
   211     iContactGroupsToDelete = CVPbkContactLinkArray::NewL();
       
   212     
       
   213     iEngine = aEngine;
       
   214     SetDefaultParameters();
       
   215     
       
   216     // initialize virtual phonebook
       
   217     CVPbkContactStoreUriArray* uriArray = CVPbkContactStoreUriArray::NewLC();
       
   218     uriArray->AppendL( TVPbkContactStoreUriPtr(VPbkContactStoreUris::DefaultCntDbUri()));
       
   219     iContactManager = CVPbkContactManager::NewL( *uriArray, &CCoeEnv::Static()->FsSession());
       
   220     CleanupStack::PopAndDestroy(uriArray);
       
   221     
       
   222     //When the contact manager is created, the stores is opened
       
   223     MVPbkContactStoreList& storeList = iContactManager->ContactStoresL();
       
   224     
       
   225     iWaiter = CAsyncWaiter::NewL();
       
   226 
       
   227     //MVPbkContactStoreListObserver must give as parameter    
       
   228     storeList.OpenAllL(*this);
       
   229     // wait for OpenComplete() callback
       
   230     iWaiter->StartAndWait();
       
   231     
       
   232     _LIT(dbUri, "cntdb://c:contacts.cdb");
       
   233     const TVPbkContactStoreUriPtr uri = TVPbkContactStoreUriPtr(dbUri);
       
   234        
       
   235     iStore = storeList.Find(uri);    
       
   236     iOpCounter = 0;    
       
   237     }
       
   238 
       
   239 TBool CCreatorVirtualPhonebook::IsActive()
       
   240     {
       
   241     LOGSTRING("Creator: CCreatorVirtualPhonebook::IsActive");
       
   242     return iOperation != NULL;
       
   243     }
       
   244 
       
   245 void CCreatorVirtualPhonebook::CancelOperation()
       
   246     {
       
   247     LOGSTRING("Creator: CCreatorVirtualPhonebook::CancelOperation");
       
   248     iCancelCbRequested = ETrue;    
       
   249     }
       
   250 
       
   251 CCreatorVirtualPhonebook::~CCreatorVirtualPhonebook()
       
   252     {
       
   253     LOGSTRING("Creator: CCreatorVirtualPhonebook::~CCreatorVirtualPhonebook");
       
   254     
       
   255     // this is done only once per phonebook operation
       
   256     if ( iContactsToDelete && iContactsToDelete->Count() )
       
   257         {
       
   258         TRAP_IGNORE( StoreLinksForDeleteL( *iContactsToDelete, KUidDictionaryUidContacts ) );
       
   259         }
       
   260     delete iContactsToDelete;
       
   261     if ( iContactGroupsToDelete && iContactGroupsToDelete->Count() )
       
   262         {
       
   263         TRAP_IGNORE( StoreLinksForDeleteL( *iContactGroupsToDelete, KUidDictionaryUidContactGroups ) );
       
   264         }
       
   265     delete iContactGroupsToDelete;
       
   266     
       
   267     iPreviousDeleteLinks.ResetAndDestroy();
       
   268     
       
   269     delete iOperation;
       
   270     
       
   271     TInt err = 0;
       
   272     TRAP(err, CompactPbkDatabaseL( ETrue ));
       
   273 
       
   274     if(iContactResults)
       
   275     	{
       
   276     	delete iContactResults;
       
   277     	}
       
   278     
       
   279     delete iContactLinkArray;
       
   280     delete iContactGroupsInStore;
       
   281     
       
   282     if(iContactManager)
       
   283     	{
       
   284     	TRAP(err, iContactManager->ContactStoresL().CloseAll(*this));
       
   285     	delete iContactManager;
       
   286     	}
       
   287     if(iWaiter)
       
   288     	{
       
   289     	delete iWaiter;    
       
   290     	}
       
   291     if (iParameters)
       
   292     	{
       
   293         delete iParameters;
       
   294     	}
       
   295     }
       
   296 
       
   297 //----------------------------------------------------------------------------
       
   298 TBool CCreatorVirtualPhonebook::AskDataFromUserL(TInt aCommand, TInt& aNumberOfEntries)
       
   299     {
       
   300     LOGSTRING("Creator: CCreatorVirtualPhonebook::AskDataFromUserL");
       
   301     TBool ret = CCreatorPhonebookBase::AskDataFromUserL(aCommand, aNumberOfEntries);
       
   302    
       
   303     if(ret && aCommand == ECmdCreatePhoneBookEntryContacts && !iDefaultFieldsSelected)    
       
   304         {
       
   305         iAddAllFields = iEngine->YesNoQueryDialogL(_L("Add all the other fields to contacts?"));
       
   306         }
       
   307     return ret;
       
   308     }
       
   309 
       
   310 //----------------------------------------------------------------------------
       
   311 void CCreatorVirtualPhonebook::DeleteAllL()
       
   312     {
       
   313     LOGSTRING("Creator: CCreatorVirtualPhonebook::DeleteAllL");
       
   314     
       
   315     // Delete all contacts, not contact groups
       
   316     
       
   317     //get field types
       
   318     const MVPbkFieldTypeList& fieldList = iStore->StoreProperties().SupportedFields();
       
   319         
       
   320     // get all contact links, results will be set to iContactResults
       
   321     MVPbkContactOperationBase* operation = iContactManager->FindL( _L(""), fieldList , *this );
       
   322     if ( operation )
       
   323         {
       
   324         iWaiter->StartAndWait(); //Making asynchronous FindL to synchronous
       
   325         delete operation;
       
   326         }
       
   327     
       
   328     while( iContactResults->Count() && 
       
   329            !iCancelCbRequested &&
       
   330            HasOtherThanGroupsL( iContactResults ) )
       
   331         {
       
   332         // delete all found contacts
       
   333         DeleteContactsL( iContactResults, EFalse );
       
   334         
       
   335         if ( !iCancelCbRequested )
       
   336             {
       
   337             // find next set of contacts to delete
       
   338             MVPbkContactOperationBase* operation = iContactManager->FindL( _L(""), fieldList , *this );
       
   339             if ( operation )
       
   340                 {
       
   341                 iWaiter->StartAndWait(); //Making asynchronous FindL to synchronous
       
   342                 delete operation;
       
   343                 }
       
   344             }
       
   345         }
       
   346     
       
   347     if ( iCancelCbRequested && iEngine )
       
   348         {
       
   349         // User cancelled, must callback to finish terminatio sequence
       
   350         iEngine->CancelComplete();
       
   351         }
       
   352     else
       
   353         {
       
   354         // contacts deleted, remove the Creator internal contact registry
       
   355         // (no callback required)
       
   356         CDictionaryFileStore* store = iEngine->FileStoreLC();
       
   357         if ( store )
       
   358             {
       
   359             store->Remove( KUidDictionaryUidContacts );
       
   360             store->CommitL();        
       
   361             }
       
   362         CleanupStack::PopAndDestroy( store );
       
   363         }    
       
   364     }
       
   365 
       
   366 //----------------------------------------------------------------------------
       
   367 void CCreatorVirtualPhonebook::DeleteAllCreatedByCreatorL()
       
   368     {
       
   369     LOGSTRING("Creator: CCreatorVirtualPhonebook::DeleteAllCreatedByCreatorL");
       
   370     DeleteItemsCreatedWithCreatorL( KUidDictionaryUidContacts );
       
   371     }
       
   372 
       
   373 //----------------------------------------------------------------------------
       
   374 void CCreatorVirtualPhonebook::DeleteAllGroupsL()
       
   375     {
       
   376     LOGSTRING("Creator: CCreatorVirtualPhonebook::DeleteAllGroupsL");
       
   377     User::LeaveIfNull( iStore );
       
   378     MVPbkContactLinkArray* groups = iStore->ContactGroupsLC();
       
   379     DeleteContactsL( groups, ETrue );
       
   380     CleanupStack::PopAndDestroy(); // cannot use groups as parameter
       
   381     }
       
   382 
       
   383 //----------------------------------------------------------------------------
       
   384 void CCreatorVirtualPhonebook::DeleteAllGroupsCreatedByCreatorL()
       
   385     {
       
   386     LOGSTRING("Creator: CCreatorVirtualPhonebook::DeleteAllGroupsCreatedByCreatorL");
       
   387     DeleteItemsCreatedWithCreatorL( KUidDictionaryUidContactGroups );
       
   388     }
       
   389 
       
   390 //----------------------------------------------------------------------------
       
   391 void CCreatorVirtualPhonebook::DeleteContactsL( MVPbkContactLinkArray* aContacts, TBool aGroup )
       
   392     {
       
   393     LOGSTRING("Creator: CCreatorVirtualPhonebook::DeleteContactsL");
       
   394     const MVPbkContactLink* link( NULL );
       
   395     delete iOperation;
       
   396     iOperation = NULL;
       
   397     TInt i(0);
       
   398     while ( aContacts && i < aContacts->Count() && !iCancelCbRequested )
       
   399         {
       
   400         link = &aContacts->At( i++ );
       
   401         if ( aGroup == IsContactGroupL( *link ) )
       
   402             {
       
   403             iOperation = iContactManager->RetrieveContactL( *link, *this );
       
   404             // see VPbkSingleContactOperationComplete
       
   405             if ( iOperation )
       
   406                 {
       
   407                 iWaiter->StartAndWait();
       
   408                 delete iOperation;
       
   409                 iOperation = NULL;
       
   410                 }            
       
   411             }
       
   412         link = NULL;
       
   413         }
       
   414     }
       
   415 
       
   416 //----------------------------------------------------------------------------
       
   417 void CCreatorVirtualPhonebook::DeleteItemsCreatedWithCreatorL( TUid aStoreUid )
       
   418     {
       
   419     LOGSTRING("Creator: CCreatorVirtualPhonebook::DeleteItemsCreatedWithCreatorL");
       
   420     __ASSERT_ALWAYS( aStoreUid == KUidDictionaryUidContacts || 
       
   421                      aStoreUid == KUidDictionaryUidContactGroups,
       
   422                      User::Panic( _L("CCreatorVPb"), KErrArgument ) );
       
   423     CDictionaryFileStore* store = iEngine->FileStoreLC();
       
   424     User::LeaveIfNull( store );
       
   425     if ( store->IsPresentL( aStoreUid ) )
       
   426         {
       
   427         TRAP_IGNORE( DoDeleteItemsCreatedWithCreatorL( aStoreUid, store ) );
       
   428 
       
   429         if ( iCancelCbRequested && iEngine )
       
   430             {
       
   431             iEngine->CancelComplete();
       
   432             }
       
   433         else
       
   434             {
       
   435             // contacts deleted, remove the Creator internal contact registry
       
   436             store->Remove( aStoreUid );
       
   437             store->CommitL();            
       
   438             }
       
   439         }
       
   440     CleanupStack::PopAndDestroy( store );
       
   441     }
       
   442 
       
   443 //----------------------------------------------------------------------------
       
   444 void CCreatorVirtualPhonebook::DoDeleteItemsCreatedWithCreatorL( TUid aStoreUid, CDictionaryFileStore* aStore )
       
   445     {
       
   446     LOGSTRING("Creator: CCreatorVirtualPhonebook::DoDeleteItemsCreatedWithCreatorL");
       
   447     RDictionaryReadStream in;
       
   448     in.OpenLC( *aStore, aStoreUid );
       
   449     MVPbkContactLinkArray* contactsToDelete = NULL;
       
   450     // fetch contact links from store
       
   451     while ( ( contactsToDelete = iContactManager->CreateLinksLC( in ) ) != NULL && // will leave with KErrEof
       
   452             !iCancelCbRequested ) 
       
   453         {
       
   454         DeleteContactsL( contactsToDelete, aStoreUid == KUidDictionaryUidContactGroups );
       
   455         // PopAndDestroy for contactsToDelete causes E32USER-CBase:90
       
   456         // however there is no mem-leak even if not deleting contactsToDelete object
       
   457         }
       
   458     CleanupStack::PopAndDestroy(); // in
       
   459     }
       
   460 
       
   461 //----------------------------------------------------------------------------
       
   462 TBool CCreatorVirtualPhonebook::HasOtherThanGroupsL( MVPbkContactLinkArray* aContacts )
       
   463     {
       
   464     LOGSTRING("Creator: CCreatorVirtualPhonebook::HasOtherThanGroupsL");
       
   465     TBool result( EFalse );
       
   466     TInt i(0);
       
   467     while ( aContacts && i < aContacts->Count() && !iCancelCbRequested && !result )
       
   468         {
       
   469         if ( !IsContactGroupL( aContacts->At( i++ ) ) )
       
   470             {
       
   471             result = ETrue;
       
   472             }
       
   473         }
       
   474     return result;
       
   475     }
       
   476 
       
   477 //----------------------------------------------------------------------------
       
   478 void CCreatorVirtualPhonebook::VPbkSingleContactOperationComplete(
       
   479                 MVPbkContactOperationBase& /*aOperation*/,
       
   480                 MVPbkStoreContact* aContact )
       
   481     {
       
   482     LOGSTRING("Creator: CCreatorVirtualPhonebook::VPbkSingleContactOperationComplete");
       
   483     
       
   484     // This callback is currently used only for deleting a contact
       
   485     // See DeleteContactsL
       
   486     
       
   487     TRAP_IGNORE( 
       
   488             aContact->PushL();
       
   489             aContact->DeleteL( *this );
       
   490             CleanupStack::PopAndDestroy( aContact );
       
   491         );
       
   492     }
       
   493 
       
   494 void CCreatorVirtualPhonebook::VPbkSingleContactOperationFailed(
       
   495                 MVPbkContactOperationBase& /*aOperation*/, 
       
   496                 TInt /*aError*/ )
       
   497     {
       
   498     LOGSTRING("Creator: CCreatorVirtualPhonebook::VPbkSingleContactOperationFailed");
       
   499     iWaiter->Cancel();
       
   500     }
       
   501 
       
   502 //----------------------------------------------------------------------------
       
   503 void CCreatorVirtualPhonebook::StoreLinksForDeleteL( MVPbkContactLinkArray& aLinks, TUid aStoreUid )
       
   504     {
       
   505     LOGSTRING("Creator: CCreatorVirtualPhonebook::StoreLinksForDeleteL");
       
   506     CDictionaryFileStore* store = iEngine->FileStoreLC();
       
   507     User::LeaveIfNull( store );
       
   508     
       
   509     // backup previous contact links from store
       
   510     // otherwise they would be overwritten when calling out.WriteL
       
   511     MVPbkContactLinkArray* previousLinks( NULL );
       
   512     if ( store->IsPresentL( aStoreUid ) )
       
   513         {
       
   514         RDictionaryReadStream in;
       
   515         in.OpenLC( *store, aStoreUid );        
       
   516         TRAP_IGNORE( 
       
   517             while ( ( previousLinks = iContactManager->CreateLinksLC( in )) != NULL ) // will leave with KErrEof
       
   518                 {
       
   519                 CleanupStack::Pop(); // previousLinks
       
   520                 iPreviousDeleteLinks.Append( previousLinks );
       
   521                 previousLinks = NULL;
       
   522                 }
       
   523             );
       
   524         CleanupStack::PopAndDestroy(); // in
       
   525         }
       
   526 
       
   527     RDictionaryWriteStream out;       
       
   528     out.AssignLC( *store, aStoreUid );
       
   529     
       
   530     // restore previous links
       
   531     for ( TInt i = 0; i < iPreviousDeleteLinks.Count(); i++ )
       
   532         {
       
   533         out.WriteL( *iPreviousDeleteLinks[i]->PackLC() );
       
   534         CleanupStack::PopAndDestroy(); // PackLC            
       
   535         }
       
   536     iPreviousDeleteLinks.ResetAndDestroy();
       
   537     
       
   538     // write new links
       
   539     out.WriteL( *aLinks.PackLC() );
       
   540     out.CommitL();
       
   541     CleanupStack::PopAndDestroy(); // aLinks.PackLC
       
   542     CleanupStack::PopAndDestroy(); // out
       
   543     
       
   544     store->CommitL();
       
   545     CleanupStack::PopAndDestroy( store );
       
   546     }
       
   547 
       
   548 //----------------------------------------------------------------------------
       
   549 void CCreatorVirtualPhonebook::AddFieldToParamsL(TInt aFieldType, const TDesC& aData)
       
   550     {
       
   551     LOGSTRING("Creator: CCreatorVirtualPhonebook::AddFieldToParamsL(TInt aFieldType, const TDesC& aData)");
       
   552     if(iParameters == 0)
       
   553         return;
       
   554     CCreatorContactField* field = CCreatorContactField::NewL(aFieldType, aData);
       
   555     CleanupStack::PushL(field);
       
   556     iParameters->iContactFields.AppendL(field);
       
   557     CleanupStack::Pop();
       
   558     }
       
   559 
       
   560 void CCreatorVirtualPhonebook::AddFieldToParamsL(TInt aFieldType, const TDesC8& aData)
       
   561     {
       
   562     LOGSTRING("Creator: CCreatorVirtualPhonebook::AddFieldToParamsL(TInt aFieldType, const TDesC8& aData)");
       
   563     if(iParameters == 0)
       
   564         return;
       
   565     CCreatorContactField* field = CCreatorContactField::NewL(aFieldType, aData);
       
   566     CleanupStack::PushL(field);
       
   567     iParameters->iContactFields.AppendL(field);
       
   568     CleanupStack::Pop();
       
   569     }
       
   570 
       
   571 void CCreatorVirtualPhonebook::AddFieldToParamsL(TInt aFieldType, const TTime& aData)
       
   572     {
       
   573     LOGSTRING("Creator: CCreatorVirtualPhonebook::AddFieldToParamsL(TInt aFieldType, const TTime& aData)");
       
   574     if(iParameters == 0)
       
   575         return;
       
   576     CCreatorContactField* field = CCreatorContactField::NewL(aFieldType, aData);
       
   577     CleanupStack::PushL(field);
       
   578     iParameters->iContactFields.AppendL(field);
       
   579     CleanupStack::Pop();
       
   580     }
       
   581        
       
   582 //----------------------------------------------------------------------------
       
   583 TInt CCreatorVirtualPhonebook::iPhoneNumberFields[] =
       
   584     {
       
   585     R_VPBK_FIELD_TYPE_LANDPHONEGEN,
       
   586     R_VPBK_FIELD_TYPE_LANDPHONEHOME,
       
   587     R_VPBK_FIELD_TYPE_LANDPHONEWORK,                        
       
   588     R_VPBK_FIELD_TYPE_MOBILEPHONEGEN,
       
   589     R_VPBK_FIELD_TYPE_MOBILEPHONEHOME,
       
   590     R_VPBK_FIELD_TYPE_MOBILEPHONEWORK,
       
   591     R_VPBK_FIELD_TYPE_FAXNUMBERGEN,
       
   592     R_VPBK_FIELD_TYPE_FAXNUMBERHOME,
       
   593     R_VPBK_FIELD_TYPE_FAXNUMBERWORK,
       
   594     R_VPBK_FIELD_TYPE_PAGERNUMBER,           
       
   595     R_VPBK_FIELD_TYPE_VIDEONUMBERGEN,
       
   596     R_VPBK_FIELD_TYPE_VIDEONUMBERHOME,
       
   597     R_VPBK_FIELD_TYPE_VIDEONUMBERWORK,
       
   598     R_VPBK_FIELD_TYPE_VOIPGEN,
       
   599     R_VPBK_FIELD_TYPE_VOIPHOME,
       
   600     R_VPBK_FIELD_TYPE_VOIPWORK,
       
   601     R_VPBK_FIELD_TYPE_ASSTPHONE,
       
   602     R_VPBK_FIELD_TYPE_CARPHONE
       
   603     };
       
   604 
       
   605 TInt CCreatorVirtualPhonebook::iUrlFields[] =
       
   606     {
       
   607     R_VPBK_FIELD_TYPE_URLGEN,
       
   608     R_VPBK_FIELD_TYPE_URLHOME,
       
   609     R_VPBK_FIELD_TYPE_URLWORK
       
   610     };
       
   611 
       
   612 TInt CCreatorVirtualPhonebook::iEmailFields[] =
       
   613     {
       
   614     R_VPBK_FIELD_TYPE_EMAILGEN,
       
   615     R_VPBK_FIELD_TYPE_EMAILHOME,
       
   616     R_VPBK_FIELD_TYPE_EMAILWORK
       
   617     };
       
   618 
       
   619 void CCreatorVirtualPhonebook::InitializeContactParamsL(/*CCreatorModuleBaseParameters* aParameters*/)
       
   620     {
       
   621     LOGSTRING("Creator: CCreatorPhonebook::InitializeContactParamsL");        
       
   622     iParameters = new (ELeave) CVirtualPhonebookParameters;
       
   623         
       
   624     iParameters->iNumberOfPhoneNumberFields = iNumberOfPhoneNumberFields;
       
   625     iParameters->iNumberOfURLFields = iNumberOfURLFields;
       
   626     iParameters->iNumberOfEmailAddressFields = iNumberOfEmailAddressFields;       
       
   627         
       
   628     TPtrC firstname = iEngine->RandomString(CCreatorEngine::EFirstName);
       
   629     TPtrC lastname  = iEngine->RandomString(CCreatorEngine::ESurname);               
       
   630                     
       
   631     if( iAddAllFields )
       
   632         {
       
   633         // Add text fields:
       
   634         TInt textFieldCount = sizeof(CreatorVPbkMiscTextFields) / sizeof(FieldInfo);
       
   635         for( TInt tfIndex = 0; tfIndex < textFieldCount; ++tfIndex )
       
   636             {                
       
   637             CCreatorContactField* field = CCreatorContactField::NewL(CreatorVPbkMiscTextFields[tfIndex].iFieldCode, KNullDesC);
       
   638             CleanupStack::PushL(field);
       
   639             field->SetRandomParametersL(CCreatorContactField::ERandomLengthDefault);
       
   640             iParameters->iContactFields.AppendL(field);
       
   641             CleanupStack::Pop(field);
       
   642             }
       
   643             
       
   644         // Add binary fields:
       
   645         TInt binFieldCount = sizeof(CreatorVPbkBinaryFields) / sizeof(TInt);
       
   646         for( TInt bfIndex = 0; bfIndex < binFieldCount; ++bfIndex )
       
   647             {                
       
   648             CCreatorContactField* field = CCreatorContactField::NewL(CreatorVPbkBinaryFields[bfIndex], KNullDesC8);
       
   649             CleanupStack::PushL(field);
       
   650             field->SetRandomParametersL(CCreatorContactField::ERandomLengthDefault);
       
   651             iParameters->iContactFields.AppendL(field);
       
   652             CleanupStack::Pop(field);
       
   653             }
       
   654             
       
   655         // Add date-time fields:
       
   656         TInt dtFieldCount = sizeof(CreatorVPbkDateTimeFields) / sizeof(TInt);
       
   657         for( TInt dtIndex = 0; dtIndex < dtFieldCount; ++dtIndex )
       
   658             {
       
   659             AddFieldToParamsL(CreatorVPbkDateTimeFields[dtIndex], iEngine->RandomDate(CCreatorEngine::EDateFuture));
       
   660             }
       
   661 
       
   662         AddFieldToParamsL(R_VPBK_FIELD_TYPE_CALLEROBJIMG, KNullDesC8);        
       
   663         AddFieldToParamsL(R_VPBK_FIELD_TYPE_THUMBNAILPIC, KNullDesC8);        
       
   664         AddFieldToParamsL(R_VPBK_FIELD_TYPE_CALLEROBJTEXT, firstname);
       
   665         }
       
   666     else
       
   667         {                      
       
   668         AddFieldToParamsL(R_VPBK_FIELD_TYPE_FIRSTNAME, firstname);            
       
   669         AddFieldToParamsL(R_VPBK_FIELD_TYPE_LASTNAME, lastname);            
       
   670         }
       
   671                     
       
   672     // Phone numbers:
       
   673     TInt arraySize = sizeof(iPhoneNumberFields)/sizeof(TInt);
       
   674     TInt index = 0;
       
   675     for (TInt i=0; i<iParameters->iNumberOfPhoneNumberFields; i++ )
       
   676         {            
       
   677         if( index >= arraySize )
       
   678             {
       
   679             index = 0;
       
   680             }
       
   681         if( arraySize > 0  )
       
   682             {
       
   683             CCreatorContactField* field = CCreatorContactField::NewL(iPhoneNumberFields[index], KNullDesC);
       
   684             CleanupStack::PushL(field);
       
   685             field->SetRandomParametersL(CCreatorContactField::ERandomLengthDefault);
       
   686             iParameters->iContactFields.AppendL(field);
       
   687             CleanupStack::Pop(field);
       
   688             }
       
   689         ++index;
       
   690         }
       
   691             
       
   692        
       
   693     // URLs:
       
   694     arraySize = sizeof(iUrlFields)/sizeof(TInt);
       
   695     index = 0;
       
   696     for( TInt i = 0; i < iParameters->iNumberOfURLFields; ++i)
       
   697         {
       
   698         if( index >= arraySize )
       
   699             {
       
   700             index = 0;
       
   701             }
       
   702         if( arraySize > 0  )
       
   703             {
       
   704             CCreatorContactField* field = CCreatorContactField::NewL(iUrlFields[index], KNullDesC);
       
   705             CleanupStack::PushL(field);
       
   706             field->SetRandomParametersL(CCreatorContactField::ERandomLengthDefault);
       
   707             iParameters->iContactFields.AppendL(field);
       
   708             CleanupStack::Pop(field);            
       
   709             }
       
   710         ++index;
       
   711         }
       
   712                     
       
   713     // EMail addresses:
       
   714     arraySize = sizeof(iEmailFields)/sizeof(TInt);
       
   715     index = 0;
       
   716     for( TInt i = 0; i < iParameters->iNumberOfEmailAddressFields; ++i)
       
   717         {
       
   718         if( index >= arraySize )
       
   719             {
       
   720             index = 0;
       
   721             }
       
   722         if( arraySize > 0  )
       
   723             {
       
   724             CCreatorContactField* field = CCreatorContactField::NewL(iEmailFields[index], KNullDesC);
       
   725             CleanupStack::PushL(field);
       
   726             field->SetRandomParametersL(CCreatorContactField::ERandomLengthDefault);
       
   727             iParameters->iContactFields.AppendL(field);
       
   728             CleanupStack::Pop(field);               
       
   729             }
       
   730         ++index;
       
   731         }
       
   732     }
       
   733 
       
   734 TInt CCreatorVirtualPhonebook::CreateContactEntryL(CCreatorModuleBaseParameters *aParameters)
       
   735     {
       
   736     LOGSTRING("Creator: CCreatorVirtualPhonebook::CreateContactEntryL");
       
   737     
       
   738     delete iParameters;
       
   739     iParameters = 0;
       
   740     CVirtualPhonebookParameters* parameters = 0;
       
   741     
       
   742     if( aParameters == 0 )
       
   743         {
       
   744         InitializeContactParamsL();
       
   745         parameters = iParameters;
       
   746         }
       
   747     else
       
   748         {
       
   749         parameters = (CVirtualPhonebookParameters*) aParameters;
       
   750         }
       
   751     
       
   752     TInt err = KErrNone;
       
   753 
       
   754     // create a new contact item
       
   755     MVPbkStoreContact* newContact = iStore->CreateNewContactLC();
       
   756     for( TInt i = 0; i < parameters->iContactFields.Count(); ++i )
       
   757         {
       
   758         CCreatorContactField* cField = parameters->iContactFields[i];
       
   759         if( cField )
       
   760             {
       
   761             cField->AddToContactL(iEngine, *newContact, this);
       
   762             }
       
   763         }
       
   764 
       
   765     RArray<MVPbkStoreContact*> contacts;
       
   766     CleanupClosePushL( contacts );    
       
   767     contacts.Append(newContact);        
       
   768     
       
   769     delete iOperation;
       
   770     iOperation = NULL;
       
   771     iLastError = KErrNone;
       
   772     iOperation = iContactManager->CommitContactsL( contacts.Array(), *this );    
       
   773     if ( iOperation )
       
   774         {
       
   775         iWaiter->StartAndWait();//Making asynchronous CommitContctsL to synchronous
       
   776         delete iOperation;
       
   777         iOperation = NULL;
       
   778         }
       
   779     User::LeaveIfError(iLastError);
       
   780     
       
   781     // store the link to contact, so that Creator is able to delete
       
   782     // it when user requests deletion of contacts that are created by Creator 
       
   783     MVPbkContactLink* linkToContact = newContact->CreateLinkLC();
       
   784     if( linkToContact )
       
   785         {
       
   786         iContactsToDelete->AppendL( linkToContact );
       
   787         CleanupStack::Pop(); // linkToContact
       
   788         
       
   789         // If this contact has a link id in script (i.e. belongs to a contact-set), we must cache the contact id:
       
   790         if( parameters->ScriptLinkId() > 0 )
       
   791             {                
       
   792             RPointerArray<CCreatorContactSet>& contactsets = ContactLinkCache::Instance()->ContactSets();
       
   793             TBool setFound(EFalse);
       
   794             for(TInt i = 0; i < contactsets.Count(); ++i )
       
   795                 {
       
   796                 if( contactsets[i]->LinkId() == parameters->ScriptLinkId())
       
   797                     {
       
   798                     MVPbkContactLink* linkToContact = newContact->CreateLinkLC();
       
   799                     if( linkToContact )
       
   800                         {
       
   801                         contactsets[i]->AppendL(linkToContact);
       
   802                         iContactLinkArray->AppendL(linkToContact);
       
   803                         CleanupStack::Pop(); // linkToContact
       
   804                         }
       
   805                     setFound = ETrue;
       
   806                     break;
       
   807                     }
       
   808                 }
       
   809             if( !setFound )
       
   810                 {
       
   811                 LOGSTRING2("Error: Contact set id %d not found.", parameters->ScriptLinkId());
       
   812                 }
       
   813             }
       
   814         }
       
   815     
       
   816     CleanupStack::Pop();//contacts
       
   817     contacts.Close();
       
   818     CompactPbkDatabaseL();
       
   819     CleanupStack::PopAndDestroy();//newContact
       
   820     if ( iCancelCbRequested && iEngine ) iEngine->CancelComplete();
       
   821     return err;
       
   822     }
       
   823 
       
   824 
       
   825 //----------------------------------------------------------------------------
       
   826 
       
   827 void CCreatorVirtualPhonebook::AddImageToContactL(MVPbkStoreContact& aContact, TInt aFieldResId, const TDesC& aFileName)
       
   828     {
       
   829     LOGSTRING("Creator: CCreatorPhonebook::AddImageToContactL");
       
   830     CPbk2ImageManager* imageMgr = CPbk2ImageManager::NewL(*iContactManager);
       
   831     CleanupStack::PushL(imageMgr);
       
   832     const MVPbkFieldTypeList& fieldList = aContact.ParentStore().StoreProperties().SupportedFields();        
       
   833     const MVPbkFieldType* fieldType = fieldList.Find(aFieldResId);
       
   834     if( fieldType == 0 )
       
   835         {
       
   836         return;
       
   837         }
       
   838     MPbk2ImageOperation* imageOp = 0;
       
   839     TRAPD(err, imageOp = imageMgr->SetImageAsyncL(aContact, *fieldType, *this, aFileName));   
       
   840     if( err == KErrNone)
       
   841         {
       
   842         if (imageOp)
       
   843             {
       
   844             CleanupDeletePushL( imageOp );
       
   845             iWaiter->StartAndWait(); // Making asynchronous SetImageAsyncL to synchronous
       
   846             CleanupStack::Pop(imageOp);
       
   847             delete imageOp;
       
   848             }
       
   849         }    
       
   850     else if(err != KErrNotSupported)
       
   851         {
       
   852         User::Leave(err);
       
   853         }
       
   854     CleanupStack::PopAndDestroy(imageMgr);        
       
   855     }
       
   856 
       
   857 // Checks if the link is a group or not
       
   858 TBool CCreatorVirtualPhonebook::IsContactGroupL(const MVPbkContactLink& aLink)
       
   859 	{
       
   860 	LOGSTRING("Creator: CCreatorPhonebook::IsContactGroupL");
       
   861 	if( iStore )
       
   862 		{
       
   863 		delete iContactGroupsInStore;
       
   864 		iContactGroupsInStore = 0;
       
   865 		// Save contact group links here
       
   866 		iContactGroupsInStore = iStore->ContactGroupsLC();
       
   867 		CleanupStack::Pop();
       
   868 		}
       
   869 		
       
   870 	if( iContactGroupsInStore )
       
   871 		{
       
   872 		// Loop all the groups and check if any of them matches to the given link.
       
   873 		for( TInt i = 0; i < iContactGroupsInStore->Count(); ++i )
       
   874 			{
       
   875 			if( (*iContactGroupsInStore)[i].IsSame(aLink) )
       
   876 				return ETrue;
       
   877 			}
       
   878 		}
       
   879 	return EFalse;
       
   880 	}
       
   881 
       
   882 TInt CCreatorVirtualPhonebook::CreateGroupEntryL(CCreatorModuleBaseParameters *aParameters)
       
   883     {
       
   884     LOGSTRING("Creator: CCreatorVirtualPhonebook::CreateGroupEntryL");
       
   885     delete iParameters;
       
   886     iParameters = 0;
       
   887     
       
   888     CVirtualPhonebookParameters* parameters = (CVirtualPhonebookParameters*) aParameters;
       
   889     
       
   890     if( !parameters )
       
   891         {
       
   892         iParameters = new (ELeave) CVirtualPhonebookParameters;
       
   893         iParameters->iContactsInGroup = iContactsInGroup;
       
   894         iParameters->iGroupName->Des().Copy( iEngine->RandomString(CCreatorEngine::EGroupName) );
       
   895         iParameters->iGroupName->Des().Append( _L(" #") );
       
   896         iParameters->iGroupName->Des().AppendNum( iEngine->RandomNumber(1000, 9999) );
       
   897         parameters = iParameters;
       
   898         }
       
   899 
       
   900     TInt err = KErrNone;
       
   901  
       
   902     // create a new contact group    
       
   903     MVPbkContactGroup* newGroup = iStore->CreateNewContactGroupLC();
       
   904     
       
   905     newGroup->SetGroupLabelL(parameters->iGroupName->Des());
       
   906         
       
   907     // define amounts of contacts to be added to the group
       
   908     TInt amountOfContactsToBeAdded = 0;
       
   909     if (parameters->iContactsInGroup == KCreateRandomAmountOfGroups)
       
   910     	{
       
   911         amountOfContactsToBeAdded = iEngine->RandomNumber(30);
       
   912     	}
       
   913     else 
       
   914     	{
       
   915         amountOfContactsToBeAdded = parameters->iContactsInGroup;
       
   916     	}
       
   917     
       
   918     if( parameters->iLinkIds.Count() > 0 )
       
   919         {
       
   920         for( TInt i = 0; i < parameters->iLinkIds.Count(); ++i )
       
   921             {
       
   922             const CCreatorContactSet& set = ContactLinkCache::Instance()->ContactSet(parameters->iLinkIds[i].iLinkId);
       
   923             
       
   924             const RPointerArray<MVPbkContactLink>& links = set.ContactLinks();
       
   925             TInt numberOfExplicitLinks = links.Count(); // Number of defined contacts in contact-set
       
   926             TInt numberOfExistingContacts = set.NumberOfExistingContacts(); // Number of existing contacts in contact-set
       
   927             TInt maxAmount = numberOfExplicitLinks + numberOfExistingContacts;
       
   928             
       
   929             if( parameters->iLinkIds[i].iLinkAmount > 0 )
       
   930                 maxAmount = parameters->iLinkIds[i].iLinkAmount; // Max amount is limited
       
   931             
       
   932             TInt addedMembers = 0;
       
   933             
       
   934             for( TInt j = 0; j < links.Count() && addedMembers < maxAmount; ++j )
       
   935                 {
       
   936                 MVPbkContactLink* link = links[j]; 
       
   937                 if( link && IsContactGroupL(*link) == EFalse )
       
   938                     {
       
   939                     TRAPD(err, newGroup->AddContactL(*link));
       
   940                     if( err != KErrAlreadyExists )
       
   941                     	{
       
   942                     	// Ignore "allready exists" -error
       
   943                     	User::LeaveIfError(err);
       
   944                     	++addedMembers;
       
   945                     	}                    
       
   946                     }
       
   947                 }
       
   948             if( addedMembers < maxAmount )
       
   949             	{
       
   950             	// Add existing contacts, withing the limits set by maxAmount:
       
   951             	amountOfContactsToBeAdded += maxAmount - addedMembers;
       
   952             	}
       
   953             }
       
   954         }
       
   955     if( amountOfContactsToBeAdded > 0 )
       
   956         {    
       
   957         CVPbkContactViewDefinition* viewDef = CVPbkContactViewDefinition::NewL();
       
   958         CleanupStack::PushL( viewDef );
       
   959         viewDef->SetType( EVPbkContactsView );
       
   960         MVPbkContactView* contactView = iStore->CreateViewLC( 
       
   961                 *viewDef, 
       
   962                 *this, 
       
   963                 iStore->StoreProperties().SupportedFields() );
       
   964         iWaiter->StartAndWait();//Making asynchronous CreateViewLC to synchronous
       
   965 
       
   966         TInt cnt = 0;
       
   967         // assign some random contacts to the group
       
   968         for ( TInt y = 0; cnt < amountOfContactsToBeAdded && y < contactView->ContactCountL(); ++y )
       
   969             {
       
   970             MVPbkContactLink* link = contactView->CreateLinkLC( y );
       
   971             if( link )
       
   972                 {
       
   973                 TRAPD( err, newGroup->AddContactL( *link ) );
       
   974                 CleanupStack::PopAndDestroy(); // link
       
   975                 if( err != KErrAlreadyExists )
       
   976                     {
       
   977                     // Ignore "allready exists" -error
       
   978                     User::LeaveIfError( err );
       
   979                     ++cnt;
       
   980                     }
       
   981                 }
       
   982             }
       
   983         CleanupStack::PopAndDestroy(); // contactView
       
   984         CleanupStack::PopAndDestroy( viewDef );
       
   985         }
       
   986     
       
   987     newGroup->CommitL(*this);
       
   988     iWaiter->StartAndWait(); //Making asynchronous CommitL to synchronous
       
   989 
       
   990     // store the link to contact, so that Creator is able to delete
       
   991     // it when user requests deletion of contacts that were created with Creator 
       
   992     MVPbkContactLink* linkToContact = newGroup->CreateLinkLC();
       
   993     if( linkToContact )
       
   994         {
       
   995         iContactGroupsToDelete->AppendL( linkToContact );
       
   996         CleanupStack::Pop(); // linkToContact
       
   997         }
       
   998     
       
   999     CleanupStack::PopAndDestroy(); // newGroup
       
  1000    
       
  1001     CompactPbkDatabaseL();
       
  1002 
       
  1003     return err;
       
  1004 
       
  1005     }
       
  1006 
       
  1007 //----------------------------------------------------------------------------
       
  1008 
       
  1009 TInt CCreatorVirtualPhonebook::CreateSubscribedContactEntryL(CCreatorModuleBaseParameters* /*aParameters*/)
       
  1010     {
       
  1011     LOGSTRING("Creator: CCreatorVirtualPhonebook::CreateSubscribedContactEntryL");
       
  1012 
       
  1013     return KErrNotSupported;
       
  1014     }
       
  1015 
       
  1016 //----------------------------------------------------------------------------
       
  1017 
       
  1018 void CCreatorVirtualPhonebook::AddFieldToContactItemL(
       
  1019 		MVPbkStoreContact& newContact, TPbkFieldId aFieldId, const TDesC& aFieldText)
       
  1020 	{
       
  1021     LOGSTRING("Creator: CCreatorVirtualPhonebook::AddFieldToContactItemL");
       
  1022 
       
  1023     // Get field type object
       
  1024     const MVPbkFieldTypeList& fieldList = newContact.ParentStore().StoreProperties().SupportedFields();        
       
  1025     const MVPbkFieldType* fieldType = fieldList.Find(aFieldId);
       
  1026     if( fieldType == 0 )
       
  1027         return; // field type is not supported
       
  1028     
       
  1029     // Create a new field
       
  1030 	MVPbkStoreContactField* newField = newContact.CreateFieldLC(*fieldType);	
       
  1031 	if( !newField )
       
  1032 	    {
       
  1033 	    User::Leave(KErrNotSupported);
       
  1034 	    }
       
  1035 	
       
  1036 	MVPbkContactFieldData& fieldData = newField->FieldData();
       
  1037 	
       
  1038 	//data type must be text in this case
       
  1039 	TVPbkFieldStorageType dataType = fieldData.DataType();
       
  1040 
       
  1041 	if(dataType == EVPbkFieldStorageTypeText)
       
  1042 	    {
       
  1043 		//set text to field	
       
  1044 		MVPbkContactFieldTextData& tmpData = MVPbkContactFieldTextData::Cast(fieldData);
       
  1045 		tmpData.SetTextL(aFieldText);
       
  1046 		//set field to contact		
       
  1047 		newContact.AddFieldL(newField);//This object takes ownership of the field.
       
  1048 		CleanupStack::Pop(newField);			
       
  1049 	    }
       
  1050 	else
       
  1051 		{
       
  1052 		User::Leave(KErrArgument);
       
  1053 		}
       
  1054 	
       
  1055     }
       
  1056 
       
  1057 //----------------------------------------------------------------------------
       
  1058 
       
  1059 void CCreatorVirtualPhonebook::AddFieldToContactItemL(
       
  1060 		MVPbkStoreContact& newContact, TPbkFieldId aFieldId, const TDesC8& aFieldText)
       
  1061 	{
       
  1062     LOGSTRING("Creator: CCreatorVirtualPhonebook::AddFieldToContactItemL");
       
  1063 
       
  1064 	//get field types
       
  1065 	const MVPbkFieldTypeList& fieldList = newContact.ParentStore().StoreProperties().SupportedFields();
       
  1066 	
       
  1067 	//get wanted field type
       
  1068 	const MVPbkFieldType* fieldType = fieldList.Find(aFieldId);
       
  1069 	
       
  1070 	//create a new field
       
  1071 	MVPbkStoreContactField* newField =
       
  1072 	            newContact.CreateFieldLC(*fieldType);
       
  1073 	//get field data	
       
  1074 	MVPbkContactFieldData& fieldData = newField->FieldData();
       
  1075 	
       
  1076 	//data type must be text in this case
       
  1077 	TVPbkFieldStorageType dataType = fieldData.DataType();
       
  1078 
       
  1079 	if(dataType == EVPbkFieldStorageTypeBinary){
       
  1080 		//set bindata to field	
       
  1081 		MVPbkContactFieldBinaryData& tmpData = MVPbkContactFieldBinaryData::Cast(fieldData);		
       
  1082 		tmpData.SetBinaryDataL(aFieldText);
       
  1083 		//set field to contact		
       
  1084 		newContact.AddFieldL(newField);//This object takes ownership of the field.
       
  1085 		CleanupStack::Pop(newField);			
       
  1086 	}
       
  1087 	else
       
  1088 		{
       
  1089 		CleanupStack::PopAndDestroy(newField);
       
  1090 		}
       
  1091 	
       
  1092     }
       
  1093 
       
  1094 void CCreatorVirtualPhonebook::AddFieldToContactItemL(
       
  1095         MVPbkStoreContact& newContact, TPbkFieldId aFieldId, const TTime& aFieldText)
       
  1096     {
       
  1097     LOGSTRING("Creator: CCreatorVirtualPhonebook::AddFieldToContactItemL");
       
  1098     //get field types
       
  1099     const MVPbkFieldTypeList& fieldList = newContact.ParentStore().StoreProperties().SupportedFields();
       
  1100         
       
  1101     //get wanted field type
       
  1102     const MVPbkFieldType* fieldType = fieldList.Find(aFieldId);
       
  1103         
       
  1104     //create a new field
       
  1105     MVPbkStoreContactField* newField = newContact.CreateFieldLC(*fieldType);
       
  1106     //get field data    
       
  1107     MVPbkContactFieldData& fieldData = newField->FieldData();
       
  1108         
       
  1109     //data type must be datetime in this case
       
  1110     TVPbkFieldStorageType dataType = fieldData.DataType();
       
  1111 
       
  1112     if(dataType == EVPbkFieldStorageTypeDateTime)
       
  1113         {
       
  1114         //set bindata to field  
       
  1115         MVPbkContactFieldDateTimeData& tmpData = MVPbkContactFieldDateTimeData::Cast(fieldData);        
       
  1116         tmpData.SetDateTime(aFieldText);
       
  1117         //set field to contact      
       
  1118         newContact.AddFieldL(newField);//This object takes ownership of the field.
       
  1119         CleanupStack::Pop(newField);            
       
  1120         }
       
  1121     else
       
  1122         {
       
  1123         CleanupStack::PopAndDestroy(newField);
       
  1124         }
       
  1125     }
       
  1126 
       
  1127 //----------------------------------------------------------------------------
       
  1128 
       
  1129 void CCreatorVirtualPhonebook::CompactPbkDatabaseL(TBool aCompressImmediately)
       
  1130     {
       
  1131     LOGSTRING("Creator: CCreatorVirtualPhonebook::CompactPbkDatabase");
       
  1132 
       
  1133     iOpCounter++;
       
  1134 
       
  1135     // compress the database immediately or after each 100th operation
       
  1136     if (aCompressImmediately || iOpCounter%100 == 0)
       
  1137         {
       
  1138         MVPbkContactOperationBase* operation= iContactManager->CompressStoresL(*this);
       
  1139         if (operation)
       
  1140             {
       
  1141             CleanupDeletePushL( operation );
       
  1142             iWaiter->StartAndWait();//Making asynchronous CompressStoresL to synchronous
       
  1143             CleanupStack::Pop(operation);
       
  1144             delete operation;
       
  1145             }             		 
       
  1146         }
       
  1147     }
       
  1148 
       
  1149 //----------------------------------------------------------------------------
       
  1150 //Observer implementations for MVPbkContactStoreListObserver 
       
  1151 //(and it's super class MVPbkContactStoreObserver)
       
  1152 
       
  1153 void CCreatorVirtualPhonebook::OpenComplete()
       
  1154 	{
       
  1155 	LOGSTRING("Creator: CCreatorVirtualPhonebook::OpenComplete()");
       
  1156     iWaiter->Cancel();
       
  1157 	}
       
  1158 
       
  1159 void CCreatorVirtualPhonebook::StoreReady(MVPbkContactStore& /*aContactStore*/)
       
  1160 	{
       
  1161 	LOGSTRING("Creator: CCreatorVirtualPhonebook::StoreReady()");
       
  1162 	}
       
  1163 
       
  1164 
       
  1165 void CCreatorVirtualPhonebook::StoreUnavailable(MVPbkContactStore& /*aContactStore*/, 
       
  1166         TInt /*aReason*/)
       
  1167 	{
       
  1168 	LOGSTRING("Creator: CCreatorVirtualPhonebook::StoreUnavailable()");
       
  1169 	}
       
  1170 
       
  1171 
       
  1172 void CCreatorVirtualPhonebook::HandleStoreEventL(
       
  1173         MVPbkContactStore& /*aContactStore*/, 
       
  1174         TVPbkContactStoreEvent /*aStoreEvent*/)
       
  1175 	{
       
  1176 	LOGSTRING("Creator: CCreatorVirtualPhonebook::HandleStoreEventL()");
       
  1177 	}
       
  1178 
       
  1179 
       
  1180  TAny* CCreatorVirtualPhonebook::ContactStoreObserverExtension(
       
  1181 		 TUid /*aExtensionUid*/) 
       
  1182         
       
  1183  { 
       
  1184  LOGSTRING("Creator: CCreatorVirtualPhonebook::ContactStoreObserverExtension()");
       
  1185  return NULL; 
       
  1186  }
       
  1187  
       
  1188  
       
  1189 //----------------------------------------------------------------------------
       
  1190 //Observer implementation for MVPbkBatchOperationObserver
       
  1191 
       
  1192 void CCreatorVirtualPhonebook::StepComplete( 
       
  1193      MVPbkContactOperationBase& /*aOperation*/,
       
  1194      TInt /*aStepSize*/ )
       
  1195 	{
       
  1196     LOGSTRING("Creator: CCreatorVirtualPhonebook::StepComplete" );
       
  1197     
       
  1198 	}
       
  1199 
       
  1200 
       
  1201 TBool CCreatorVirtualPhonebook::StepFailed(
       
  1202      MVPbkContactOperationBase& /*aOperation*/,
       
  1203      TInt /*aStepSize*/, TInt aError )
       
  1204 {
       
  1205 	LOGSTRING2("Creator: CCreatorVirtualPhonebook::StepFailed - Error: %d", aError );
       
  1206 	iLastError = aError;
       
  1207 	iWaiter->Cancel();
       
  1208 	return EFalse;
       
  1209 }
       
  1210 
       
  1211 
       
  1212 void CCreatorVirtualPhonebook::OperationComplete( 
       
  1213      MVPbkContactOperationBase& /*aOperation*/ )
       
  1214 	{
       
  1215     LOGSTRING("Creator: CCreatorVirtualPhonebook::OperationComplete" );
       
  1216     //Canceling waiter when operation is done.
       
  1217     iWaiter->Cancel();
       
  1218 	}
       
  1219 
       
  1220 
       
  1221 TAny* CCreatorVirtualPhonebook::BatchOperationObserverExtension( 
       
  1222      TUid /*aExtensionUid*/ ) 
       
  1223      {
       
  1224      LOGSTRING("Creator: CCreatorVirtualPhonebook::BatchOperationObserverExtension" );
       
  1225      return NULL;
       
  1226      }
       
  1227 
       
  1228 //----------------------------------------------------------------------------
       
  1229 //Observer implementation for MVPbkContactFindObserver
       
  1230 void CCreatorVirtualPhonebook::FindCompleteL( MVPbkContactLinkArray* aResults )
       
  1231   	 {
       
  1232   	 LOGSTRING("Creator: CCreatorVirtualPhonebook::FindCompleteL" );
       
  1233   	 if(iContactResults)
       
  1234   		 {
       
  1235   		 delete iContactResults;
       
  1236   		 iContactResults = NULL;
       
  1237   		 }
       
  1238   	 iContactResults = aResults;
       
  1239   	 iWaiter->Cancel();
       
  1240    	 }
       
  1241 
       
  1242 void CCreatorVirtualPhonebook::FindFailed( TInt aError )
       
  1243  	 {
       
  1244  	LOGSTRING2("Creator: CCreatorVirtualPhonebook::FindFailed - Error: %d", aError );
       
  1245  	iLastError = aError;
       
  1246  	iWaiter->Cancel();
       
  1247   	 }
       
  1248 
       
  1249 TAny* CCreatorVirtualPhonebook::ContactFindObserverExtension( 
       
  1250 	                TUid /*aExtensionUid*/ )
       
  1251 	 {
       
  1252 	 LOGSTRING("Creator: CCreatorVirtualPhonebook::ContactFindObserverExtension" );
       
  1253 	 return NULL;
       
  1254 	 }	                
       
  1255 
       
  1256 
       
  1257 //Observer implementation for MVPbkContactObserver
       
  1258 //----------------------------------------------------------------------------
       
  1259 
       
  1260 void CCreatorVirtualPhonebook::ContactOperationCompleted(TContactOpResult aResult)
       
  1261 	{
       
  1262     LOGSTRING("Creator: CCreatorVirtualPhonebook::ContactOperationCompleted" );
       
  1263             
       
  1264 	TContactOp op = aResult.iOpCode; 		 
       
  1265     switch ( op )
       
  1266         {
       
  1267         case EContactCommit:
       
  1268         case EContactDelete:
       
  1269             {
       
  1270             iWaiter->Cancel();
       
  1271             break;
       
  1272             }
       
  1273         case EContactLock:
       
  1274         default: break;
       
  1275         }
       
  1276 	}
       
  1277 	
       
  1278 void CCreatorVirtualPhonebook::ContactOperationFailed
       
  1279 			(TContactOp /*aOpCode*/, TInt aErrorCode, TBool /*aErrorNotified*/)
       
  1280 	{
       
  1281     LOGSTRING2("Creator: CCreatorVirtualPhonebook::ContactOperationFailed - Error: %d", aErrorCode );
       
  1282     iLastError = aErrorCode;
       
  1283     iWaiter->Cancel();
       
  1284 	}
       
  1285 	
       
  1286 TAny* CCreatorVirtualPhonebook::ContactObserverExtension(TUid /*aExtensionUid*/) 
       
  1287 	{
       
  1288     LOGSTRING("Creator: CCreatorVirtualPhonebook::ContactObserverExtension" );
       
  1289     return NULL;
       
  1290 	}
       
  1291 
       
  1292 void CCreatorVirtualPhonebook::Pbk2ImageSetComplete(MPbk2ImageOperation& /*aOperation*/)
       
  1293     {
       
  1294     LOGSTRING("Creator: CCreatorVirtualPhonebook::Pbk2ImageSetComplete" );
       
  1295     //Canceling waiter when operation is done.
       
  1296     iWaiter->Cancel();
       
  1297     }
       
  1298 
       
  1299 void CCreatorVirtualPhonebook::Pbk2ImageSetFailed(MPbk2ImageOperation& /*aOperation*/, TInt /*aError*/)
       
  1300     {
       
  1301     LOGSTRING("Creator: CCreatorVirtualPhonebook::Pbk2ImageSetFailed" );
       
  1302     //Canceling waiter when operation is done.
       
  1303     iWaiter->Cancel();
       
  1304     }
       
  1305 
       
  1306 
       
  1307 //Observer implementation for MVPbkContactViewObserver
       
  1308 //----------------------------------------------------------------------------
       
  1309 void CCreatorVirtualPhonebook::ContactViewReady( MVPbkContactViewBase& /*aView*/ )
       
  1310     {
       
  1311     LOGSTRING("Creator: CCreatorVirtualPhonebook::ContactViewReady" );
       
  1312     iWaiter->Cancel();
       
  1313     }
       
  1314 
       
  1315 void CCreatorVirtualPhonebook::ContactViewUnavailable(
       
  1316         MVPbkContactViewBase& /*aView*/ )
       
  1317     {
       
  1318     iWaiter->Cancel();
       
  1319     }
       
  1320 
       
  1321 void CCreatorVirtualPhonebook::ContactAddedToView(
       
  1322         MVPbkContactViewBase& /*aView*/, 
       
  1323         TInt /*aIndex*/, 
       
  1324         const MVPbkContactLink& /*aContactLink*/ )
       
  1325     {
       
  1326     }
       
  1327 
       
  1328 void CCreatorVirtualPhonebook::ContactRemovedFromView(
       
  1329         MVPbkContactViewBase& /*aView*/, 
       
  1330         TInt /*aIndex*/, 
       
  1331         const MVPbkContactLink& /*aContactLink*/ )
       
  1332     {
       
  1333     }
       
  1334         
       
  1335 void CCreatorVirtualPhonebook::ContactViewError(
       
  1336         MVPbkContactViewBase& /*aView*/, 
       
  1337         TInt /*aError*/, 
       
  1338         TBool /*aErrorNotified*/ )
       
  1339     {
       
  1340     iWaiter->Cancel();
       
  1341     }
       
  1342 
       
  1343 /**
       
  1344  * CCreatorContactFieldImpl Base class for contact field implementations
       
  1345  */
       
  1346 class CCreatorContactFieldImpl : public CBase
       
  1347     {
       
  1348 public:        
       
  1349     virtual ~CCreatorContactFieldImpl() {};
       
  1350     
       
  1351     virtual void AddToContactL(CCreatorEngine* aEngine, MVPbkStoreContact& aContact, CCreatorVirtualPhonebook* aVPbk);
       
  1352     virtual void SetRandomParametersL(CCreatorContactField::TRandomLengthType aRandomLenType = CCreatorContactField::ERandomLengthDefault, TInt aRandomLen = 0 );
       
  1353     virtual void ParseL(CCommandParser* parser);
       
  1354      
       
  1355     virtual TInt FieldType();
       
  1356 protected:
       
  1357     CCreatorContactFieldImpl(TInt aFieldType);    
       
  1358     TInt iFieldType;    
       
  1359     CCreatorContactField::TRandomLengthType iRandomLenType;
       
  1360     TInt iRandomLen;
       
  1361     };
       
  1362     
       
  1363 void CCreatorContactFieldImpl::AddToContactL(CCreatorEngine* /*aEngine*/, MVPbkStoreContact& /*aContact*/, CCreatorVirtualPhonebook* /*aVPbk*/ )
       
  1364     {}
       
  1365 
       
  1366 void CCreatorContactFieldImpl::SetRandomParametersL(CCreatorContactField::TRandomLengthType aRandomLenType, TInt aRandomLen )
       
  1367     {    
       
  1368     iRandomLenType = aRandomLenType;
       
  1369     iRandomLen = aRandomLen;
       
  1370     }
       
  1371 
       
  1372 void CCreatorContactFieldImpl::ParseL(CCommandParser* /*parser*/)
       
  1373     {}
       
  1374     
       
  1375 CCreatorContactFieldImpl::CCreatorContactFieldImpl(TInt aFieldType)
       
  1376     {
       
  1377     iFieldType = aFieldType;
       
  1378     }
       
  1379 
       
  1380 TInt CCreatorContactFieldImpl::FieldType()
       
  1381     {
       
  1382     return iFieldType;    
       
  1383     }
       
  1384 
       
  1385 
       
  1386 /**
       
  1387  * CCreatorContactTextField Text field implementation
       
  1388  */
       
  1389 class CCreatorContactTextField : public CCreatorContactFieldImpl
       
  1390     {
       
  1391     public:
       
  1392     static CCreatorContactTextField* NewL(TInt aFieldType, const TDesC& aData);
       
  1393     ~CCreatorContactTextField();
       
  1394     virtual void AddToContactL(CCreatorEngine* aEngine, MVPbkStoreContact& aContact, CCreatorVirtualPhonebook* aVPbk);    
       
  1395     virtual void ParseL(CCommandParser* parser);
       
  1396     
       
  1397     protected:
       
  1398     virtual void SetDefaultRandomContentL(CCreatorEngine* aEngine);
       
  1399     virtual void SetExplicitRandomContentL(CCreatorEngine* aEngine, TInt aRandomLen);
       
  1400     
       
  1401     private:    
       
  1402     CCreatorContactTextField(TInt aFieldType);
       
  1403     void ConstructL(const TDesC& aData);
       
  1404     HBufC* iPtr;    
       
  1405     };
       
  1406     
       
  1407 CCreatorContactTextField::CCreatorContactTextField(TInt aFieldType) 
       
  1408 : CCreatorContactFieldImpl(aFieldType)
       
  1409     { }
       
  1410 CCreatorContactTextField::~CCreatorContactTextField()
       
  1411     { 
       
  1412     delete iPtr; 
       
  1413     }
       
  1414  void CCreatorContactTextField::AddToContactL(CCreatorEngine* aEngine, MVPbkStoreContact& aContact, CCreatorVirtualPhonebook* aVPbk)
       
  1415      {
       
  1416      LOGSTRING("Creator: CCreatorContactTextField::AddToContactL"); 
       
  1417      if( aVPbk == 0 )
       
  1418          User::Leave(KErrArgument);
       
  1419                
       
  1420      if( iPtr == 0 || iPtr->Length() == 0)
       
  1421          {
       
  1422          switch( iRandomLenType )
       
  1423          {
       
  1424          case CCreatorContactField::ERandomLengthDefault:
       
  1425              {
       
  1426              SetDefaultRandomContentL(aEngine);
       
  1427              break;
       
  1428              }
       
  1429          case CCreatorContactField::ERandomLengthMax:
       
  1430              {
       
  1431              const MVPbkFieldTypeList& fieldList = aContact.ParentStore().StoreProperties().SupportedFields();
       
  1432              const MVPbkFieldType* fieldType = fieldList.Find(iFieldType);
       
  1433              if( fieldType == 0 )
       
  1434                  return; // field type is not supported
       
  1435                  
       
  1436              // Create a new field
       
  1437              MVPbkStoreContactField* newField = aContact.CreateFieldLC(*fieldType);    
       
  1438              if( !newField )
       
  1439                  {
       
  1440                  User::Leave(KErrNotSupported);
       
  1441                  }
       
  1442                  
       
  1443              MVPbkContactFieldData& fieldData = newField->FieldData();  
       
  1444              //data type must be text in this case
       
  1445              TVPbkFieldStorageType dataType = fieldData.DataType();
       
  1446 
       
  1447              if(dataType == EVPbkFieldStorageTypeText)
       
  1448                  {
       
  1449                  //set text to field 
       
  1450                  MVPbkContactFieldTextData& tmpData = MVPbkContactFieldTextData::Cast(fieldData);
       
  1451                  iRandomLen = tmpData.MaxLength();
       
  1452                  if( iRandomLen == KVPbkUnlimitedFieldLength )
       
  1453                      iRandomLen = 128;
       
  1454                  }
       
  1455              CleanupStack::PopAndDestroy(newField);       
       
  1456              SetExplicitRandomContentL(aEngine, iRandomLen);
       
  1457              break;
       
  1458              }
       
  1459          case CCreatorContactField::ERandomLengthExplicit:
       
  1460              {
       
  1461              SetExplicitRandomContentL(aEngine, iRandomLen);
       
  1462              break;
       
  1463              }
       
  1464          default:
       
  1465              break;
       
  1466          }
       
  1467          }
       
  1468      if( iPtr )
       
  1469          {
       
  1470          if( iFieldType == R_VPBK_FIELD_TYPE_THUMBNAILPIC )
       
  1471              {
       
  1472              if( iPtr && iPtr->Length() > 0 )
       
  1473             	 {
       
  1474             	 aVPbk->AddImageToContactL(aContact, iFieldType, iPtr->Des());
       
  1475             	 }
       
  1476              }
       
  1477          //Thumbnail id handling
       
  1478          /*else if( iFieldType == FIELD_TYPE_THUMBNAILPIC_ID )
       
  1479              {
       
  1480              if( iPtr && iPtr->Length() > 0 )
       
  1481                  {
       
  1482                  TInt id = aEngine->GetAttachmentIdL(iPtr->Des());
       
  1483                  if( id != KUndef )
       
  1484                      {
       
  1485                      //get picture path by id
       
  1486                      TFileName sourceFileName = aEngine->TestDataPathL((CCreatorEngine::TTestDataPath)id);// (CCreatorEngine::TTestDataPath) parameters.iAttachments->At(i)
       
  1487                      //set image to contact
       
  1488                      aVPbk->AddImageToContactL(aContact, R_VPBK_FIELD_TYPE_THUMBNAILPIC, sourceFileName);                     
       
  1489                      }
       
  1490                  }
       
  1491              }*/         
       
  1492          else
       
  1493              {
       
  1494              if( iPtr && iPtr->Length() > 0 )
       
  1495             	 {
       
  1496             	 aVPbk->AddFieldToContactItemL(aContact, iFieldType, iPtr->Des());
       
  1497             	 }
       
  1498              }
       
  1499          }
       
  1500      }
       
  1501 
       
  1502  void CCreatorContactTextField::SetDefaultRandomContentL(CCreatorEngine* aEngine)
       
  1503      {
       
  1504      LOGSTRING("Creator: CCreatorContactTextField::SetDefaultRandomContentL");
       
  1505      if( aEngine == 0 )
       
  1506          return;
       
  1507      
       
  1508      if( iPtr )
       
  1509          {
       
  1510          delete iPtr;
       
  1511          iPtr = 0;
       
  1512          }
       
  1513      TPtrC contentData;
       
  1514      
       
  1515      TInt textFieldCount = sizeof(CreatorVPbkMiscTextFields) / sizeof(FieldInfo);
       
  1516      TBool found = EFalse;
       
  1517      for( TInt tfIndex = 0; tfIndex < textFieldCount; ++tfIndex )
       
  1518          {
       
  1519          if( iFieldType == CreatorVPbkMiscTextFields[tfIndex].iFieldCode )
       
  1520              {
       
  1521              found = ETrue;
       
  1522              if( CreatorVPbkMiscTextFields[tfIndex].iRandomType != RND_TYPE_UNDEF )
       
  1523                  {
       
  1524                  contentData.Set(aEngine->RandomString((CCreatorEngine::TRandomStringType) CreatorVPbkMiscTextFields[tfIndex].iRandomType));
       
  1525                  }
       
  1526              else
       
  1527                  {
       
  1528                  switch( iFieldType )
       
  1529                  {
       
  1530                  case R_VPBK_FIELD_TYPE_RINGTONE:
       
  1531                      {
       
  1532                      contentData.Set(aEngine->CreateRandomSoundFileL());
       
  1533                      break;                 
       
  1534                      }
       
  1535                  //Thumbnail (path) and thumbnailid handling with random is the same, only in script they have different handling
       
  1536                  case R_VPBK_FIELD_TYPE_THUMBNAILPIC:                 
       
  1537                      {
       
  1538                      contentData.Set(aEngine->RandomPictureFileL());
       
  1539                      break;
       
  1540                      }
       
  1541                  case R_VPBK_FIELD_TYPE_SYNCCLASS:
       
  1542                  case R_VPBK_FIELD_TYPE_LOCPRIVACY:
       
  1543                      {
       
  1544                      _LIT(KPublic, "Public");
       
  1545                      contentData.Set(KPublic);
       
  1546                      break;
       
  1547                      }
       
  1548                  default:
       
  1549                      break;
       
  1550                  }
       
  1551                  }
       
  1552              break;
       
  1553              }
       
  1554          }
       
  1555      
       
  1556      if( found == EFalse )
       
  1557          {
       
  1558          TInt phNumFieldCount = sizeof(CreatorVPbkPhoneNumberFields) / sizeof(TInt);
       
  1559          for( TInt phIndex = 0; phIndex < phNumFieldCount; ++phIndex )
       
  1560              {
       
  1561              if( iFieldType == CreatorVPbkPhoneNumberFields[phIndex] )
       
  1562                  {
       
  1563                  contentData.Set(aEngine->RandomString(CCreatorEngine::EPhoneNumber));
       
  1564                  found = ETrue;
       
  1565                  break;
       
  1566                  }
       
  1567              }
       
  1568          }
       
  1569      
       
  1570      if( found == EFalse )
       
  1571          {
       
  1572          TInt emailFieldCount = sizeof(CreatorVPbkEmailFields) / sizeof(TInt);
       
  1573          for( TInt eIndex = 0; eIndex < emailFieldCount; ++eIndex )
       
  1574              {
       
  1575              if( iFieldType == CreatorVPbkEmailFields[eIndex] )
       
  1576                  {
       
  1577                  iPtr = aEngine->CreateEmailAddressLC();
       
  1578                  CleanupStack::Pop();
       
  1579                  return;
       
  1580                  }
       
  1581              }
       
  1582          }
       
  1583      iPtr = HBufC::NewL(contentData.Length());
       
  1584      iPtr->Des().Copy(contentData);
       
  1585      }
       
  1586  
       
  1587  void CCreatorContactTextField::SetExplicitRandomContentL(CCreatorEngine* aEngine, TInt aRandomLen)
       
  1588      {     
       
  1589      LOGSTRING("Creator: CCreatorContactTextField::SetExplicitRandomContentL");
       
  1590      if( iPtr )
       
  1591          {
       
  1592          delete iPtr;
       
  1593          iPtr = 0;
       
  1594          }
       
  1595      iPtr = aEngine->CreateRandomStringLC(aRandomLen);
       
  1596      CleanupStack::Pop(); // iPtr
       
  1597      }
       
  1598  
       
  1599  void CCreatorContactTextField::ParseL(CCommandParser* parser)
       
  1600      {
       
  1601      parser->StrParserL(iPtr, '|');
       
  1602      }
       
  1603  
       
  1604  void CCreatorContactTextField::ConstructL(const TDesC& aData)
       
  1605       {     
       
  1606       iPtr = HBufC::New(KPhonebookFieldLength);
       
  1607       iPtr->Des().Copy(aData);
       
  1608       }
       
  1609  
       
  1610  CCreatorContactTextField* CCreatorContactTextField::NewL(TInt aFieldType, const TDesC& aData)
       
  1611      {
       
  1612      CCreatorContactTextField* self = new (ELeave) CCreatorContactTextField(aFieldType);
       
  1613      CleanupStack::PushL(self);
       
  1614      self->ConstructL(aData);
       
  1615      CleanupStack::Pop();
       
  1616      return self;
       
  1617      }
       
  1618  /**
       
  1619   * CCreatorContactBinaryField Binary field implementation
       
  1620   */
       
  1621  class CCreatorContactBinaryField : public CCreatorContactFieldImpl
       
  1622     {
       
  1623 public:
       
  1624     static CCreatorContactBinaryField* NewL(TInt aFieldType, const TDesC8& aData);
       
  1625     ~CCreatorContactBinaryField();  
       
  1626     virtual void AddToContactL(CCreatorEngine* aEngine, MVPbkStoreContact& aContact, CCreatorVirtualPhonebook* aVPbk);
       
  1627     virtual void ParseL(CCommandParser* parser);
       
  1628     virtual void SetDefaultRandomContentL(CCreatorEngine* aEngine);
       
  1629 private:
       
  1630     CCreatorContactBinaryField(TInt aFieldType);
       
  1631     void ConstructL(const TDesC8& aData);
       
  1632     HBufC8* iPtr;    
       
  1633     };
       
  1634  
       
  1635  CCreatorContactBinaryField::CCreatorContactBinaryField(TInt aFieldType) 
       
  1636  : CCreatorContactFieldImpl(aFieldType)
       
  1637      { }
       
  1638  CCreatorContactBinaryField::~CCreatorContactBinaryField()
       
  1639      { 
       
  1640      delete iPtr; 
       
  1641      }
       
  1642    
       
  1643  void CCreatorContactBinaryField::ConstructL(const TDesC8& aData)
       
  1644      {
       
  1645      iPtr = HBufC8::New(KPhonebookFieldLength);
       
  1646      iPtr->Des() = aData;
       
  1647      }
       
  1648  
       
  1649  CCreatorContactBinaryField* CCreatorContactBinaryField::NewL(TInt aFieldType, const TDesC8& aData)
       
  1650       {
       
  1651       CCreatorContactBinaryField* self = new (ELeave) CCreatorContactBinaryField(aFieldType);
       
  1652       CleanupStack::PushL(self);
       
  1653       self->ConstructL(aData);
       
  1654       CleanupStack::Pop();
       
  1655       return self;
       
  1656       }
       
  1657  
       
  1658 void CCreatorContactBinaryField::AddToContactL(CCreatorEngine* /*aEngine*/, MVPbkStoreContact& aContact, CCreatorVirtualPhonebook* aVPbk)
       
  1659     {
       
  1660     LOGSTRING("Creator: CCreatorContactBinaryField::AddToContactL");
       
  1661     if( aVPbk == 0 )
       
  1662         User::Leave(KErrArgument);
       
  1663     if( iPtr )
       
  1664         {
       
  1665             aVPbk->AddFieldToContactItemL(aContact, iFieldType, iPtr->Des());
       
  1666         }
       
  1667     }
       
  1668 void CCreatorContactBinaryField::ParseL(CCommandParser* parser)
       
  1669      {
       
  1670      parser->StrParserL(iPtr, '&');
       
  1671      }
       
  1672 
       
  1673 void CCreatorContactBinaryField::SetDefaultRandomContentL(CCreatorEngine* /*aEngine*/)
       
  1674     {
       
  1675     LOGSTRING("Creator: CCreatorContactBinaryField::SetDefaultRandomContentL");
       
  1676     }
       
  1677 
       
  1678 /**
       
  1679  * CCreatorContactDateTimeField
       
  1680  */ 
       
  1681 class CCreatorContactDateTimeField : public CCreatorContactFieldImpl
       
  1682     {
       
  1683 public:
       
  1684     static CCreatorContactDateTimeField* NewL(TInt aFieldType, const TTime& aData);
       
  1685     ~CCreatorContactDateTimeField();  
       
  1686     virtual void AddToContactL(CCreatorEngine* aEngine, MVPbkStoreContact& aContact, CCreatorVirtualPhonebook* aVPbk);
       
  1687     virtual void ParseL(CCommandParser* parser);    
       
  1688 private:
       
  1689 CCreatorContactDateTimeField(TInt aFieldType);
       
  1690     void ConstructL(const TTime& aData);
       
  1691     TTime iPtr;    
       
  1692     };
       
  1693  
       
  1694 CCreatorContactDateTimeField::CCreatorContactDateTimeField(TInt aFieldType) 
       
  1695 : CCreatorContactFieldImpl(aFieldType)
       
  1696      { }
       
  1697 CCreatorContactDateTimeField::~CCreatorContactDateTimeField()
       
  1698      {
       
  1699      }
       
  1700    
       
  1701  void CCreatorContactDateTimeField::ConstructL(const TTime& aData)
       
  1702      {
       
  1703      iPtr = aData;
       
  1704      }
       
  1705  
       
  1706  CCreatorContactDateTimeField* CCreatorContactDateTimeField::NewL(TInt aFieldType, const TTime& aData)
       
  1707       {
       
  1708       CCreatorContactDateTimeField* self = new (ELeave) CCreatorContactDateTimeField(aFieldType);
       
  1709       CleanupStack::PushL(self);
       
  1710       self->ConstructL(aData);
       
  1711       CleanupStack::Pop();
       
  1712       return self;
       
  1713       }
       
  1714  
       
  1715 void CCreatorContactDateTimeField::AddToContactL(CCreatorEngine* aEngine, MVPbkStoreContact& aContact, CCreatorVirtualPhonebook* aVPbk)
       
  1716     {
       
  1717     LOGSTRING("Creator: CCreatorContactDateTimeField::AddToContactL");
       
  1718     if( aVPbk == 0 )
       
  1719         User::Leave(KErrArgument);
       
  1720     
       
  1721     //TTime undefTime();
       
  1722     if( iPtr == Time::NullTTime() )
       
  1723         {
       
  1724         iPtr = aEngine->RandomDate(CCreatorEngine::EDateFuture);
       
  1725         }
       
  1726     
       
  1727     aVPbk->AddFieldToContactItemL(aContact, iFieldType, iPtr);    
       
  1728     }
       
  1729 void CCreatorContactDateTimeField::ParseL(CCommandParser* /*parser*/)
       
  1730      {
       
  1731      //parser->StrParserL(iPtr, '&');
       
  1732      }
       
  1733 
       
  1734 /**
       
  1735  * CCreatorContactField Contact field API
       
  1736  */
       
  1737 CCreatorContactField* CCreatorContactField::NewL(TInt aFieldType, const TDesC& aData)
       
  1738     {
       
  1739     CCreatorContactField* self = new (ELeave) CCreatorContactField();
       
  1740     CleanupStack::PushL(self);
       
  1741     self->ConstructL(aFieldType, aData);
       
  1742     CleanupStack::Pop();
       
  1743     return self;
       
  1744     }
       
  1745 
       
  1746 CCreatorContactField* CCreatorContactField::NewL(TInt aFieldType, const TDesC8& aData)
       
  1747     {
       
  1748     CCreatorContactField* self = new (ELeave) CCreatorContactField();
       
  1749     CleanupStack::PushL(self);
       
  1750     self->ConstructL(aFieldType, aData);
       
  1751     CleanupStack::Pop();
       
  1752     return self;
       
  1753     }
       
  1754 
       
  1755 CCreatorContactField* CCreatorContactField::NewL(TInt aFieldType, const TTime& aData)
       
  1756     {
       
  1757     CCreatorContactField* self = new (ELeave) CCreatorContactField();
       
  1758     CleanupStack::PushL(self);
       
  1759     self->ConstructL(aFieldType, aData);
       
  1760     CleanupStack::Pop();
       
  1761     return self;
       
  1762     }
       
  1763 
       
  1764 void CCreatorContactField::ConstructL(TInt aFieldType, const TDesC& aData)
       
  1765     {
       
  1766     pImpl = CCreatorContactTextField::NewL(aFieldType, aData); 
       
  1767     }
       
  1768 
       
  1769 void CCreatorContactField::ConstructL(TInt aFieldType, const TDesC8& aData)
       
  1770     {
       
  1771     pImpl = CCreatorContactBinaryField::NewL(aFieldType, aData);    
       
  1772     }
       
  1773 
       
  1774 void CCreatorContactField::ConstructL(TInt aFieldType, const TTime& aData)
       
  1775     {
       
  1776     pImpl = CCreatorContactDateTimeField::NewL(aFieldType, aData);    
       
  1777     }
       
  1778 
       
  1779 CCreatorContactField::CCreatorContactField()
       
  1780     {}
       
  1781 CCreatorContactField::~CCreatorContactField()
       
  1782     {
       
  1783     delete pImpl;
       
  1784     }
       
  1785  
       
  1786 TInt CCreatorContactField::FieldType()
       
  1787     {
       
  1788     return pImpl->FieldType();
       
  1789     }
       
  1790 void CCreatorContactField::AddToContactL(CCreatorEngine* aEngine, MVPbkStoreContact& aContact, CCreatorVirtualPhonebook* aVPbk)
       
  1791     {
       
  1792     pImpl->AddToContactL(aEngine, aContact, aVPbk);
       
  1793     }
       
  1794 void CCreatorContactField::ParseL(CCommandParser* parser)
       
  1795     {
       
  1796     pImpl->ParseL(parser);
       
  1797     }
       
  1798 
       
  1799 void CCreatorContactField::SetRandomParametersL(TRandomLengthType aRandomLenType, TInt aRandomLen )
       
  1800     {
       
  1801     pImpl->SetRandomParametersL(aRandomLenType, aRandomLen);
       
  1802     }