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