phonebookengines/contactsmodel/tsrc/TestSyncPlugIn/cntsyncphonedata.cpp
changeset 0 e686773b3f54
child 24 0ba2181d7c28
equal deleted inserted replaced
-1:000000000000 0:e686773b3f54
       
     1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #include "cntsyncchecker.h"
       
    17 #include "cntsyncphonedata.h"
       
    18 #include <cntdef.h>
       
    19 #include <cntdb.h>
       
    20 #include "cntsyncdata.h"
       
    21 
       
    22 #include <centralrepository.h>  // CRepository.
       
    23 #include <e32property.h>
       
    24 #include <phbksync.h>
       
    25 
       
    26 //---------------------------------------------------
       
    27 CContactSyncPhonebookData* CContactSyncPhonebookData::NewL(TUint32& aCRKey, CRepository* aRepository)
       
    28 	{
       
    29 	TUid temp;
       
    30 	temp.iUid = 0;
       
    31 	CContactSyncPhonebookData* self = new(ELeave) CContactSyncPhonebookData(temp, aRepository);
       
    32 	self->InternaliseFromCRL(aCRKey);
       
    33 	return self;
       
    34 	}
       
    35 
       
    36 
       
    37 CContactSyncPhonebookData* CContactSyncPhonebookData::NewLC(TUid aPhonebookUid, CRepository* aRepository)
       
    38 	{
       
    39 	CContactSyncPhonebookData* self = new(ELeave) CContactSyncPhonebookData(aPhonebookUid, aRepository);
       
    40 	CleanupStack::PushL(self);
       
    41 	return self;
       
    42 	}
       
    43 
       
    44 
       
    45 CContactSyncPhonebookData::CContactSyncPhonebookData(TUid aPhonebookUid, CRepository* aRepository)
       
    46 	: iPhonebookUid(aPhonebookUid), iPhonebookTemplateId(KNullContactId), iPhonebookGroupId(KNullContactId), iRepository(aRepository)
       
    47 	{
       
    48 	}
       
    49 
       
    50 const TDesC& CContactSyncPhonebookData::TemplateLabel()
       
    51 	{
       
    52 	_LIT(KPhbkTemplateADN,"SIM Card Contacts ADN"); // should be in a resource file for localisation really ;) 
       
    53 	_LIT(KPhbkTemplateSDN,"SIM Card Contacts SDN");
       
    54 	_LIT(KPhbkTemplateLND,"SIM Card Contacts LND");
       
    55 	_LIT(KPhbkTemplateUSimApp,"SIM Card Contacts USIMAPP");
       
    56 	_LIT(KPhbkTemplateFDN,"SIM Card Contacts FDN");
       
    57 	_LIT(KPhbkTemplateNotSpecified,"SIM Card Contacts Name Not Specified");
       
    58 
       
    59 
       
    60 	/* Some Contacts test code used to set group names
       
    61 	_LIT(KGlobalAdnGroupName,"Global Adn Group");
       
    62 	_LIT(KGlobalSdnGroupName,"Global Sdn Group");
       
    63 	_LIT(KGlobalLdnGroupName,"Global Lnd Group");
       
    64 	_LIT(KUsimAppAdnGroupName,"Usim App Adn Group");
       
    65 	*/
       
    66 
       
    67 	switch (iPhonebookUid.iUid)
       
    68 		{
       
    69 		case KUidIccGlobalAdnPhonebookValue:
       
    70 			return KPhbkTemplateADN;
       
    71 
       
    72 		case KUidIccGlobalSdnPhonebookValue:
       
    73 			return KPhbkTemplateSDN;
       
    74 
       
    75 		case KUidIccGlobalLndPhonebookValue:
       
    76 			return KPhbkTemplateLND;
       
    77 
       
    78 		case KUidUsimAppAdnPhonebookValue:
       
    79 			return KPhbkTemplateUSimApp;
       
    80 
       
    81 		case KUidIccGlobalFdnPhonebookValue:
       
    82 			return KPhbkTemplateFDN;
       
    83 
       
    84 		default:
       
    85 			break;
       
    86 		}
       
    87 
       
    88 	return KPhbkTemplateNotSpecified;
       
    89 	}
       
    90 
       
    91 
       
    92 CContactSyncPhonebookData::~CContactSyncPhonebookData()
       
    93 	{
       
    94 	delete iIccTemplate;
       
    95 	iStatusArray.Close();
       
    96 	iPhonebookContacts.ResetAndDestroy();
       
    97 	}
       
    98 
       
    99 
       
   100 void CContactSyncPhonebookData::AddPhonebookContactL(const TDesC& aName, const TDesC& aNumber)
       
   101 	{
       
   102 	iPhonebookContacts.AppendL(CPhonebookContact::NewLC(aName, aNumber, iRepository));
       
   103 	CleanupStack::Pop();	// CPhonebookContact
       
   104 	}
       
   105 
       
   106 
       
   107 TInt CContactSyncPhonebookData::SynchronisePhonebook(CContactDatabase& aDb, TInt aCompletionError, TInt aLeaveError)
       
   108 	{
       
   109 	TInt error(KErrNone);
       
   110 
       
   111 	__ASSERT_DEBUG(iIsSynchronised == EFalse, User::Invariant());
       
   112 
       
   113 
       
   114 	if ((aCompletionError == KErrNone) && (aLeaveError == KErrNone))
       
   115 		{
       
   116 		// Validate any template ID remembered from previous test
       
   117 		if ((iPhonebookTemplateId != KNullContactId) &&    // if value has not been set
       
   118 			(iPhonebookTemplateId != KGoldenTemplateId) )  // internally initialised value by cntmodel
       
   119 			{
       
   120 			TRAP(error, ValidateTemplateIdAndLabelL(aDb));
       
   121 
       
   122 			if (error)
       
   123 				{
       
   124 				if (error != KErrNotFound)
       
   125 					{
       
   126 					return error;
       
   127 					}
       
   128 				iPhonebookTemplateId = KNullContactId;
       
   129 				}
       
   130 			}
       
   131 
       
   132 		// Need to create a new template?
       
   133 		if ((iPhonebookTemplateId == KNullContactId) ||  // if value has not been set
       
   134 			(iPhonebookTemplateId == KGoldenTemplateId)) // internally initialised value by cntmodel
       
   135 			{
       
   136 			if (iIccTemplate)
       
   137 				{
       
   138 				delete iIccTemplate;
       
   139 				iIccTemplate = NULL;
       
   140 				}
       
   141 
       
   142 			TRAP(error, CreateTemplateIdL(aDb)); // First create Template ID
       
   143 
       
   144 			if (error == KErrNone)
       
   145 				{
       
   146 				// cache template
       
   147  				TRAP(error, iIccTemplate = aDb.ReadContactL(iPhonebookTemplateId));
       
   148 				}
       
   149 
       
   150 			if (error)
       
   151 				{
       
   152 				return error;
       
   153 				}
       
   154 			}
       
   155 
       
   156 
       
   157 
       
   158 		// Validate any group ID remembered from previouzs test
       
   159 		if ((iPhonebookGroupId != KNullContactId) &&    // if value has not been set
       
   160 			(iPhonebookGroupId != KGoldenTemplateId) )  // internally initialised value by cntmodel
       
   161 			{
       
   162 			TRAP(error, ValidateGroupIdAndTemplateL(aDb));
       
   163 
       
   164 			if (error)
       
   165 				{
       
   166 				if (error != KErrNotFound)
       
   167 					{
       
   168 					return error;
       
   169 					}
       
   170 				iPhonebookGroupId = KNullContactId;
       
   171 				}
       
   172 			}
       
   173 
       
   174 		if ((iPhonebookGroupId == KNullContactId) ||    // if value has not been set
       
   175 			(iPhonebookGroupId == KGoldenTemplateId) )  // internally initialised value by cntmodel
       
   176 			{
       
   177 			// Now create group ID for this phonebook
       
   178 			TRAP(error, CreateGroupIdL(aDb));
       
   179 			}
       
   180 
       
   181 		if (error == KErrNone && iPhonebookContacts.Count() > 0)
       
   182 			{
       
   183 			TRAP(error, SynchroniseContactsL(aDb));
       
   184 			}
       
   185 
       
   186 		if (error)
       
   187 			{
       
   188 			return error;
       
   189 			}
       
   190 
       
   191 		// successfully synchronised
       
   192 		iIsSynchronised = ETrue;
       
   193 		}
       
   194 
       
   195 
       
   196 	CompleteNotificationRequest(aCompletionError);
       
   197 	iSynchronisedLeaveCode = aLeaveError;
       
   198 	
       
   199 	// simulated synchronisation completed
       
   200 	return KErrNone;
       
   201 	}
       
   202 
       
   203 
       
   204 void CContactSyncPhonebookData::ValidateTemplateIdAndLabelL(CContactDatabase& aDb)
       
   205 	{
       
   206 	CContactItem* item = aDb.ReadContactLC(iPhonebookTemplateId);
       
   207 
       
   208 	// The following test confirms if a template ID relates to this phonebook's 
       
   209 	// template by checking the label employed.
       
   210 	if ((item->Type() != KUidContactCardTemplate) ||
       
   211 			(static_cast<CContactCardTemplate*>(item)->GetTemplateLabelL() != TemplateLabel()))
       
   212 		{
       
   213 		iPhonebookTemplateId = KNullContactId;
       
   214 		}
       
   215 
       
   216 	CleanupStack::PopAndDestroy(item);
       
   217 	}
       
   218 
       
   219 
       
   220 void CContactSyncPhonebookData::ValidateGroupIdAndTemplateL(CContactDatabase& aDb)
       
   221 	{
       
   222 	CContactGroup* group = static_cast<CContactGroup*> (aDb.ReadContactL(iPhonebookGroupId));
       
   223 
       
   224 	CleanupStack::PushL(group);
       
   225 
       
   226 	// check that contact id refers to a group
       
   227 	if (group->Type() == KUidContactGroup)
       
   228 		{
       
   229 		// Retrieve the first entry in the group, and check that entry's template ID
       
   230 		CContactIdArray* itemList = group->ItemsContainedLC();
       
   231 		if (itemList->Count() > 0)
       
   232 			{
       
   233 			CContactItem* groupItem = aDb.ReadContactLC((*itemList)[0]);
       
   234 			if (groupItem)
       
   235 				{
       
   236 				if (groupItem->TemplateRefId() != iPhonebookTemplateId)
       
   237 					{
       
   238 					// wrong group
       
   239 					iPhonebookGroupId = KNullContactId;
       
   240 					}
       
   241 				CleanupStack::PopAndDestroy(groupItem);
       
   242 				}
       
   243 			}
       
   244 		CleanupStack::PopAndDestroy(itemList);
       
   245 		}
       
   246 	else
       
   247 		{
       
   248 		// id is not really a group
       
   249 		iPhonebookGroupId = KNullContactId;
       
   250 		}
       
   251 
       
   252 	CleanupStack::PopAndDestroy(group);
       
   253 	}
       
   254 
       
   255 
       
   256 /**
       
   257  Create Template UID for the phonebook.
       
   258 
       
   259  (Beware - can leave partially created Template)
       
   260 
       
   261  @param aDb Handle to the contacts database.
       
   262  */
       
   263 void CContactSyncPhonebookData::CreateTemplateIdL(CContactDatabase &aDb)
       
   264 	{
       
   265 	__ASSERT_DEBUG((iPhonebookTemplateId == KNullContactId || iPhonebookTemplateId == KGoldenTemplateId), User::Invariant());
       
   266 
       
   267 	// First check if there is an existing template in the contact database for this phonebook
       
   268 	CContactIdArray* idList = aDb.GetCardTemplateIdListL();
       
   269 	if (idList)
       
   270 		{
       
   271 		CleanupStack::PushL(idList);
       
   272 		const TInt idListCount = idList->Count();
       
   273 		if (idListCount > 0)
       
   274 			{
       
   275 			TInt i;
       
   276 			for (i = 0; i < idListCount; i++)
       
   277 				{
       
   278 				CContactCardTemplate* item = static_cast<CContactCardTemplate*> (aDb.ReadContactLC((*idList)[i]));
       
   279 				if (item->GetTemplateLabelL() == TemplateLabel())
       
   280 					{
       
   281 					iPhonebookTemplateId = (*idList)[i];
       
   282 					i = idListCount; // force loop to exit
       
   283 					}
       
   284 				CleanupStack::PopAndDestroy(item);
       
   285 				}
       
   286 			}
       
   287 		CleanupStack::PopAndDestroy(idList);
       
   288 		}
       
   289 
       
   290 	// If no suitable template been found create a new one
       
   291 	if (iPhonebookTemplateId == KNullContactId ||
       
   292 			iPhonebookTemplateId == KGoldenTemplateId)
       
   293 		{
       
   294 		// "Creating template for this phonebook"
       
   295 
       
   296 		CContactItem* newTemplate = aDb.CreateContactCardTemplateLC(TemplateLabel());
       
   297 
       
   298 		TContactItemId templateId = newTemplate->Id();
       
   299 		CleanupStack::PopAndDestroy(newTemplate);
       
   300 
       
   301 		// Remove all the unnecessary fields
       
   302 		newTemplate = aDb.OpenContactLX(templateId);
       
   303 		CleanupStack::PushL(newTemplate);	
       
   304 		const TInt fieldCount = newTemplate->CardFields().Count();
       
   305 		for(TInt i=fieldCount-1;i>=0;i--)
       
   306 			newTemplate->RemoveField(i);
       
   307 			
       
   308 		// Add default name field
       
   309 		CContactItemField* name = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldFamilyName);
       
   310 
       
   311 		name->SetLabelL(_L("Name"));
       
   312 		name->SetMapping(KUidContactFieldVCardMapUnusedN);
       
   313 		newTemplate->AddFieldL(*name);
       
   314 		CleanupStack::Pop(name);
       
   315 			
       
   316 		// Add second name field
       
   317 		CContactItemField* secondName = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldSecondName);
       
   318 		secondName->SetLabelL(_L("Additional Name"));
       
   319 		secondName->SetMapping(KUidContactFieldVCardMapSECONDNAME);
       
   320 		secondName->SetUserFlags(EContactCategoryHome);
       
   321 		newTemplate->AddFieldL(*secondName);
       
   322 		CleanupStack::Pop(secondName);
       
   323 			
       
   324 		// Add default number field
       
   325 		CContactItemField* number = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldPhoneNumber);
       
   326 		number->SetLabelL(_L("Phone Number"));
       
   327 		number->SetMapping(KUidContactFieldVCardMapTEL);
       
   328 		number->AddFieldTypeL(KUidContactFieldVCardMapWORK);
       
   329 		number->AddFieldTypeL(KUidContactFieldVCardMapVOICE);
       
   330 		number->AddFieldTypeL(KUidContactFieldVCardMapCELL);
       
   331 		newTemplate->AddFieldL(*number);
       
   332 		CleanupStack::Pop(number);
       
   333 
       
   334 		// Add Slot Number field
       
   335 		CContactItemField* slotnum = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldICCSlot);
       
   336 		slotnum->SetLabelL(_L("Slot"));
       
   337 		slotnum->SetMapping(KUidContactFieldVCardMapNotRequired);
       
   338 		newTemplate->AddFieldL(*slotnum);
       
   339 		CleanupStack::Pop(slotnum);
       
   340 
       
   341 		// Add Phonebook type field
       
   342 		CContactItemField* phonebook = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldICCPhonebook);
       
   343 		phonebook->SetLabelL(_L("Phonebook UID"));
       
   344 		phonebook->SetMapping(KUidContactFieldVCardMapNotRequired);
       
   345 		newTemplate->AddFieldL(*phonebook);
       
   346 		CleanupStack::Pop(phonebook);
       
   347 
       
   348 		// presume this is a 3G ICC so there are additional fields for ADN and USIM App phonebooks 
       
   349 		if((iPhonebookUid.iUid == KUidIccGlobalAdnPhonebookValue) || 
       
   350 		   (iPhonebookUid.iUid == KUidUsimAppAdnPhonebookValue))
       
   351 			{
       
   352 			// Add e-mail field
       
   353 			CContactItemField* emailField = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldEMail);
       
   354 			emailField->SetLabelL(_L("Email"));
       
   355 			emailField->SetMapping(KUidContactFieldVCardMapEMAILINTERNET);
       
   356 			emailField->AddFieldTypeL(KUidContactFieldVCardMapWORK);
       
   357 			emailField->SetUserFlags(EContactCategoryOther);
       
   358 			newTemplate->AddFieldL(*emailField);
       
   359 			CleanupStack::Pop(emailField);
       
   360 
       
   361 			// Add group field - this is different from contacts group. This field indicates 
       
   362 			// group that this ICC entry belongs to. User can add this entry to a number of 
       
   363 			// groups on ICC i.e. business, private, etc. 
       
   364 			CContactItemField* group = CContactItemField::NewLC(KStorageTypeText, KUidContactFieldICCGroup);
       
   365 			group->SetLabelL(_L("Group"));
       
   366 			group->SetMapping(KUidContactFieldVCardMapUnusedN);
       
   367 			newTemplate->AddFieldL(*group);
       
   368 			CleanupStack::Pop(group);
       
   369 			}
       
   370 
       
   371  		// Now that we know nothing as left, assign member variables (this avoids member variables being left in a bad state in the event of a leave).
       
   372  		iPhonebookTemplateId = templateId;
       
   373 
       
   374 		aDb.CommitContactL(*newTemplate);
       
   375 		CleanupStack::PopAndDestroy(2);	// newTemplate plus locked record
       
   376 		}
       
   377 	}
       
   378 
       
   379 
       
   380 /**
       
   381  Create Group UID for the phonebook.
       
   382  @param aDb Handle to the contacts database.
       
   383  */
       
   384 void CContactSyncPhonebookData::CreateGroupIdL(CContactDatabase &aDb)
       
   385 	{
       
   386 	__ASSERT_DEBUG((iPhonebookGroupId == KNullContactId ||
       
   387 		iPhonebookGroupId == KGoldenTemplateId), User::Invariant());
       
   388 
       
   389 	// First check if there is an existing group in the contact database for this phonebook
       
   390 	CContactIdArray* idList = aDb.GetGroupIdListL();
       
   391 	if (idList)
       
   392 		{
       
   393 		CleanupStack::PushL(idList);
       
   394 
       
   395 		const TInt idListCount = idList->Count();
       
   396 		if (idListCount > 0)
       
   397 			{
       
   398 			TInt i;
       
   399 			for (i = 0; i < idListCount; i++)
       
   400 				{
       
   401 				// Retrieve the first entry in each group, and check that entry's template ID
       
   402 				CContactGroup* group = static_cast<CContactGroup*> (aDb.ReadContactLC((*idList)[i]));
       
   403 				CContactIdArray* itemList = group->ItemsContainedLC();
       
   404 				if (itemList->Count() > 0)
       
   405 					{
       
   406 					CContactItem* groupItem = aDb.ReadContactLC((*itemList)[0]);
       
   407 					if (groupItem->TemplateRefId() == iPhonebookTemplateId)
       
   408 						{
       
   409 						iPhonebookGroupId = (*idList)[i];
       
   410 						i = idListCount; // force exit from loop
       
   411 						}
       
   412 					CleanupStack::PopAndDestroy(groupItem);
       
   413 					}
       
   414 				CleanupStack::PopAndDestroy(2, group); // itemList, group
       
   415 				}
       
   416 			}
       
   417 
       
   418 		CleanupStack::PopAndDestroy(idList);
       
   419 		}
       
   420 
       
   421 	// If no suitable group has been found create a new one
       
   422 	if (iPhonebookGroupId==KNullContactId ||
       
   423 			iPhonebookGroupId==KGoldenTemplateId)
       
   424 		{
       
   425 		CContactItem* group = aDb.CreateContactGroupLC(KNullDesC);
       
   426  		iPhonebookGroupId = group->Id();
       
   427 		CleanupStack::PopAndDestroy(group);
       
   428 		}
       
   429 	}
       
   430 
       
   431 
       
   432 void CContactSyncPhonebookData::SynchroniseContactsL(CContactDatabase &aDb)
       
   433 	{
       
   434 	const TInt nContacts = iPhonebookContacts.Count();
       
   435 
       
   436 	// simple version of phonebook sync
       
   437 	for (TInt idx = 0; idx < nContacts; ++idx)
       
   438 		{
       
   439 		CContactICCEntry* item = CContactICCEntry::NewL(*iIccTemplate);
       
   440 		CleanupStack::PushL(item); 
       
   441 
       
   442 		CContactItemFieldSet& fieldSet = item->CardFields();
       
   443 
       
   444 		// add name text
       
   445 		TInt pos = fieldSet.Find(KUidContactFieldFamilyName);
       
   446 		if (pos != KErrNotFound)
       
   447 			{
       
   448 			fieldSet[pos].TextStorage()->SetTextL(*iPhonebookContacts[idx]->Name());
       
   449 			}
       
   450 
       
   451 		// add phone number
       
   452 		pos = fieldSet.Find(KUidContactFieldPhoneNumber);
       
   453 		if (pos != KErrNotFound)
       
   454 			{
       
   455 			fieldSet[pos].TextStorage()->SetTextL(*iPhonebookContacts[idx]->Number());
       
   456 			}
       
   457 
       
   458 		// ICC Phonebook slot
       
   459 		pos = fieldSet.Find(KUidContactFieldICCSlot);
       
   460 		if (pos != KErrNotFound)
       
   461 			{
       
   462 			TBuf16<20> numberBuffer;
       
   463 			numberBuffer.Format(_L("%d"), idx + 1);
       
   464 			fieldSet[pos].TextStorage()->SetTextL(numberBuffer);
       
   465 			}
       
   466 
       
   467 		TContactItemId id = aDb.AddNewContactL(*item);
       
   468 
       
   469 
       
   470 
       
   471 		CleanupStack::PopAndDestroy(item);
       
   472 		
       
   473 		// debug print fields
       
   474 		CContactItem* contact = aDb.ReadContactLC(id);
       
   475 		
       
   476 		CContactItemFieldSet& contactFields = contact->CardFields();
       
   477 		const TInt fieldCount = contactFields.Count();
       
   478 
       
   479 		for (TInt i=0; i < fieldCount; i++)
       
   480 			{
       
   481 			CContactItemField &field = contactFields[i];
       
   482 			if (field.StorageType() == KStorageTypeText)
       
   483 				{
       
   484 				TPtrC fieldText = field.TextStorage()->Text();
       
   485 				TPtrC labelText = field.Label();
       
   486 			    RDebug::Print(_L("--Field(%d) %S: %S \n\r"), i, &labelText, &fieldText);
       
   487 				}
       
   488 			}
       
   489 		CleanupStack::PopAndDestroy(contact);	
       
   490 
       
   491 		}
       
   492 
       
   493 	if (nContacts)
       
   494 		{
       
   495 		aDb.CompactL();
       
   496 		}
       
   497 	}
       
   498 
       
   499 
       
   500 void CContactSyncPhonebookData::ResetSynchronised(TBool aResetTemplateAndGroupIds)
       
   501 	{
       
   502 	if (aResetTemplateAndGroupIds)
       
   503 		{
       
   504 		iPhonebookTemplateId = KNullContactId;
       
   505 		iPhonebookGroupId = KNullContactId;
       
   506 		}
       
   507 
       
   508 	// tell observers that synchronisation state has changed
       
   509 	CompleteNotificationRequest(KErrNone);
       
   510 
       
   511 	// not synchronised
       
   512 	iIsSynchronised = EFalse;
       
   513 	iSynchronisedLeaveCode = KErrNone;
       
   514 	}
       
   515 
       
   516 
       
   517 TInt CContactSyncPhonebookData::StoreNotificationRequest(TInt aStatus)
       
   518 	{
       
   519 //	aStatus = KRequestPending;
       
   520 	iNotificationPending++;
       
   521 	return iStatusArray.Append(aStatus);
       
   522 	}
       
   523 
       
   524 
       
   525 void CContactSyncPhonebookData::CompleteNotificationRequest(TInt aError)
       
   526 	{	
       
   527 	const TInt count = iStatusArray.Count();
       
   528 	
       
   529 	for (TInt k = count; k > 0; --k)
       
   530 		{
       
   531 		iNotificationPending--; 
       
   532 		RProperty::Set(
       
   533 			SyncNotification::KPropertyCategory, 
       
   534 			iPhonebookUid.iUid, 
       
   535 			aError);
       
   536 		}
       
   537 	iErrorCode = aError;
       
   538 	iStatusArray.Reset();	
       
   539 	}
       
   540 	
       
   541 void CContactSyncPhonebookData::CancelNotificationRequestL()
       
   542 	{	
       
   543 	const TInt count = iStatusArray.Count();
       
   544 	RProperty property;
       
   545 	
       
   546 	for (TInt k = count; k > 0; --k)
       
   547 		{
       
   548 		iNotificationPending--; 
       
   549 		User::LeaveIfError(property.Attach(SyncNotification::KPropertyCategory,iPhonebookUid.iUid));
       
   550 		property.Cancel();
       
   551 		}
       
   552 	iStatusArray.Reset();	
       
   553 	}
       
   554 
       
   555 
       
   556 TInt CContactSyncPhonebookData::NotificationPendingCount()
       
   557 	{
       
   558 	return iStatusArray.Count();
       
   559 	}
       
   560 
       
   561 
       
   562 void CContactSyncPhonebookData::SetTemplateId(TInt aPhonebookTemplateId)
       
   563 	{
       
   564 	iPhonebookTemplateId = aPhonebookTemplateId;
       
   565 	}
       
   566 
       
   567 
       
   568 void CContactSyncPhonebookData::SetGroupId(TInt aPhonebookGroupId)
       
   569 	{
       
   570 	iPhonebookGroupId = aPhonebookGroupId;
       
   571 	}
       
   572 
       
   573 
       
   574 const TUid& CContactSyncPhonebookData::PhonebookUid()
       
   575 	{
       
   576 	return iPhonebookUid;
       
   577 	}
       
   578 
       
   579 
       
   580 TInt CContactSyncPhonebookData::TemplateId()
       
   581 	{
       
   582 	return iPhonebookTemplateId;
       
   583 	}
       
   584 
       
   585 
       
   586 TInt CContactSyncPhonebookData::GroupId()
       
   587 	{
       
   588 	return iPhonebookGroupId;
       
   589 	}
       
   590 
       
   591 
       
   592 void CContactSyncPhonebookData::SetSynchronisedLeaveCode(TInt aLeaveError)
       
   593 	{
       
   594 	iSynchronisedLeaveCode = aLeaveError;
       
   595 	}
       
   596 
       
   597 
       
   598 void CContactSyncPhonebookData::SetSynchronised(TInt aSynchronised)
       
   599 	{
       
   600 	iIsSynchronised = aSynchronised;
       
   601 	}
       
   602 
       
   603 
       
   604 TBool CContactSyncPhonebookData::IsSynchronisedL()
       
   605 	{
       
   606 	User::LeaveIfError(iSynchronisedLeaveCode);
       
   607 	return iIsSynchronised;
       
   608 	}
       
   609 
       
   610 
       
   611 TBool CContactSyncPhonebookData::SynchroniseRequired()
       
   612 	{
       
   613 	return !iIsSynchronised;
       
   614 	}
       
   615 	
       
   616 void CContactSyncPhonebookData::InternaliseFromCRL(TUint32& aCRKey)
       
   617 	{
       
   618 	TInt temp;
       
   619 	CContactSyncStaticRepository::ReadIntFromCentralRepositoryL(aCRKey, temp, *iRepository);
       
   620     iPhonebookUid.iUid = temp;
       
   621 	CContactSyncStaticRepository::ReadIntFromCentralRepositoryL(aCRKey, temp, *iRepository);
       
   622     iPhonebookTemplateId = temp;
       
   623 	CContactSyncStaticRepository::ReadIntFromCentralRepositoryL(aCRKey, temp, *iRepository);
       
   624     iPhonebookGroupId = temp;
       
   625 	CContactSyncStaticRepository::ReadIntFromCentralRepositoryL(aCRKey, iIsSynchronised, *iRepository);
       
   626 	CContactSyncStaticRepository::ReadIntFromCentralRepositoryL(aCRKey, iNotificationPending, *iRepository);
       
   627 	CContactSyncStaticRepository::ReadIntFromCentralRepositoryL(aCRKey, iErrorCode, *iRepository);
       
   628 	CContactSyncStaticRepository::ReadIntFromCentralRepositoryL(aCRKey, iSynchronisedLeaveCode, *iRepository); 
       
   629 	TInt notificationVectorSize = 0;
       
   630 	CContactSyncStaticRepository::ReadIntFromCentralRepositoryL(aCRKey, notificationVectorSize, *iRepository);
       
   631     for (TInt i = 0 ; i < notificationVectorSize ; i++)
       
   632 	    {    
       
   633 		TInt notification;
       
   634 		CContactSyncStaticRepository::ReadIntFromCentralRepositoryL(aCRKey, notification, *iRepository);
       
   635 	    iStatusArray.Append(notification);	
       
   636 	    }
       
   637 	TInt numberOfPhonebookContacts = 0;
       
   638 	CContactSyncStaticRepository::ReadIntFromCentralRepositoryL(aCRKey, numberOfPhonebookContacts, *iRepository);
       
   639 	aCRKey+=10 - iStatusArray.Count();
       
   640     for (TInt i2 = 0 ; i2 < numberOfPhonebookContacts ; i2++)
       
   641 	    {    
       
   642 		CPhonebookContact* temp;
       
   643 		temp = CPhonebookContact::NewL(aCRKey, iRepository);
       
   644 		iPhonebookContacts.Append(temp);
       
   645 	    }
       
   646 	aCRKey+=10;
       
   647 	}
       
   648 	
       
   649 void CContactSyncPhonebookData::ExternaliseToCRL(TUint32& aCRKey)
       
   650 	{
       
   651 	TInt temp = iPhonebookUid.iUid;
       
   652     //TRAP(Err, iRepository->Set(aCRKey++, temp));
       
   653 	CContactSyncStaticRepository::WriteIntToCentralRepositoryL(aCRKey, temp, *iRepository);
       
   654 
       
   655     temp = iPhonebookTemplateId;
       
   656 	CContactSyncStaticRepository::WriteIntToCentralRepositoryL(aCRKey, temp, *iRepository);
       
   657     temp = iPhonebookGroupId;
       
   658 	CContactSyncStaticRepository::WriteIntToCentralRepositoryL(aCRKey, temp, *iRepository);
       
   659 	CContactSyncStaticRepository::WriteIntToCentralRepositoryL(aCRKey, iIsSynchronised, *iRepository);
       
   660  	CContactSyncStaticRepository::WriteIntToCentralRepositoryL(aCRKey, iNotificationPending, *iRepository);
       
   661  	CContactSyncStaticRepository::WriteIntToCentralRepositoryL(aCRKey, iErrorCode, *iRepository);
       
   662 	CContactSyncStaticRepository::WriteIntToCentralRepositoryL(aCRKey, iSynchronisedLeaveCode, *iRepository); 
       
   663  	CContactSyncStaticRepository::WriteIntToCentralRepositoryL(aCRKey, iStatusArray.Count(), *iRepository);
       
   664 	for (TInt i = 0 ; i < iStatusArray.Count() ; i++)
       
   665 	    {    
       
   666 		TInt notification(iStatusArray[i]);
       
   667  		CContactSyncStaticRepository::WriteIntToCentralRepositoryL(aCRKey, notification, *iRepository);
       
   668 	    }	
       
   669  	CContactSyncStaticRepository::WriteIntToCentralRepositoryL(aCRKey, iPhonebookContacts.Count(), *iRepository);
       
   670 	aCRKey+=10 - iStatusArray.Count();
       
   671     for (TInt i2 = 0 ; i2 < iPhonebookContacts.Count() ; i2++)
       
   672 	    { 
       
   673 	    CPhonebookContact* temp = iPhonebookContacts[i2];
       
   674 	    temp->WriteToCRL(aCRKey);   
       
   675 	    }
       
   676 	aCRKey+=10;
       
   677 	}
       
   678 
       
   679 TInt CContactSyncPhonebookData::ErrorCode()
       
   680 	{
       
   681 	return iErrorCode;
       
   682 	}
       
   683 
       
   684