creator/engine/src/creator_phonebook.cpp
changeset 17 4f2773374eff
child 19 4b22a598b890
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creator/engine/src/creator_phonebook.cpp	Fri May 14 15:53:02 2010 +0300
@@ -0,0 +1,1055 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+#include "engine.h"
+#include "enginewrapper.h"
+
+#include "creator_phonebook.h" 
+#include "creator_traces.h"
+
+#include <bautils.h> 
+#include <qpixmap>
+
+//#include <QDebug>
+_LIT(KTempPath, "C:\\Data\\Creator\\");
+
+
+typedef struct {
+QString iDetail;
+QString iFieldContext;
+QString iFieldString;
+TInt iRandomType;
+} DetailFieldInfo;
+static const TInt RND_TYPE_UNDEF = -99;
+DetailFieldInfo CreatorPbkMiscTextFields[] = {        
+        { (QContactName::DefinitionName).operator QString(), (QContactDetail::ContextHome).operator QString(), (QContactName::FieldFirstName).operator QString(), (TInt) CCreatorEngine::EFirstName},
+        { (QContactName::DefinitionName).operator QString(), (QContactDetail::ContextHome).operator QString(), (QContactName::FieldLastName).operator QString(), (TInt) CCreatorEngine::ESurname},
+        { (QContactOrganization::DefinitionName).operator QString(), (QContactDetail::ContextWork).operator QString(), (QContactOrganization::FieldName).operator QString(), (TInt) CCreatorEngine::ECompany},
+        { (QContactOrganization::DefinitionName).operator QString(), (QContactDetail::ContextWork).operator QString(), (QContactOrganization::FieldTitle).operator QString(), (TInt) CCreatorEngine::EJobTitle},
+        { (QContactName::DefinitionName).operator QString(), (QContactDetail::ContextHome).operator QString(), (QContactName::FieldPrefix).operator QString(), (TInt) CCreatorEngine::EPrefix},
+        { (QContactName::DefinitionName).operator QString(), (QContactDetail::ContextHome).operator QString(), (QContactName::FieldSuffix).operator QString(), (TInt) CCreatorEngine::ESuffix},
+        { (QContactName::DefinitionName).operator QString(), (QContactDetail::ContextHome).operator QString(), (QContactName::FieldMiddleName).operator QString(), (TInt) CCreatorEngine::EFirstName},
+        { (QContactAddress::DefinitionName).operator QString(), (QContactDetail::ContextHome).operator QString(), (QContactAddress::FieldStreet).operator QString(), (TInt) CCreatorEngine::EAddress},
+        { (QContactAddress::DefinitionName).operator QString(), (QContactDetail::ContextHome).operator QString(), (QContactAddress::FieldLocality).operator QString(), (TInt) CCreatorEngine::ECity},
+        { (QContactAddress::DefinitionName).operator QString(), (QContactDetail::ContextHome).operator QString(), (QContactAddress::FieldRegion).operator QString(), (TInt) CCreatorEngine::EState},
+        { (QContactAddress::DefinitionName).operator QString(), (QContactDetail::ContextHome).operator QString(), (QContactAddress::FieldPostcode).operator QString(), (TInt) CCreatorEngine::EPostcode},
+        { (QContactAddress::DefinitionName).operator QString(), (QContactDetail::ContextHome).operator QString(), (QContactAddress::FieldCountry).operator QString(), (TInt) CCreatorEngine::ECountry},
+        { (QContactAddress::DefinitionName).operator QString(), (QContactDetail::ContextWork).operator QString(), (QContactAddress::FieldStreet).operator QString(), (TInt) CCreatorEngine::EAddress},
+        { (QContactAddress::DefinitionName).operator QString(), (QContactDetail::ContextWork).operator QString(), (QContactAddress::FieldLocality).operator QString(), (TInt) CCreatorEngine::ECity},
+        { (QContactAddress::DefinitionName).operator QString(), (QContactDetail::ContextWork).operator QString(), (QContactAddress::FieldRegion).operator QString(), (TInt) CCreatorEngine::EState},
+        { (QContactAddress::DefinitionName).operator QString(), (QContactDetail::ContextWork).operator QString(), (QContactAddress::FieldPostcode).operator QString(), (TInt) CCreatorEngine::EPostcode},
+        { (QContactAddress::DefinitionName).operator QString(), (QContactDetail::ContextWork).operator QString(), (QContactAddress::FieldCountry).operator QString(), (TInt) CCreatorEngine::ECountry},
+        { (QContactPhoneNumber::DefinitionName).operator QString(), (QContactDetail::ContextWork).operator QString(), (QContactPhoneNumber::SubTypeMobile).operator QString(), (TInt) CCreatorEngine::EPhoneNumber},
+        { (QContactPhoneNumber::DefinitionName).operator QString(), (QContactDetail::ContextWork).operator QString(), (QContactPhoneNumber::SubTypeLandline).operator QString(), (TInt) CCreatorEngine::EPhoneNumber},
+        { (QContactNote::DefinitionName).operator QString(), (QContactDetail::ContextHome).operator QString(), (QContactNote::FieldNote).operator QString(), (TInt)  CCreatorEngine::EMemoText},
+        { (QContactOrganization::DefinitionName).operator QString(), (QContactDetail::ContextWork).operator QString(), (QContactOrganization::FieldDepartment).operator QString(), (TInt) CCreatorEngine::ECompany},
+        { (QContactOrganization::DefinitionName).operator QString(), (QContactDetail::ContextWork).operator QString(), (QContactOrganization::FieldAssistantName).operator QString(), (TInt) CCreatorEngine::ECompany},
+        { (QContactFamily::DefinitionName).operator QString(), (QContactDetail::ContextHome).operator QString(), (QContactFamily::FieldSpouse).operator QString(), (TInt) CCreatorEngine::EFirstName},
+        { (QContactFamily::DefinitionName).operator QString(), (QContactDetail::ContextHome).operator QString(), (QContactFamily::FieldChildren).operator QString(), (TInt) CCreatorEngine::EFirstName},
+        { (QContactName::DefinitionName).operator QString(), (QContactDetail::ContextHome).operator QString(),  (QContactName::FieldCustomLabel).operator QString(), (TInt) CCreatorEngine::EFirstName}
+        };
+                  
+/*TInt CreatorVPbkBinaryFields[] = {
+        R_VPBK_FIELD_TYPE_CALLEROBJIMG//,
+        //R_VPBK_FIELD_TYPE_THUMBNAILPATH
+        };*/
+
+/*QString CreatorPbkDateTimeFields[] = {
+        QContactAnniversary::DefinitionName//R_VPBK_FIELD_TYPE_ANNIVERSARY
+        };*/
+
+//----------------------------------------------------------------------------
+
+/*
+typedef struct{
+QString iFieldContext;
+QString iFieldString;
+}PhoneNumInfo;
+PhoneNumInfo CreatorPhoneNumberFields[] =
+    {
+    { QContactPhoneNumber::ContextHome, QContactPhoneNumber::SubTypeLandline},
+    { QContactPhoneNumber::ContextWork, QContactPhoneNumber::SubTypeLandline},                        
+    { QContactPhoneNumber::ContextHome, QContactPhoneNumber::SubTypeMobile},
+    { QContactPhoneNumber::ContextWork, QContactPhoneNumber::SubTypeMobile},
+    { QContactPhoneNumber::ContextHome, QContactPhoneNumber::SubTypeFacsimile},
+    { QContactPhoneNumber::ContextWork, QContactPhoneNumber::SubTypeFacsimile},
+    { QContactPhoneNumber::ContextWork, QContactPhoneNumber::SubTypePager },           
+    { QContactPhoneNumber::ContextHome, QContactPhoneNumber::SubTypeVideo },
+    { QContactPhoneNumber::ContextWork, QContactPhoneNumber::SubTypeVideo },
+    { QContactPhoneNumber::ContextHome, QContactPhoneNumber::SubTypeVoice },
+    { QContactPhoneNumber::ContextWork, QContactPhoneNumber::SubTypeVoice },
+    { QContactPhoneNumber::ContextWork, QContactPhoneNumber::SubTypeAssistant },
+    { QContactPhoneNumber::ContextHome, QContactPhoneNumber::SubTypeCar }
+    };
+
+*/
+typedef struct{
+QString iFieldContext;
+QString iFieldString;
+}PhoneNumInfo;
+PhoneNumInfo CreatorPhoneNumberFields[] =
+    {
+    { "Home", "Landline"},
+    { "Work", "Landline"},                        
+    { "Home","Mobile"},
+    { "Work", "Mobile"},
+    { "Home", "Facsimile"},
+    { "Work", "Facsimile"},
+    { "Work", "Pager"},
+    { "Home", "Video"},
+    { "Work", "Video"},   //{ "Home", "Voice" },//{ "Work", "Voice" },
+    { "Work", "Assistant" },
+    { "Home",  "Car" }
+    };
+
+
+/*QString CCreatorPhonebook::iPhoneNumberFields[] =
+    {
+    {QContactPhoneNumber::SubTypeLandline},
+    {QContactPhoneNumber::SubTypeMobile},
+    {QContactPhoneNumber::SubTypeFacsimile},
+    {QContactPhoneNumber::SubTypePager},           
+    {QContactPhoneNumber::SubTypeVideo},
+    {QContactPhoneNumber::SubTypeVoice} ,
+    {QContactPhoneNumber::SubTypeAssistant},
+    {QContactPhoneNumber::SubTypeCar} 
+    };
+*/
+/*
+QStringList CreatorPbkContextFields =
+    {
+    QContactDetail::ContextHome,
+    QContactDetail::ContextWork
+    };
+*/
+QString CreatorPbkEmailFields[] =
+    {
+    //R_VPBK_FIELD_TYPE_EMAILGEN,
+    (QContactDetail::ContextHome).operator QString(),//"Home",//R_VPBK_FIELD_TYPE_EMAILHOME,
+    (QContactDetail::ContextWork).operator QString()//R_VPBK_FIELD_TYPE_EMAILWORK
+    };
+
+
+CPhonebookParameters::CPhonebookParameters()
+    {
+    LOGSTRING("Creator: CVirtualPhonebookParameters::CVirtualPhonebookParameters");
+    //iGroupName = HBufC::New(KPhonebookFieldLength);  
+    }
+
+CPhonebookParameters::~CPhonebookParameters()
+    {
+    LOGSTRING("Creator: CVirtualPhonebookParameters::~CVirtualPhonebookParameters");
+
+    //delete iGroupName;   
+    //iContactFields.ResetAndDestroy();
+    //iContactFields.Close();
+    
+    //iLinkIds.clear();
+    iLinkIds.Reset();
+    iLinkIds.Close();
+    }
+
+void CPhonebookParameters::ParseL(CCommandParser* /*parser*/, TParseParams /*aCase = 0*/)
+	{
+	}
+
+TInt CPhonebookParameters::ScriptLinkId() const
+    {
+    return iLinkId;
+    }
+
+void CPhonebookParameters::SetScriptLinkId(TInt aLinkId)
+    {
+    iLinkId = aLinkId;
+    }
+
+
+//----------------------------------------------------------------------------
+
+CCreatorPhonebook* CCreatorPhonebook::NewL(CCreatorEngine* aEngine)
+    {
+    CCreatorPhonebook* self = CCreatorPhonebook::NewLC(aEngine);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+CCreatorPhonebook* CCreatorPhonebook::NewLC(CCreatorEngine* aEngine)
+    {
+    CCreatorPhonebook* self = new (ELeave) CCreatorPhonebook();
+    CleanupStack::PushL(self);
+    self->ConstructL(aEngine);
+    return self;
+    }
+
+
+CCreatorPhonebook::CCreatorPhonebook() 
+    {
+    iAddAllFields = EFalse;
+    }
+
+void CCreatorPhonebook::ConstructL(CCreatorEngine* aEngine)
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::ConstructL");
+	
+	iEngine = aEngine;
+	
+	iContactMngr = new QContactManager("symbian");
+
+	SetDefaultParameters();
+    }
+	
+
+CCreatorPhonebook::~CCreatorPhonebook()
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::~CCreatorPhonebook");
+ 
+    if ( iContactsToDelete.Count() )
+    	{
+        TRAP_IGNORE( StoreLinksForDeleteL( iContactsToDelete, KUidDictionaryUidContacts ) );
+        }
+    if ( iContactGroupsToDelete.Count() )
+    	{
+        TRAP_IGNORE( StoreLinksForDeleteL( iContactGroupsToDelete, KUidDictionaryUidContactGroups ) );
+        }
+    
+	if( iContactMngr )
+		{
+		delete iContactMngr;
+		}
+    
+    if (iParameters)
+    	{
+        delete iParameters;
+    	}
+    }
+
+//----------------------------------------------------------------------------
+
+TBool CCreatorPhonebook::AskDataFromUserL(TInt aCommand, TInt& aNumberOfEntries)
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::AskDataFromUserL");
+
+    TBool ret = CCreatorPhonebookBase::AskDataFromUserL(aCommand, aNumberOfEntries);
+   
+    if(ret && aCommand == ECmdCreatePhoneBookEntryContacts && !iDefaultFieldsSelected)    
+        {
+        iAddAllFields = iEngine->GetEngineWrapper()->YesNoQueryDialog(_L("Add all the other fields to contacts?"));
+        }
+    return ret;
+    }
+
+
+//----------------------------------------------------------------------------
+
+TInt CCreatorPhonebook::CreateContactEntryL(CCreatorModuleBaseParameters *aParameters)
+    {
+	TInt err=0;	
+
+	InitializeContactParamsL();
+	bool success = false;
+	// create a new contact item
+	//iStore = new QContact();
+	
+	QContact iStore;
+	
+	int numberOfFields = iParameters->iContactFields.count();
+	QString phone;
+	for(int i=0; i< numberOfFields; i++ )
+		{
+		QContactDetail* cntdet = new QContactDetail(iParameters->iContactFields.at(i));
+		success = iStore.saveDetail( cntdet );
+		delete cntdet;		
+		}
+	
+	iContactMngr->saveContact( &iStore );
+	
+	iContactsToDelete.Append( (TUint32)iStore.localId() );
+	//delete iStore;
+    return err;
+    }
+
+
+//----------------------------------------------------------------------------
+
+
+
+//----------------------------------------------------------------------------
+
+void CCreatorPhonebook::DeleteAllL()
+    {
+	QList<QContactLocalId> contacts = iContactMngr->contactIds();
+	DeleteContactsL( contacts );
+    }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DeleteAllCreatedByCreatorL()
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::DeleteAllCreatedByCreatorL");
+    DeleteItemsCreatedWithCreatorL( KUidDictionaryUidContacts );
+    }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DeleteAllGroupsL()
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::DeleteAllGroupsL");
+    
+    QList<QContactLocalId> contacts = iContactMngr->contactIds();
+    QList<QContactLocalId> groups;
+    for(int i = 0; i < contacts.count(); i++)
+    	{
+		QContact group = iContactMngr->contact( contacts.at(i) );
+		if( group.type() == QContactType::TypeGroup )
+			{
+			groups.append( group.localId() );
+			}
+    	}
+    DeleteContactsL( groups );
+/*  
+    User::LeaveIfNull( iStore );
+    MVPbkContactLinkArray* groups = iStore->ContactGroupsLC();
+    DeleteContactsL( groups, ETrue );
+    CleanupStack::PopAndDestroy(); // cannot use groups as parameter
+    */
+    }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DeleteAllGroupsCreatedByCreatorL()
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::DeleteAllGroupsCreatedByCreatorL");
+    DeleteItemsCreatedWithCreatorL( KUidDictionaryUidContactGroups );
+    }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DeleteContactsL( QList<QContactLocalId>& aContacts /*MVPbkContactLinkArray* aContacts, TBool aGroup*/ )
+    {
+	//QList<QContactLocalId> contacts = iContactMngr->contactIds();
+    QMap<int, QContactManager::Error> errorMap;
+	iContactMngr->removeContacts( &aContacts, &errorMap );
+    }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DeleteItemsCreatedWithCreatorL( TUid aStoreUid )
+    {
+	CDictionaryFileStore* store = iEngine->FileStoreLC();
+	       User::LeaveIfNull( store );
+	       
+	       QList<QContactLocalId> contacts;
+	       // backup previous contact links from store
+	       // otherwise they would be overwritten when calling out.WriteL
+	       TUint32 creatorLink;
+	       if ( store->IsPresentL( aStoreUid ) )
+	           {
+	           RDictionaryReadStream in;
+	           in.OpenLC( *store, aStoreUid );
+	           TRAP_IGNORE( 
+	               do{ 
+	                   creatorLink = in.ReadUint32L();
+	                   QContact contact = iContactMngr->contact( creatorLink );
+	                   if( (contact.type() == QContactType::TypeGroup && aStoreUid == KUidDictionaryUidContactGroups ) ||  (contact.type() != QContactType::TypeGroup && aStoreUid != KUidDictionaryUidContactGroups) )
+	                	   {
+						   contacts.append( creatorLink );
+	                	   }
+	               }while( creatorLink );)
+	           
+	           CleanupStack::PopAndDestroy(); // in
+	           }
+	       
+	       
+	       DeleteContactsL( contacts );
+	       
+	       store->Remove( aStoreUid );
+	       store->CommitL();
+	       
+	       CleanupStack::PopAndDestroy( store );
+    }
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::DoDeleteItemsCreatedWithCreatorL( TUid aStoreUid, CDictionaryFileStore* aStore )
+    {
+    
+    }
+
+//----------------------------------------------------------------------------
+TBool CCreatorPhonebook::HasOtherThanGroupsL( /*MVPbkContactLinkArray* aContacts */)
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::HasOtherThanGroupsL");
+    TBool result( EFalse );
+    return result;
+    }
+
+QContactDetail CCreatorPhonebook::CreateContactDetail(QString aDetail, QString aFieldContext, QString aFieldString, TInt aRand )
+	{
+	QContactDetail contactDetail;
+	TPtrC contentData;
+	if( aDetail == QContactPhoneNumber::DefinitionName)
+		{
+		QContactPhoneNumber phoneNumber;// = contactDetail;
+		phoneNumber.setContexts(aFieldContext);
+		phoneNumber.setSubTypes(aFieldString);
+		contentData.Set(iEngine->RandomString((CCreatorEngine::TRandomStringType) aRand));
+		QString number = QString::fromUtf16(contentData.Ptr(),contentData.Length());
+		phoneNumber.setNumber(number);
+		return phoneNumber;
+		}
+	else if( aDetail == QContactName::DefinitionName )			//--Contact NAME-----------------------------
+		{
+		QContactName contactName;
+		for(int i = 0 ; i < iParameters->iContactFields.count() ; i++ ) //go through all contact details to check if there is already Contact Name to set other details
+			{
+			if(iParameters->iContactFields.at(i).definitionName() == QContactName::DefinitionName )
+				{
+				contactName = iParameters->iContactFields.at(i);
+				}
+			}
+		contentData.Set(iEngine->RandomString((CCreatorEngine::TRandomStringType) aRand));
+		QString name = QString::fromUtf16(contentData.Ptr(),contentData.Length());
+		if(aFieldString == QContactName::FieldFirstName)
+			{
+			if(contactName.firstName().isEmpty())
+				{
+				contactName.setFirstName( name );
+				}
+			}
+		else if(aFieldString == QContactName::FieldLastName)
+			{
+			if(contactName.lastName().isEmpty())
+				{
+				contactName.setLastName( name );
+				}
+			}
+		else if(aFieldString == QContactName::FieldMiddleName)
+			{
+			if(contactName.middleName().isEmpty())
+				{
+				contactName.setMiddleName( name );
+				}
+			}
+		else if(aFieldString == QContactName::FieldPrefix)
+			{
+			if(contactName.prefix().isEmpty())
+				{
+				contactName.setPrefix( name );
+				}
+			}
+		else if(aFieldString == QContactName::FieldSuffix)
+			{
+			if(contactName.suffix().isEmpty())
+				{
+				contactName.setSuffix( name );
+				}
+			}
+		else		//QContactName::FieldCustomLabel:
+			{
+			if(contactName.customLabel().isEmpty())
+				{
+				contactName.setCustomLabel( name );
+				}
+			}
+		return contactName;
+		}
+	else if( aDetail == QContactOrganization::DefinitionName )			//--Contact Company-----------------------------
+		{
+		QContactOrganization contactCompany;
+		
+		for(int i = 0 ; i < iParameters->iContactFields.count() ; i++ ) //go through all contact details to check if there is already Contact Name to set other details
+			{
+			if(iParameters->iContactFields.at(i).definitionName() == QContactOrganization::DefinitionName )
+				{
+				contactCompany = iParameters->iContactFields.at(i);
+				}
+			}
+		contentData.Set(iEngine->RandomString((CCreatorEngine::TRandomStringType) aRand));
+		QString company = QString::fromUtf16(contentData.Ptr(),contentData.Length());
+		if(aFieldString == QContactOrganization::FieldName)
+			{
+			if(contactCompany.name().isEmpty())
+				{
+				contactCompany.setName( company );
+				}
+			}
+		if(aFieldString == QContactOrganization::FieldTitle)
+			{
+			if(contactCompany.title().isEmpty())
+				{
+				contactCompany.setTitle( company );
+				}
+			}
+		if(aFieldString == QContactOrganization::FieldDepartment)
+			{
+			//if(contactCompany.department().isEmpty())
+				//{
+				QStringList depList = contactCompany.department();
+				depList.append(company);
+				contactCompany.setDepartment(depList);
+				//}
+			}
+		if(aFieldString == QContactOrganization::FieldAssistantName)
+			{
+			if(contactCompany.assistantName().isEmpty())
+				{
+				contactCompany.setAssistantName( company );
+				}
+			}
+		return contactCompany;
+		}
+	else if( aDetail == QContactAddress::DefinitionName )			//--Contact Address-----------------------------
+			{
+			QContactAddress contactAddress;
+			
+			for(int i = 0 ; i < iParameters->iContactFields.count() ; i++ ) //go through all contact details to check if there is already Contact Name to set other details
+				{
+				if(iParameters->iContactFields.at(i).definitionName() == QContactAddress::DefinitionName && iParameters->iContactFields.at(i).value(QContactDetail::FieldContext) == aFieldContext )
+					{
+					contactAddress = iParameters->iContactFields.at(i);
+					}
+				}
+			
+			contactAddress.setContexts( aFieldContext );
+			
+			contentData.Set(iEngine->RandomString((CCreatorEngine::TRandomStringType) aRand));
+			QString address = QString::fromUtf16(contentData.Ptr(),contentData.Length());
+			if(aFieldString == QContactAddress::FieldStreet )
+				{
+				if( contactAddress.street().isEmpty() )
+					{
+					contactAddress.setStreet( address );
+					}
+				}
+			else if(aFieldString == QContactAddress::FieldLocality )
+				{
+				if( contactAddress.locality().isEmpty() )
+					{
+					contactAddress.setLocality( address );
+					}
+				}
+			else if(aFieldString == QContactAddress::FieldRegion )
+				{
+				if( contactAddress.region().isEmpty() )
+					{
+					contactAddress.setRegion( address );
+					}
+				}
+			else if(aFieldString == QContactAddress::FieldPostcode )
+				{
+				if( contactAddress.postcode().isEmpty() )
+					{
+					contactAddress.setPostcode( address );
+					}
+				}
+			else if(aFieldString == QContactAddress::FieldCountry )
+				{
+				if( contactAddress.country().isEmpty() )
+					{
+					contactAddress.setCountry( address );
+					}
+				}
+			else 
+				{
+				return contactDetail;
+				}
+			return contactAddress;
+			}
+	else if( aDetail == QContactNote::DefinitionName )			//--Contact Note-----------------------------
+				{
+				QContactNote contactNote;
+				contentData.Set(iEngine->RandomString((CCreatorEngine::TRandomStringType) aRand));
+				QString note = QString::fromUtf16(contentData.Ptr(),contentData.Length());
+				contactNote.setNote(note);
+				return contactNote;
+				}
+	else if( aDetail == QContactFamily::DefinitionName )			//--Contact Family-----------------------------
+				{
+				QContactFamily contactFamily;
+				
+				for(int i = 0 ; i < iParameters->iContactFields.count() ; i++ ) //go through all contact details to check if there is already Contact Name to set other details
+					{
+					if(iParameters->iContactFields.at(i).definitionName() == QContactFamily::DefinitionName && iParameters->iContactFields.at(i).value(QContactDetail::FieldContext) == aFieldContext )
+						{
+						contactFamily = iParameters->iContactFields.at(i);
+						}
+					}
+				contentData.Set(iEngine->RandomString((CCreatorEngine::TRandomStringType) aRand));
+				QString familyData = QString::fromUtf16(contentData.Ptr(),contentData.Length());
+				if(aFieldString == QContactFamily::FieldSpouse )
+					{
+					if( contactFamily.spouse().isEmpty() )
+						{
+						contactFamily.setSpouse( familyData );
+						}
+					}
+				if(aFieldString == QContactFamily::FieldChildren )
+					{
+						QStringList children = contactFamily.children();
+						children.append( familyData );
+						contactFamily.setChildren( children );
+					}
+				
+				return contactFamily;
+				}
+	
+	if( aDetail == QContactAvatar::DefinitionName)						//--Contact Picture-----------------------------
+			{
+			RFs& fs = CCoeEnv::Static()->FsSession();
+			QContactAvatar contactAvatar;
+			TBuf<KMaxFileName> srcPath;
+			iEngine->RandomPictureFileL(srcPath);
+			TBuf<KMaxFileName> destPath(KTempPath);
+						
+			if(!BaflUtils::FolderExists( fs, destPath ))
+				{
+				BaflUtils::EnsurePathExistsL( fs, destPath );
+				}
+			
+			TInt err=BaflUtils::CopyFile( fs, srcPath, destPath );
+
+			TParse temp;
+			temp.Set( srcPath,NULL,NULL );
+			destPath.Append(temp.NameAndExt());
+			
+			QString avatarFile = QString::fromUtf16( destPath.Ptr(),destPath.Length() );
+			
+			QPixmap avatarPix(avatarFile);
+
+			contactAvatar.setAvatar(avatarFile);
+            contactAvatar.setPixmap(avatarPix);
+
+			return contactAvatar;
+			}
+	if( aDetail == QContactAnniversary::DefinitionName)
+			{
+			QContactAnniversary contactAnniversary;
+			QDate date;
+			TTime datetime = iEngine->RandomDate( CCreatorEngine::EDateFuture );
+			date.setDate( datetime.DateTime().Year(),(int) (datetime.DateTime().Month()+1), datetime.DateTime().Day() );
+			//contactAnniversary.setEvent(QContactAnniversary::);
+			contactAnniversary.setOriginalDate( date );
+			return contactAnniversary;
+			}
+			
+
+
+	
+	
+	return contactDetail;
+	}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void CCreatorPhonebook::StoreLinksForDeleteL( RArray<TUint32>& aLinks, TUid aStoreUid )
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::StoreLinksForDeleteL");
+    CDictionaryFileStore* store = iEngine->FileStoreLC();
+       User::LeaveIfNull( store );
+       
+       // backup previous contact links from store
+       // otherwise they would be overwritten when calling out.WriteL
+       TUint32 previousLink;
+       if ( store->IsPresentL( aStoreUid ) )
+           {
+           RDictionaryReadStream in;
+           in.OpenLC( *store, aStoreUid );
+           bool r = false;
+           TRAP_IGNORE( 
+               do{ //iContactMngr->CreateLinksLC( in )) != NULL ) // will leave with KErrEof
+                   previousLink = in.ReadUint32L();
+                   iPreviousDeleteLinks.Append( previousLink );
+                   if(previousLink)
+                	   {
+					   r=true;
+                	   }
+                   else
+                	   {
+					   r=false;
+                	   }
+               }while(r==true); );
+           
+           CleanupStack::PopAndDestroy(); // in
+           }
+
+       RDictionaryWriteStream out;       
+       out.AssignLC( *store, aStoreUid );
+       
+       // restore previous links
+       for ( TInt i = 0; i < iPreviousDeleteLinks.Count(); i++ )
+           {
+           out.WriteUint32L( iPreviousDeleteLinks[i] );
+           //CleanupStack::PopAndDestroy(); // PackLC            
+           }
+       
+       // write new links
+       for(int i=0; i < aLinks.Count(); i++)
+    	   {
+		   //TUint32 localId = (TUint32) aLinks[i];
+		   //out.WriteUint32L( aLinks[i] );
+		   out.WriteUint32L( aLinks[i] );
+    	   }
+       out.CommitL();
+       //CleanupStack::PopAndDestroy(); // aLinks.PackLC
+       CleanupStack::PopAndDestroy(); // out
+       
+       store->CommitL();
+
+       CleanupStack::PopAndDestroy( store );
+    }
+
+//----------------------------------------------------------------------------
+       
+//----------------------------------------------------------------------------
+/*TInt CCreatorPhonebook::iPhoneNumberFields[] =
+    {
+    R_VPBK_FIELD_TYPE_LANDPHONEGEN,
+    R_VPBK_FIELD_TYPE_LANDPHONEHOME,
+    R_VPBK_FIELD_TYPE_LANDPHONEWORK,                        
+    R_VPBK_FIELD_TYPE_MOBILEPHONEGEN,
+    R_VPBK_FIELD_TYPE_MOBILEPHONEHOME,
+    R_VPBK_FIELD_TYPE_MOBILEPHONEWORK,
+    R_VPBK_FIELD_TYPE_FAXNUMBERGEN,
+    R_VPBK_FIELD_TYPE_FAXNUMBERHOME,
+    R_VPBK_FIELD_TYPE_FAXNUMBERWORK,
+    R_VPBK_FIELD_TYPE_PAGERNUMBER,           
+    R_VPBK_FIELD_TYPE_VIDEONUMBERGEN,
+    R_VPBK_FIELD_TYPE_VIDEONUMBERHOME,
+    R_VPBK_FIELD_TYPE_VIDEONUMBERWORK,
+    R_VPBK_FIELD_TYPE_VOIPGEN,
+    R_VPBK_FIELD_TYPE_VOIPHOME,
+    R_VPBK_FIELD_TYPE_VOIPWORK,
+    R_VPBK_FIELD_TYPE_ASSTPHONE,
+    R_VPBK_FIELD_TYPE_CARPHONE
+    };*/
+
+/*TInt CCreatorPhonebook::iUrlFields[] =
+    {
+    R_VPBK_FIELD_TYPE_URLGEN,
+    R_VPBK_FIELD_TYPE_URLHOME,
+    R_VPBK_FIELD_TYPE_URLWORK
+    };*/
+
+/*TInt CCreatorPhonebook::iEmailFields[] =
+    {
+    R_VPBK_FIELD_TYPE_EMAILGEN,
+    R_VPBK_FIELD_TYPE_EMAILHOME,
+    R_VPBK_FIELD_TYPE_EMAILWORK
+    };*/
+
+void CCreatorPhonebook::InitializeContactParamsL(/*CCreatorModuleBaseParameters* aParameters*/)
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::InitializeContactParamsL");        
+ 
+    iParameters = new (ELeave) CPhonebookParameters;
+           
+    iParameters->iNumberOfPhoneNumberFields = iNumberOfPhoneNumberFields;
+    iParameters->iNumberOfURLFields = iNumberOfURLFields;
+    iParameters->iNumberOfEmailAddressFields = iNumberOfEmailAddressFields;       
+    
+        
+    QContactName name;
+    
+    TPtrC fname = iEngine->RandomString(CCreatorEngine::EFirstName);
+    TPtrC lname = iEngine->RandomString(CCreatorEngine::ESurname);
+    QString firstname = QString::fromUtf16( fname.Ptr(), fname.Length() ); 
+    QString lastname  = QString::fromUtf16( lname.Ptr(), lname.Length() );               
+    
+    name.setFirstName(firstname);
+    name.setLastName(lastname);
+    
+    if( iAddAllFields )
+        {
+		TInt textFieldCount = sizeof(CreatorPbkMiscTextFields) / sizeof(DetailFieldInfo);
+		for( TInt tfIndex = 0; tfIndex < textFieldCount; ++tfIndex )
+                    { 
+    				QContactDetail field = CreateContactDetail( CreatorPbkMiscTextFields[tfIndex].iDetail, CreatorPbkMiscTextFields[tfIndex].iFieldContext, CreatorPbkMiscTextFields[tfIndex].iFieldString, CreatorPbkMiscTextFields[tfIndex].iRandomType );
+    				bool replace = false;
+                    for(int i = 0 ; i< iParameters->iContactFields.count() ; i++)
+                    	{
+						if( !field.isEmpty() && field.definitionName() == iParameters->iContactFields.at(i).definitionName() )
+							{
+							QString context = field.value(QContactDetail::FieldContext);
+							bool isContextEmpty = context.isEmpty();
+							if(  isContextEmpty ||  ( field.value(QContactDetail::FieldContext) == iParameters->iContactFields.at(i).value(QContactDetail::FieldContext)) )
+								{
+								//replace
+								iParameters->iContactFields.replace(i,field);
+								replace = true;
+								}
+							}
+                    	}
+						if(!replace)
+							{
+							if(!field.isEmpty())
+								{
+								iParameters->iContactFields.append(field);
+								}
+							}
+                    }
+		// Add binary fields:
+		QContactDetail field = CreateContactDetail(QContactAvatar::DefinitionName,"","",0);
+		iParameters->iContactFields.append(field);
+		
+		// Add date-time fields:
+		QContactDetail fieldAnniv = CreateContactDetail(QContactAnniversary::DefinitionName,"","",0);
+		iParameters->iContactFields.append(fieldAnniv);
+    //***************************************************************************
+    // Add text fields:
+ /*           TInt textFieldCount = sizeof(CreatorVPbkMiscTextFields) / sizeof(FieldInfo);
+            for( TInt tfIndex = 0; tfIndex < textFieldCount; ++tfIndex )
+                { 
+				//QContactDetail field;
+                CCreatorContactField* field = CCreatorContactField::NewL(CreatorVPbkMiscTextFields[tfIndex].iFieldCode, KNullDesC);
+                CleanupStack::PushL(field);
+                field->SetRandomParametersL(CCreatorContactField::ERandomLengthDefault);
+                iParameters->iContactFields.AppendL(field);
+                CleanupStack::Pop(field);
+                }
+                
+            // Add binary fields:
+            TInt binFieldCount = sizeof(CreatorVPbkBinaryFields) / sizeof(TInt);
+            for( TInt bfIndex = 0; bfIndex < binFieldCount; ++bfIndex )
+                {                
+                CCreatorContactField* field = CCreatorContactField::NewL(CreatorVPbkBinaryFields[bfIndex], KNullDesC8);
+                CleanupStack::PushL(field);
+                field->SetRandomParametersL(CCreatorContactField::ERandomLengthDefault);
+                iParameters->iContactFields.AppendL(field);
+                CleanupStack::Pop(field);
+                }
+                
+            // Add date-time fields:
+            TInt dtFieldCount = sizeof(CreatorVPbkDateTimeFields) / sizeof(TInt);
+            for( TInt dtIndex = 0; dtIndex < dtFieldCount; ++dtIndex )
+                {
+                AddFieldToParamsL(CreatorVPbkDateTimeFields[dtIndex], iEngine->RandomDate(CCreatorEngine::EDateFuture));
+                }
+
+            AddFieldToParamsL(R_VPBK_FIELD_TYPE_CALLEROBJIMG, KNullDesC8);        
+            AddFieldToParamsL(R_VPBK_FIELD_TYPE_THUMBNAILPIC, KNullDesC8);        
+            AddFieldToParamsL(R_VPBK_FIELD_TYPE_CALLEROBJTEXT, firstname);*/
+    //***************************************************************************
+    
+		//iParameters->iContactFields.append( name );
+        }
+    else
+        {    
+		iParameters->iContactFields.append( name );
+        }
+                        
+      // Phone numbers:
+    TInt phoneFieldCount = sizeof(CreatorPhoneNumberFields) / sizeof(PhoneNumInfo);
+    
+    TInt inc=0;
+    for( int i=0; i<iNumberOfPhoneNumberFields; i++ )
+    	{
+    
+		if(inc >= phoneFieldCount )
+        	{
+    		inc = 0;
+        	}
+    
+		QContactPhoneNumber phoneNum;
+		TPtrC phoneNumber = iEngine->RandomString(CCreatorEngine::EPhoneNumber);
+		QString phone = QString::fromUtf16( phoneNumber.Ptr(), phoneNumber.Length() );
+		
+		phoneNum.setContexts(CreatorPhoneNumberFields[inc].iFieldContext);
+		phoneNum.setSubTypes(CreatorPhoneNumberFields[inc].iFieldString);
+		
+
+		phoneNum.setNumber( phone );
+
+		iParameters->iContactFields.append( phoneNum );
+		inc++;
+    	}
+    
+    
+    
+    // URLs:
+    for( int i=0; i<iNumberOfURLFields; i++ )
+          	{
+			QContactUrl contactUrl;
+			HBufC16* url = iEngine->CreateHTTPUrlLC();
+			QString urlAddress = QString::fromUtf16(url->Ptr(), url->Length() );
+			contactUrl.setUrl( urlAddress );
+			iParameters->iContactFields.append( contactUrl );
+			CleanupStack::PopAndDestroy(url);
+          	}
+
+    // EMail addresses:
+    for( int i=0; i<iNumberOfEmailAddressFields; i++ )
+        	{
+			QContactEmailAddress emailAddr;
+			HBufC16* addr= iEngine->CreateEmailAddressLC();;
+			/*TPtrC comp = iEngine->RandomString(CCreatorEngine::ECompany);
+			QString company = QString::fromUtf16( comp.Ptr(), comp.Length() );
+    		QString address = firstname+"@"+company+".com";*/
+			//CreatorPbkEmailFields
+			QString address = QString::fromUtf16(addr->Ptr(), addr->Length() );
+    		emailAddr.setEmailAddress( address );
+    		emailAddr.setContexts(CreatorPbkEmailFields[i%2]);
+    		iParameters->iContactFields.append( emailAddr );
+    		CleanupStack::PopAndDestroy(addr);
+        	}
+    
+    }
+
+
+
+// Checks if the link is a group or not
+TBool CCreatorPhonebook::IsContactGroupL()
+	{
+	return EFalse;
+	}
+
+TInt CCreatorPhonebook::CreateGroupEntryL(CCreatorModuleBaseParameters *aParameters)
+    {
+	 LOGSTRING("Creator: CCreatorVirtualPhonebook::CreateGroupEntryL");
+	    delete iParameters;
+	    iParameters = 0;
+	    
+	    CPhonebookParameters* parameters = (CPhonebookParameters*) aParameters;
+	    
+	    if( !parameters )
+	        {
+	        iParameters = new (ELeave) CPhonebookParameters;
+	        iParameters->iContactsInGroup = iContactsInGroup;
+	        TPtrC gname = iEngine->RandomString(CCreatorEngine::EGroupName);
+	        iParameters->iGroupName = QString::fromUtf16( gname.Ptr(),gname.Length() );
+	        iParameters->iGroupName += " #";
+	        int rnd = iEngine->RandomNumber(1000, 9999);
+	        iParameters->iGroupName += QString::number( rnd, 10 );
+	        parameters = iParameters;
+	        }
+
+	    TInt err = KErrNone;
+	 
+	    // create a new contact group
+	    QContact newGroup;
+	    newGroup.setType(QContactType::TypeGroup);
+        QContactName newGroupName;
+        newGroupName.setCustomLabel( iParameters->iGroupName );
+        newGroup.saveDetail(&newGroupName);
+        iContactMngr->saveContact(&newGroup);
+        QContactLocalId newGroupId = newGroup.localId();
+
+	        
+	    // define amounts of contacts to be added to the group
+	    TInt amountOfContactsToBeAdded = 0;
+	    if (parameters->iContactsInGroup == KCreateRandomAmountOfGroups)
+	    	{
+	        amountOfContactsToBeAdded = iEngine->RandomNumber(30);
+	    	}
+	    else 
+	    	{
+	        amountOfContactsToBeAdded = parameters->iContactsInGroup;
+	    	}
+	    
+	    if( parameters->iLinkIds.Count() > 0 )
+	        {
+	        for( TInt i = 0; i < parameters->iLinkIds.Count(); ++i )
+	            {/*
+	            const CCreatorContactSet& set = ContactLinkCache::Instance()->ContactSet(parameters->iLinkIds[i].iLinkId);
+	          
+	            const RPointerArray<MVPbkContactLink>& links = set.ContactLinks();
+	            TInt numberOfExplicitLinks = links.Count(); // Number of defined contacts in contact-set
+	            TInt numberOfExistingContacts = set.NumberOfExistingContacts(); // Number of existing contacts in contact-set
+	            TInt maxAmount = numberOfExplicitLinks + numberOfExistingContacts;
+	            
+	            if( parameters->iLinkIds[i].iLinkAmount > 0 )
+	                maxAmount = parameters->iLinkIds[i].iLinkAmount; // Max amount is limited
+	            
+	            TInt addedMembers = 0;
+	            
+	            for( TInt j = 0; j < links.Count() && addedMembers < maxAmount; ++j )
+	                {
+	                MVPbkContactLink* link = links[j]; 
+	                if( link && IsContactGroupL(*link) == EFalse )
+	                    {
+	                    TRAPD(err, newGroup->AddContactL(*link));
+	                    if( err != KErrAlreadyExists )
+	                    	{
+	                    	// Ignore "allready exists" -error
+	                    	User::LeaveIfError(err);
+	                    	++addedMembers;
+	                    	}                    
+	                    }
+	                }
+	            if( addedMembers < maxAmount )
+	            	{
+	            	// Add existing contacts, withing the limits set by maxAmount:
+	            	amountOfContactsToBeAdded += maxAmount - addedMembers;
+	            	}*/
+	            }
+	        }
+	    if( amountOfContactsToBeAdded > 0 )
+	        {
+			QList<QContactLocalId> contacts = iContactMngr->contactIds();
+			QContactRelationshipFilter rFilter;
+			rFilter.setRelationshipType(QContactRelationship::HasMember);
+			rFilter.setRelatedContactRole(QContactRelationshipFilter::First);
+			rFilter.setRelatedContactId( newGroup.id() );
+			
+			int cnt = 0;
+			for(int i=0; cnt < amountOfContactsToBeAdded && i < contacts.count() ; i++ )
+				{
+				QContact contact = iContactMngr->contact( iContactMngr->contactIds().at(i) );
+				if( iContactMngr->error() == QContactManager::DoesNotExistError )
+					{
+				
+					}
+				else
+					{
+					QList<QContactRelationship> relationships = contact.relationships(QContactRelationship::HasMember);
+					if(!relationships.count() && contact.type() == QContactType::TypeContact ) //just for contacts that are not in relationship - not in group yet
+						{
+						QContactRelationship* contactRel = new QContactRelationship();
+						contactRel->setRelationshipType(QContactRelationship::HasMember);
+						contactRel->setFirst(newGroup.id());
+						contactRel->setSecond(contact.id());
+						iContactMngr->saveRelationship( contactRel );
+						delete contactRel;
+						cnt++;
+						}
+					}
+				}
+			
+	       // group members and their count
+			QList<QContactLocalId> groupMemberIds = iContactMngr->contactIds( rFilter );
+			int testcnt = groupMemberIds.count(); 
+	    
+	   
+	        }
+	    
+	    // store the link to contact, so that Creator is able to delete
+	    // it when user requests deletion of contacts that were created with Creator 
+	    iContactGroupsToDelete.Append( (TUint32)newGroupId );
+	    
+	    return err;
+    }
+
+//----------------------------------------------------------------------------
+
+TInt CCreatorPhonebook::CreateSubscribedContactEntryL(CCreatorModuleBaseParameters* /*aParameters*/)
+    {
+    LOGSTRING("Creator: CCreatorPhonebook::CreateSubscribedContactEntryL");
+
+    return KErrNotSupported;
+    }
+
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+