creator/engine/src/creator_phonebook.cpp
changeset 19 4b22a598b890
parent 17 4f2773374eff
child 23 c9bf25a20c9f
--- a/creator/engine/src/creator_phonebook.cpp	Fri May 14 15:53:02 2010 +0300
+++ b/creator/engine/src/creator_phonebook.cpp	Thu May 27 12:52:19 2010 +0300
@@ -18,6 +18,7 @@
 
 #include "engine.h"
 #include "enginewrapper.h"
+#include "creator_contactsetcache.h"
 
 #include "creator_phonebook.h" 
 #include "creator_traces.h"
@@ -49,6 +50,11 @@
         { (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(), "", (QContactAddress::FieldStreet).operator QString(), (TInt) CCreatorEngine::EAddress},
+        { (QContactAddress::DefinitionName).operator QString(), "", (QContactAddress::FieldLocality).operator QString(), (TInt) CCreatorEngine::ECity},
+        { (QContactAddress::DefinitionName).operator QString(), "", (QContactAddress::FieldRegion).operator QString(), (TInt) CCreatorEngine::EState},
+        { (QContactAddress::DefinitionName).operator QString(), "", (QContactAddress::FieldPostcode).operator QString(), (TInt) CCreatorEngine::EPostcode},
+        { (QContactAddress::DefinitionName).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},
@@ -64,48 +70,17 @@
         { (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[] =
-    {
+    { "", "Landline"},
     { "Home", "Landline"},
     { "Work", "Landline"},                        
+    { "","Mobile"},
     { "Home","Mobile"},
     { "Work", "Mobile"},
     { "Home", "Facsimile"},
@@ -118,25 +93,6 @@
     };
 
 
-/*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,
@@ -240,38 +196,33 @@
 
 //----------------------------------------------------------------------------
 
-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();
+	TInt err = KErrNone;
+	delete iParameters;
+	    iParameters = 0;
+	CPhonebookParameters* parameters = 0;
+	//InitializeContactParamsL();
+	
+	if( aParameters == 0 )
+	    {
+	    InitializeContactParamsL();
+	    parameters = iParameters;
+	    }
+	else
+	    {
+	    parameters = (CPhonebookParameters*) aParameters;
+	    }
+	    
 	bool success = false;
 	// create a new contact item
-	//iStore = new QContact();
-	
 	QContact iStore;
 	
-	int numberOfFields = iParameters->iContactFields.count();
+	int numberOfFields = parameters->iContactFields.count();
 	QString phone;
 	for(int i=0; i< numberOfFields; i++ )
 		{
-		QContactDetail* cntdet = new QContactDetail(iParameters->iContactFields.at(i));
+		QContactDetail* cntdet = new QContactDetail(parameters->iContactFields.at(i));
 		success = iStore.saveDetail( cntdet );
 		delete cntdet;		
 		}
@@ -279,7 +230,31 @@
 	iContactMngr->saveContact( &iStore );
 	
 	iContactsToDelete.Append( (TUint32)iStore.localId() );
-	//delete iStore;
+	
+	// If this contact has a link id in script (i.e. belongs to a contact-set), we must cache the contact id:
+	    if( parameters->ScriptLinkId() > 0 )
+	        {                
+	        RPointerArray<CCreatorContactSet>& contactsets = ContactLinkCache::Instance()->ContactSets();
+	        TBool setFound(EFalse);
+	        for(TInt i = 0; i < contactsets.Count(); ++i )
+	            {
+	            if( contactsets[i]->LinkId() == parameters->ScriptLinkId() )
+	                {
+	                if( iStore.localId() )
+	                    {
+	                    contactsets[i]->AppendL( iStore.localId() );
+	                    iContactLinkArray.AppendL( (TUint32)iStore.localId() );
+	                    }
+	                setFound = ETrue;
+	                break;
+	                }
+	            }
+	        if( !setFound )
+	            {
+	            LOGSTRING2("Error: Contact set id %d not found.", parameters->ScriptLinkId());
+	            }
+	        }
+	    
     return err;
     }
 
@@ -319,12 +294,7 @@
 			}
     	}
     DeleteContactsL( groups );
-/*  
-    User::LeaveIfNull( iStore );
-    MVPbkContactLinkArray* groups = iStore->ContactGroupsLC();
-    DeleteContactsL( groups, ETrue );
-    CleanupStack::PopAndDestroy(); // cannot use groups as parameter
-    */
+
     }
 
 //----------------------------------------------------------------------------
@@ -339,7 +309,7 @@
     {
 	//QList<QContactLocalId> contacts = iContactMngr->contactIds();
     QMap<int, QContactManager::Error> errorMap;
-	iContactMngr->removeContacts( &aContacts, &errorMap );
+	iContactMngr->removeContacts( aContacts, &errorMap );
     }
 
 //----------------------------------------------------------------------------
@@ -379,7 +349,7 @@
     }
 
 //----------------------------------------------------------------------------
-void CCreatorPhonebook::DoDeleteItemsCreatedWithCreatorL( TUid aStoreUid, CDictionaryFileStore* aStore )
+void CCreatorPhonebook::DoDeleteItemsCreatedWithCreatorL( TUid /*aStoreUid*/, CDictionaryFileStore* /*aStore*/ )
     {
     
     }
@@ -399,7 +369,10 @@
 	if( aDetail == QContactPhoneNumber::DefinitionName)
 		{
 		QContactPhoneNumber phoneNumber;// = contactDetail;
-		phoneNumber.setContexts(aFieldContext);
+		if(!aFieldContext.isEmpty())
+		   	{
+			phoneNumber.setContexts(aFieldContext);
+			}
 		phoneNumber.setSubTypes(aFieldString);
 		contentData.Set(iEngine->RandomString((CCreatorEngine::TRandomStringType) aRand));
 		QString number = QString::fromUtf16(contentData.Ptr(),contentData.Length());
@@ -491,12 +464,9 @@
 			}
 		if(aFieldString == QContactOrganization::FieldDepartment)
 			{
-			//if(contactCompany.department().isEmpty())
-				//{
 				QStringList depList = contactCompany.department();
 				depList.append(company);
 				contactCompany.setDepartment(depList);
-				//}
 			}
 		if(aFieldString == QContactOrganization::FieldAssistantName)
 			{
@@ -636,7 +606,6 @@
 			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;
 			}
@@ -711,41 +680,6 @@
 //----------------------------------------------------------------------------
        
 //----------------------------------------------------------------------------
-/*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*/)
     {
@@ -773,74 +707,40 @@
 		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);
-								}
-							}
+//    				QContactDetail field = CreateContactDetail( CreatorPbkMiscTextFields[tfIndex].iDetail, CreatorPbkMiscTextFields[tfIndex].iFieldContext, CreatorPbkMiscTextFields[tfIndex].iFieldString, CreatorPbkMiscTextFields[tfIndex].iRandomType );
+    				
+    				CCreatorContactField* field = CCreatorContactField::NewL();
+	                CleanupStack::PushL( field );
+	                QContactDetail cntDetail = field->CreateContactDetail(iEngine,iParameters,CreatorPbkMiscTextFields[tfIndex].iDetail, CreatorPbkMiscTextFields[tfIndex].iFieldContext, CreatorPbkMiscTextFields[tfIndex].iFieldString, CreatorPbkMiscTextFields[tfIndex].iRandomType );
+  	                if(!cntDetail.isEmpty())
+  	                	{
+  						field->AddFieldToParam( iParameters, cntDetail ); //it will do "param->iContactFields.AppendL(field);"
+  	                	}
+  	                CleanupStack::Pop( field );
                     }
 		// Add binary fields:
-		QContactDetail field = CreateContactDetail(QContactAvatar::DefinitionName,"","",0);
-		iParameters->iContactFields.append(field);
+		TPtrC emptyData;
+		CCreatorContactField* fieldPicture = CCreatorContactField::NewL();
+		CleanupStack::PushL( fieldPicture );
+		QContactDetail cntDetail = fieldPicture->CreateContactDetail(iEngine,iParameters,QContactAvatar::DefinitionName,"","",emptyData );
+		if(!cntDetail.isEmpty())
+		  	{
+		fieldPicture->AddFieldToParam( iParameters, cntDetail ); //it will do "param->iContactFields.AppendL(field);"
+		  	}
+		CleanupStack::Pop( fieldPicture );
 		
 		// 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));
-                }
+		CCreatorContactField* fieldAnniv = CCreatorContactField::NewL();
+		CleanupStack::PushL( fieldAnniv );
+		QContactDetail cntDetAnniv = fieldAnniv->CreateContactDetail(iEngine,iParameters,QContactAnniversary::DefinitionName,"","",emptyData );
+		if(!cntDetAnniv .isEmpty())
+		  	{
+			fieldAnniv->AddFieldToParam( iParameters, cntDetAnniv ); //it will do "param->iContactFields.AppendL(field);"
+			}
+		CleanupStack::Pop( fieldAnniv );
 
-            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
         {    
@@ -862,8 +762,10 @@
 		QContactPhoneNumber phoneNum;
 		TPtrC phoneNumber = iEngine->RandomString(CCreatorEngine::EPhoneNumber);
 		QString phone = QString::fromUtf16( phoneNumber.Ptr(), phoneNumber.Length() );
-		
-		phoneNum.setContexts(CreatorPhoneNumberFields[inc].iFieldContext);
+		if(!CreatorPhoneNumberFields[inc].iFieldContext.isEmpty())
+			{
+			phoneNum.setContexts(CreatorPhoneNumberFields[inc].iFieldContext);
+			}
 		phoneNum.setSubTypes(CreatorPhoneNumberFields[inc].iFieldString);
 		
 
@@ -877,29 +779,29 @@
     
     // 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);
-          	}
+        {
+    	CCreatorContactField* fieldUrl = CCreatorContactField::NewL();
+    	CleanupStack::PushL( fieldUrl );
+    	QContactDetail cntDetUrl = fieldUrl->CreateContactDetail(iEngine,iParameters,QContactUrl::DefinitionName,"","",KErrNotFound );
+    	if(!cntDetUrl.isEmpty())
+    	  	{
+			fieldUrl->AddFieldToParam( iParameters, cntDetUrl ); //it will do "param->iContactFields.AppendL(field);"
+    	  	}
+    	CleanupStack::Pop( fieldUrl );
+
+        }
 
     // 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);
+			CCreatorContactField* fieldEmail = CCreatorContactField::NewL();
+        	CleanupStack::PushL( fieldEmail );
+        	QContactDetail cntDetEmail = fieldEmail->CreateContactDetail(iEngine,iParameters,QContactEmailAddress::DefinitionName,"","",KErrNotFound );
+        	if(!cntDetEmail.isEmpty())
+        	  	{
+				fieldEmail->AddFieldToParam( iParameters, cntDetEmail ); //it will do "param->iContactFields.AppendL(field);"
+        	  	}
+        	CleanupStack::Pop( fieldEmail );
         	}
     
     }
@@ -907,8 +809,13 @@
 
 
 // Checks if the link is a group or not
-TBool CCreatorPhonebook::IsContactGroupL()
+TBool CCreatorPhonebook::IsContactGroupL( QContactLocalId& aLink )
 	{
+    QContact group = iContactMngr->contact( aLink );
+    if( group.type() == QContactType::TypeGroup )
+        {
+        return ETrue;
+        }
 	return EFalse;
 	}
 
@@ -938,7 +845,7 @@
 	    QContact newGroup;
 	    newGroup.setType(QContactType::TypeGroup);
         QContactName newGroupName;
-        newGroupName.setCustomLabel( iParameters->iGroupName );
+        newGroupName.setCustomLabel( parameters->iGroupName );
         newGroup.saveDetail(&newGroupName);
         iContactMngr->saveContact(&newGroup);
         QContactLocalId newGroupId = newGroup.localId();
@@ -958,10 +865,10 @@
 	    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();
+	            const RArray<QContactLocalId> links = set.ContactLinks();//ContactLinkCache::Instance()->ContactSets();//set.ContactLinks();
 	            TInt numberOfExplicitLinks = links.Count(); // Number of defined contacts in contact-set
 	            TInt numberOfExistingContacts = set.NumberOfExistingContacts(); // Number of existing contacts in contact-set
 	            TInt maxAmount = numberOfExplicitLinks + numberOfExistingContacts;
@@ -973,23 +880,28 @@
 	            
 	            for( TInt j = 0; j < links.Count() && addedMembers < maxAmount; ++j )
 	                {
-	                MVPbkContactLink* link = links[j]; 
-	                if( link && IsContactGroupL(*link) == EFalse )
+	                QContactLocalId link = links[j];
+	                QContact contactLink = iContactMngr->contact( link );
+	                if( link && IsContactGroupL( link ) == EFalse )
 	                    {
-	                    TRAPD(err, newGroup->AddContactL(*link));
-	                    if( err != KErrAlreadyExists )
-	                    	{
-	                    	// Ignore "allready exists" -error
-	                    	User::LeaveIfError(err);
-	                    	++addedMembers;
-	                    	}                    
+                        //QList<QContactRelationship> relationships = contactLink.relationships(QContactRelationship::HasMember);
+	                    if(/*!relationships.count() && */contactLink.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( contactLink.id() );
+	                        iContactMngr->saveRelationship( contactRel );
+	                        delete contactRel;
+	                        ++addedMembers;
+	                        }         
 	                    }
 	                }
 	            if( addedMembers < maxAmount )
 	            	{
 	            	// Add existing contacts, withing the limits set by maxAmount:
 	            	amountOfContactsToBeAdded += maxAmount - addedMembers;
-	            	}*/
+	            	}
 	            }
 	        }
 	    if( amountOfContactsToBeAdded > 0 )
@@ -1049,6 +961,383 @@
 
 //----------------------------------------------------------------------------
 
+CCreatorContactField::CCreatorContactField()
+    {
+    }
+CCreatorContactField::~CCreatorContactField()
+    {
+    }
+
+CCreatorContactField* CCreatorContactField::NewL()
+    {
+    CCreatorContactField* self = new (ELeave) CCreatorContactField();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+void CCreatorContactField::ConstructL()
+    {
+    //pImpl = CCreatorContactTextField::NewL(aFieldType, aData); 
+    }
+QContactDetail CCreatorContactField::CreateContactDetail(CCreatorEngine* aEngine,CPhonebookParameters* aParameters,QString aDetail, QString aFieldContext, QString aFieldString, TInt aRand )
+    {
+	QContactDetail emptyDet;
+    TPtrC contentData;
+    HBufC16* tempData = 0;
+    if(aRand == KErrNotFound)
+    	{
+		TInt textFieldCount = sizeof(CreatorPbkMiscTextFields) / sizeof(DetailFieldInfo);
+		for( TInt tfIndex = 0; tfIndex < textFieldCount; ++tfIndex )
+			{
+			if( CreatorPbkMiscTextFields[tfIndex].iDetail == aDetail && CreatorPbkMiscTextFields[tfIndex].iFieldContext == aFieldContext && CreatorPbkMiscTextFields[tfIndex].iFieldString == aFieldString)
+				{
+				aRand = CreatorPbkMiscTextFields[tfIndex].iRandomType;
+				}
+			}
+    	}
+    
+    if( aRand != KErrNotFound ) 
+    	{
+		contentData.Set(aEngine->RandomString((CCreatorEngine::TRandomStringType) aRand));
+    	}
+    else
+    	{
+		if( aDetail == QContactPhoneNumber::DefinitionName )
+			{
+			contentData.Set(aEngine->RandomString(CCreatorEngine::EPhoneNumber));
+			}
+		else if( aDetail == QContactEmailAddress::DefinitionName )
+			{
+			tempData = aEngine->CreateEmailAddressLC();
+			contentData.Set( tempData->Des() );
+			}
+		else if( aDetail == QContactUrl::DefinitionName )
+			{
+			tempData = aEngine->CreateHTTPUrlLC(); 
+			contentData.Set( tempData->Des() );
+			}
+		else
+			{
+			return emptyDet;
+			}
+    	}
+    emptyDet = CreateContactDetail( aEngine, aParameters, aDetail, aFieldContext, aFieldString, contentData );
+    if( tempData )
+    	{
+		CleanupStack::PopAndDestroy( tempData );
+    	}
+    return emptyDet;
+    }
+
+QContactDetail CCreatorContactField::CreateContactDetail(CCreatorEngine* aEngine,CPhonebookParameters* aParameters,QString aDetail, QString aFieldContext, QString aFieldString, TPtrC aData )
+    {
+    QContactDetail contactDetail;
+        
+        if( aDetail == QContactPhoneNumber::DefinitionName)
+            {
+            QContactPhoneNumber phoneNumber;// = contactDetail;
+            if(!aFieldContext.isEmpty())
+            	{
+				phoneNumber.setContexts(aFieldContext);
+            	}
+            phoneNumber.setSubTypes(aFieldString);
+            QString number = QString::fromUtf16(aData.Ptr(),aData.Length());
+            phoneNumber.setNumber(number);
+            return phoneNumber;
+            }
+        else if( aDetail == QContactName::DefinitionName )          //--Contact NAME-----------------------------
+            {
+            QContactName contactName;
+            for(int i = 0 ; i < aParameters->iContactFields.count() ; i++ ) //go through all contact details to check if there is already Contact Name to set other details
+                {
+                if(aParameters->iContactFields.at(i).definitionName() == QContactName::DefinitionName )
+                    {
+                    contactName = aParameters->iContactFields.at(i);
+                    }
+                }
+            QString name = QString::fromUtf16(aData.Ptr(),aData.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 < aParameters->iContactFields.count() ; i++ ) //go through all contact details to check if there is already Contact Name to set other details
+                {
+                if(aParameters->iContactFields.at(i).definitionName() == QContactOrganization::DefinitionName )
+                    {
+                    contactCompany = aParameters->iContactFields.at(i);
+                    }
+                }
+            
+            QString company = QString::fromUtf16(aData.Ptr(),aData.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)
+                {
+                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 < aParameters->iContactFields.count() ; i++ ) //go through all contact details to check if there is already Contact Name to set other details
+                    {
+                    if(aParameters->iContactFields.at(i).definitionName() == QContactAddress::DefinitionName && aParameters->iContactFields.at(i).value(QContactDetail::FieldContext) == aFieldContext )
+                        {
+                        contactAddress = aParameters->iContactFields.at(i);
+                        }
+                    }
+                if( !aFieldContext.isEmpty() )
+                    {
+					contactAddress.setContexts( aFieldContext );
+                    }
+                QString address = QString::fromUtf16(aData.Ptr(),aData.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;
+                    QString note = QString::fromUtf16(aData.Ptr(),aData.Length());
+                    contactNote.setNote(note);
+                    return contactNote;
+                    }
+        else if( aDetail == QContactFamily::DefinitionName )            //--Contact Family-----------------------------
+                    {
+                    QContactFamily contactFamily;
+                    
+                    for(int i = 0 ; i < aParameters->iContactFields.count() ; i++ ) //go through all contact details to check if there is already Contact Name to set other details
+                        {
+                        if(aParameters->iContactFields.at(i).definitionName() == QContactFamily::DefinitionName && aParameters->iContactFields.at(i).value(QContactDetail::FieldContext) == aFieldContext )
+                            {
+                            contactFamily = aParameters->iContactFields.at(i);
+                            }
+                        }
+                   
+                    QString familyData = QString::fromUtf16(aData.Ptr(),aData.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;
+                aEngine->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) //--Anniversary------------------------------
+                {
+                QContactAnniversary contactAnniversary;
+                QDate date;
+                TTime datetime = aEngine->RandomDate( CCreatorEngine::EDateFuture );
+                date.setDate( datetime.DateTime().Year(),(int) (datetime.DateTime().Month()+1), datetime.DateTime().Day() );
+                contactAnniversary.setOriginalDate( date );
+                return contactAnniversary;
+                }
+        if( aDetail == QContactEmailAddress::DefinitionName) //--Email------------------------------------
+            {
+            QContactEmailAddress email;
+            QString emailAddr = QString::fromUtf16(aData.Ptr(),aData.Length());
+            if( !aFieldContext.isEmpty() )
+            	{
+				email.setContexts( aFieldContext );
+            	}
+            email.setEmailAddress( emailAddr );
+            return email;
+            }
+        if( aDetail == QContactUrl::DefinitionName )    //--Url-------------------------------------------
+            {
+            QContactUrl url;
+            QString urlStr = QString::fromUtf16(aData.Ptr(),aData.Length());
+            if( !aFieldContext.isEmpty() )
+                {
+				url.setContexts( aFieldContext );
+                }
+            url.setUrl(urlStr);
+            return url;
+            }
+        if( aDetail == QContactBirthday::DefinitionName )   //--Birthday-----------------------------------
+            {
+            QContactBirthday birthday;
+            QDate date;
+            TTime datetime = aEngine->RandomDate( CCreatorEngine::EDatePast );
+            date.setDate( datetime.DateTime().Year(),(int) (datetime.DateTime().Month()+1), datetime.DateTime().Day() );
+            birthday.setDate( date );
+            return birthday;
+            }
+                
+        return contactDetail;
+    }
+
+void CCreatorContactField::AddFieldToParam( CPhonebookParameters* aParam, QContactDetail aDetail)
+    {
+     bool replace = false;
+     for(int i = 0 ; i< aParam->iContactFields.count() ; i++) //go through
+          {
+           if( !aDetail.isEmpty() && aDetail.definitionName() == aParam->iContactFields.at(i).definitionName() 
+        		   && aDetail.definitionName() != QContactPhoneNumber::DefinitionName 
+        		   && aDetail.definitionName() != QContactEmailAddress::DefinitionName
+        		   && aDetail.definitionName() != QContactUrl::DefinitionName )
+               {
+               QString context = aDetail.value(QContactDetail::FieldContext);
+               bool isContextEmpty = context.isEmpty();
+               if( isContextEmpty ||  ( aDetail.value(QContactDetail::FieldContext) == aParam->iContactFields.at(i).value(QContactDetail::FieldContext)) )
+                   {
+                   //replace
+                   aParam->iContactFields.replace(i,aDetail);
+                   replace = true;
+                   }
+               }
+          }
+          if(!replace)
+             {
+             if(!aDetail.isEmpty())
+                {
+                aParam->iContactFields.append(aDetail);
+                }
+             }
+      
+    }
 //----------------------------------------------------------------------------
 
 //----------------------------------------------------------------------------