phonebookengines_old/contactsmodel/tsrc/t_utils2.cpp
changeset 40 b46a585f6909
equal deleted inserted replaced
37:fd64c38c277d 40:b46a585f6909
       
     1 // Copyright (c) 2001-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 <e32math.h>
       
    17 #include <e32test.h>
       
    18 #include <cntdb.h>
       
    19 #include <cntitem.h>
       
    20 #include <cntfldst.h>
       
    21 #include <cntfield.h>
       
    22 #include "t_utils2.h"
       
    23 #include <cntview.h>
       
    24 #include <cntviewbase.h>
       
    25 #include <coreappstest/testserver.h>
       
    26 //
       
    27 // Constants.
       
    28 //
       
    29 
       
    30 _LIT(KNewLine,"\n");
       
    31 _LIT(KBackSpace,"\x08");
       
    32 _LIT(KVisualCounterFormat,"%S%d");
       
    33 _LIT8(KUnicodeStartFile,"\xFF\xFE");
       
    34 _LIT8(KUnicodeLineEnd,"\x0D\x00\x0a\x00");
       
    35 const TInt KMaxLogLength=0x100;
       
    36 
       
    37 
       
    38 
       
    39 
       
    40 //
       
    41 // CLog.
       
    42 //
       
    43 
       
    44 CLog* CLog::NewL(RTest& aTest,const TDesC& aLogFileName)
       
    45 	{
       
    46 	CLog* self=new(ELeave) CLog(aTest,aLogFileName);
       
    47 	CleanupStack::PushL(self);
       
    48 	self->ConstructL();
       
    49 	CleanupStack::Pop(); // self.
       
    50 	return self;
       
    51 	}
       
    52 
       
    53 CLog::CLog(RTest& aTest,const TDesC& aLogFileName)
       
    54 	: iTest(aTest),iLogFileName(aLogFileName),iVisualCounter(-1)
       
    55 	{
       
    56 	}
       
    57 
       
    58 CLog::~CLog()
       
    59 	{
       
    60 	iLogFile.Close();
       
    61 	delete iFileRegister;
       
    62 	}
       
    63 
       
    64 void CLog::ConstructL()
       
    65 	{
       
    66 	iFileRegister = CTestRegister::NewLC();
       
    67 	CleanupStack::Pop(iFileRegister);
       
    68 	
       
    69 	iFileRegister->CreateLogFileLC(iLogFile, iLogFileName);
       
    70 	User::LeaveIfError(iLogFile.Write(KUnicodeStartFile));
       
    71 	CleanupStack::Pop(&iLogFile); // This file stays open
       
    72 	}
       
    73 
       
    74 void CLog::Log(TRefByValue<const TDesC> aFmt,...)
       
    75 	{
       
    76 	VA_LIST list;
       
    77 	VA_START(list,aFmt);
       
    78 	TBuf<KMaxLogLength> buf;
       
    79 	buf.FormatList(aFmt,list);
       
    80 
       
    81 	iLogFile.Write(TPtrC8((TUint8 *)buf.Ptr(),buf.Size()));
       
    82 	iLogFile.Flush();
       
    83 	iTest.Printf(buf);
       
    84 	}
       
    85 
       
    86 void CLog::LogLine(TRefByValue<const TDesC> aFmt,...)
       
    87 	{
       
    88 	VA_LIST list;
       
    89 	VA_START(list,aFmt);
       
    90 	TBuf<KMaxLogLength> buf;
       
    91 	buf.FormatList(aFmt,list);
       
    92 
       
    93 	iLogFile.Write(TPtrC8((TUint8 *)buf.Ptr(),buf.Size()));
       
    94 	iLogFile.Write(KUnicodeLineEnd);
       
    95 	iLogFile.Flush();
       
    96 	buf.Append(KNewLine);
       
    97 	iTest.Printf(buf);
       
    98 	}
       
    99 
       
   100 void CLog::LogLineNoEcho(TRefByValue<const TDesC> aFmt,...)
       
   101 	{
       
   102 	VA_LIST list;
       
   103 	VA_START(list,aFmt);
       
   104 	TBuf<KMaxLogLength> buf;
       
   105 	buf.FormatList(aFmt,list);
       
   106 
       
   107 	iLogFile.Write(TPtrC8((TUint8 *)buf.Ptr(),buf.Size()));
       
   108 	iLogFile.Write(KUnicodeLineEnd);
       
   109 	iLogFile.Flush();
       
   110 	}
       
   111 
       
   112 void CLog::WriteLogToCommPortL()
       
   113 	{
       
   114 	iLogFile.Close();
       
   115 	iFileRegister->OpenLogFileLC(iLogFile, iLogFileName);
       
   116 	CleanupStack::Pop(&iLogFile);
       
   117 	TInt pos=2;
       
   118 	iLogFile.Seek(ESeekStart,pos); // Ignore Unicode header.
       
   119 	TBuf<KMaxLogLength> line;
       
   120 	while (ReadLogLineL(line))
       
   121 		{
       
   122 		RDebug::Print(line);
       
   123 		}
       
   124 	}
       
   125 
       
   126 TBool CLog::ReadLogLineL(TDes& aLine)
       
   127 	{
       
   128 	TBuf8<2> character=_L8("  ");
       
   129 	TBuf8<4> lineEndTestBuf=_L8("    ");
       
   130 
       
   131 	aLine.SetLength(0);
       
   132 	while (lineEndTestBuf!=KUnicodeLineEnd)
       
   133 		{
       
   134 		User::LeaveIfError(iLogFile.Read(character,2));
       
   135 		if (character.Length()>0)
       
   136 			{
       
   137 			lineEndTestBuf[0]=lineEndTestBuf[2];
       
   138 			lineEndTestBuf[1]=lineEndTestBuf[3];
       
   139 			lineEndTestBuf[2]=character[0];
       
   140 			lineEndTestBuf[3]=character[1];
       
   141 
       
   142 			const TPtrC16 widePtr((TUint16*)character.Ptr(),1);
       
   143 			aLine.Append(widePtr);
       
   144 			}
       
   145 		else
       
   146 			{
       
   147 			return EFalse;
       
   148 			}
       
   149 		}
       
   150 
       
   151 	aLine=aLine.Left(aLine.Length()-2); // Strip off \n\r.
       
   152 	return ETrue;
       
   153 	}
       
   154 
       
   155 void CLog::IncVisualCounter()
       
   156 	{
       
   157 	TBuf<8> backSpaceBuf;
       
   158 
       
   159 	if (iVisualCounter>=0)
       
   160 		{
       
   161 		TInt numDigits=1;
       
   162 		TInt divisor=10;
       
   163 
       
   164 		FOREVER
       
   165 			{
       
   166 			if (iVisualCounter/divisor>0)
       
   167 				{
       
   168 				divisor*=10;
       
   169 				++numDigits;
       
   170 				}
       
   171 			else
       
   172 				{
       
   173 				break;
       
   174 				}
       
   175 			}
       
   176 
       
   177 		for (TInt ii=0;ii<numDigits;++ii)
       
   178 			{
       
   179 			backSpaceBuf.Append(KBackSpace);
       
   180 			}
       
   181 		}
       
   182 
       
   183 	iTest.Printf(KVisualCounterFormat,&backSpaceBuf,++iVisualCounter);
       
   184 	}
       
   185 
       
   186 void CLog::EndVisualCounter()
       
   187 	{
       
   188 	iTest.Printf(KNewLine);
       
   189 	iVisualCounter=-1;
       
   190 	}
       
   191 
       
   192 
       
   193 
       
   194 
       
   195 //
       
   196 // CRandomContactGenerator.
       
   197 //
       
   198 
       
   199 CRandomContactGenerator::CRandomContactGenerator()
       
   200 	{
       
   201 	}
       
   202 
       
   203 CRandomContactGenerator::CRandomContactGenerator(MRandomWordGenerator* aFirstname, MRandomWordGenerator* aLastname, MRandomWordGenerator* aCompany ) :
       
   204 	iFirstName(aFirstname)
       
   205 	{
       
   206 	if(aLastname)
       
   207 		{
       
   208 		iLastName = aLastname;
       
   209 		}
       
   210 	else
       
   211 		{
       
   212 		iLastName = iFirstName;
       
   213 		}
       
   214 	if(aCompany)
       
   215 		{
       
   216 		iCoName = aCompany;
       
   217 		}
       
   218 	else
       
   219 		{
       
   220 		iCoName = iLastName;
       
   221 		}
       
   222 	}
       
   223 
       
   224 CRandomContactGenerator::~CRandomContactGenerator()
       
   225 	{
       
   226 	delete iTemplate;
       
   227 	delete iFirstName;
       
   228 	if (iLastName != iFirstName)
       
   229 		delete iLastName;
       
   230 	if (iCoName != iFirstName && iCoName != iLastName)
       
   231 		delete iCoName;
       
   232 	}
       
   233 
       
   234 CRandomContactGenerator* CRandomContactGenerator::NewL()
       
   235 	{
       
   236 	CRandomContactGenerator* self=new(ELeave) CRandomContactGenerator();
       
   237 	CleanupStack::PushL(self);
       
   238 	//self->ConstructL();
       
   239 	CleanupStack::Pop(); // self.
       
   240 	return self;
       
   241 	}
       
   242 
       
   243 /** Takes ownership of the args. If this Leaves the args will be deleted. Args can be duplicates
       
   244 	If aCompany is NULL, this uses aLastname to generate company names. 
       
   245 	If aLastname is NULL, this uses aFirstname to generate last names (and, potentially, company names as well) */
       
   246 CRandomContactGenerator* CRandomContactGenerator::NewL(MRandomWordGenerator* aFirstname, MRandomWordGenerator* aLastname, MRandomWordGenerator* aCompany )
       
   247 	{
       
   248 	CRandomContactGenerator* self=new(ELeave) CRandomContactGenerator(aFirstname, aLastname, aCompany);
       
   249 	CleanupStack::PushL(self);
       
   250 	self->ConstructL();
       
   251 	CleanupStack::Pop(); // self.
       
   252 	return self;
       
   253 	}
       
   254 
       
   255 void CRandomContactGenerator::ConstructL()
       
   256 	{}
       
   257 
       
   258 
       
   259 void CRandomContactGenerator::SetDbL(CContactDatabase& aDb)
       
   260 	{
       
   261 	iDb=&aDb;
       
   262 	iTemplate=STATIC_CAST(CContactTemplate*,iDb->ReadContactL(iDb->TemplateId()));
       
   263 	}
       
   264 
       
   265 TPtrC CRandomContactGenerator::PhoneMatch() const
       
   266 	{
       
   267 	return TPtrC(iPhoneMatch);
       
   268 	}
       
   269 
       
   270 TPtrC CRandomContactGenerator::NameMatch() const
       
   271 	{
       
   272 	return TPtrC(iNameMatch);
       
   273 	}
       
   274 
       
   275 TPtrC CRandomContactGenerator::EmailMatch() const
       
   276 	{
       
   277 	return TPtrC(iEmailMatch);
       
   278 	}
       
   279 	
       
   280 void CRandomContactGenerator::SetRandomWordL(TDes& aBuf, TInt32 aType )
       
   281 	{
       
   282 	MRandomWordGenerator* word = iFirstName;
       
   283 	TInt len = 16;
       
   284 	switch (aType)
       
   285 		{
       
   286 		case KUidContactFieldFamilyNameValue:
       
   287 		case KUidContactFieldFamilyNamePronunciationValue:
       
   288 			word = iLastName;
       
   289 			break;
       
   290 		case KUidContactFieldCompanyNameValue:
       
   291 		case KUidContactFieldCompanyNamePronunciationValue:
       
   292 			word = iCoName;
       
   293 			break;
       
   294 		case KUidContactFieldEMailValue:
       
   295 			len = 32;
       
   296 			break;
       
   297 		}
       
   298 	if(!word)
       
   299 		{
       
   300 		SetRandomAlphaString(aBuf,len);
       
   301 		return;
       
   302 		}
       
   303 	aBuf = *word->WordLC();
       
   304 	CleanupStack::PopAndDestroy();
       
   305 	
       
   306 	// the following are to make these look a bite more realistic
       
   307 	if(aType==KUidContactFieldEMailValue)	
       
   308 		{
       
   309 		aBuf.Append('@');
       
   310 		aBuf.Append(*word->WordLC());
       
   311 		CleanupStack::PopAndDestroy();
       
   312 		aBuf.Append(_L(".co.uk"));
       
   313 		}
       
   314 	if((aType==KUidContactFieldCompanyNameValue || aType==KUidContactFieldCompanyNamePronunciationValue) 
       
   315 			&& word==iLastName)
       
   316 		{
       
   317 		aBuf.Append(' ');
       
   318 		aBuf.Append(*word->WordLC());
       
   319 		CleanupStack::PopAndDestroy();
       
   320 		aBuf.Append(_L(" Ltd."));
       
   321 		}
       
   322 	}
       
   323 
       
   324 TContactItemId CRandomContactGenerator::AddTypicalRandomContactL()
       
   325 	{
       
   326 	CTestContact* contact=CTestContact::NewLC(*iTemplate);
       
   327 	HBufC* buf=HBufC::NewLC(64);
       
   328 	TPtr bufPtr=buf->Des();
       
   329 	SetRandomWordL(bufPtr,KUidContactFieldGivenNameValue);
       
   330 	contact->SetFirstNameL(bufPtr);
       
   331 	iNameMatch=bufPtr;
       
   332 	SetRandomWordL(bufPtr,KUidContactFieldFamilyNameValue);
       
   333 	contact->SetLastNameL(bufPtr);
       
   334 	SetRandomWordL(bufPtr,KUidContactFieldCompanyNameValue);
       
   335 	contact->SetCompanyNameL(bufPtr);
       
   336 	SetRandomNumericString(bufPtr,16);
       
   337 	contact->SetWorkPhoneL(bufPtr);
       
   338 	iPhoneMatch=bufPtr;
       
   339 	SetRandomNumericString(bufPtr,16);
       
   340 	contact->SetWorkMobileL(bufPtr);
       
   341 	SetRandomNumericString(bufPtr,16);
       
   342 	contact->SetHomePhoneL(bufPtr);
       
   343 	SetRandomWordL(bufPtr,KUidContactFieldEMailValue);
       
   344 	contact->SetWorkEmailAddressL(bufPtr);
       
   345 	iEmailMatch=bufPtr;
       
   346 
       
   347 	TContactItemId id = iDb->AddNewContactL(contact->ContactItem());
       
   348 	CleanupStack::PopAndDestroy(2); // buf, contact.
       
   349 	return id;
       
   350 	}
       
   351 
       
   352 TContactItemId CRandomContactGenerator::AddTypicalRandomContactWithNamesL(const RArray<TInt>& iNames, TBool aWithMapping)
       
   353 	{
       
   354 	CTestContact* contact=CTestContact::NewLC(*iTemplate);
       
   355 	HBufC* buf=HBufC::NewLC(64);
       
   356 	TPtr bufPtr=buf->Des();
       
   357 	TInt i;
       
   358 	for(i=iNames.Count()-1;i>=0;i--) 
       
   359 		{
       
   360 		SetRandomWordL(bufPtr,iNames[i]);
       
   361 		if(!aWithMapping )
       
   362 			{
       
   363 			contact->SetTextFieldL(TUid::Uid(iNames[i]),bufPtr);
       
   364 			}
       
   365 		else
       
   366 			{
       
   367 			switch (iNames[i])
       
   368 				{
       
   369 				case KUidContactFieldCompanyNameValue: 
       
   370 					contact->SetCompanyNameL(bufPtr);
       
   371 					break;
       
   372 				case KUidContactFieldCompanyNamePronunciationValue:
       
   373 					contact->SetCompanyNameL(bufPtr, ETrue);
       
   374 					break;
       
   375 				case KUidContactFieldGivenNameValue:
       
   376 					contact->SetFirstNameL(bufPtr);
       
   377 					break;
       
   378 				case KUidContactFieldGivenNamePronunciationValue:
       
   379 					contact->SetFirstNameL(bufPtr, ETrue);
       
   380 					break;
       
   381 				case KUidContactFieldFamilyNameValue:
       
   382 					contact->SetLastNameL(bufPtr);
       
   383 					break;
       
   384 				case KUidContactFieldFamilyNamePronunciationValue:
       
   385 					contact->SetLastNameL(bufPtr, ETrue);
       
   386 					break;
       
   387 				default:
       
   388 					contact->SetTextFieldL(TUid::Uid(iNames[i]),bufPtr);
       
   389 				}
       
   390 			}
       
   391 		iNameMatch=bufPtr;
       
   392 	}
       
   393 	
       
   394 	SetRandomNumericString(bufPtr,16);
       
   395 	contact->SetWorkPhoneL(bufPtr);
       
   396 	iPhoneMatch=bufPtr;
       
   397 	SetRandomNumericString(bufPtr,16);
       
   398 	contact->SetWorkMobileL(bufPtr);
       
   399 	SetRandomNumericString(bufPtr,16);
       
   400 	contact->SetHomePhoneL(bufPtr);
       
   401 	SetRandomWordL(bufPtr,KUidContactFieldEMailValue);
       
   402 	contact->SetWorkEmailAddressL(bufPtr);
       
   403 	iEmailMatch=bufPtr;
       
   404 
       
   405 	TContactItemId id = iDb->AddNewContactL(contact->ContactItem());
       
   406 	CleanupStack::PopAndDestroy(2); // buf, contact.
       
   407 	return id;
       
   408 	}
       
   409 
       
   410 void CRandomContactGenerator::AddAtypicalRandomContactL()
       
   411 	{
       
   412 	CTestContact* contact=CTestContact::NewLC(*iTemplate);
       
   413 	HBufC* buf=HBufC::NewLC(256);
       
   414 	TPtr bufPtr=buf->Des();
       
   415 	SetRandomAlphaString(bufPtr,32);
       
   416 	contact->SetFirstNameL(bufPtr);
       
   417 	SetRandomAlphaString(bufPtr,32);
       
   418 	contact->SetLastNameL(bufPtr);
       
   419 	SetRandomAlphaString(bufPtr,32);
       
   420 	contact->SetCompanyNameL(bufPtr);
       
   421 	SetRandomAlphaString(bufPtr,32);
       
   422 	contact->SetJobTitleL(bufPtr);
       
   423 	SetRandomNumericString(bufPtr,24);
       
   424 	contact->SetWorkPhoneL(bufPtr);
       
   425 	SetRandomNumericString(bufPtr,24);
       
   426 	contact->SetWorkMobileL(bufPtr);
       
   427 	SetRandomNumericString(bufPtr,24);
       
   428 	contact->SetHomePhoneL(bufPtr);
       
   429 	SetRandomNumericString(bufPtr,24);
       
   430 	contact->SetHomeMobileL(bufPtr);
       
   431 	SetRandomNumericString(bufPtr,24);
       
   432 	contact->SetFaxL(bufPtr);
       
   433 	SetRandomAlphaNumericString(bufPtr,48);
       
   434 	contact->SetWorkEmailAddressL(bufPtr);
       
   435 	SetRandomAlphaNumericString(bufPtr,48);
       
   436 	contact->SetInternetAddressL(bufPtr);
       
   437 	SetRandomAlphaNumericString(bufPtr,32);
       
   438 	contact->SetStreetL(bufPtr);
       
   439 	SetRandomAlphaString(bufPtr,32);
       
   440 	contact->SetTownL(bufPtr);
       
   441 	SetRandomAlphaString(bufPtr,32);
       
   442 	contact->SetCountyL(bufPtr);
       
   443 	SetRandomAlphaNumericString(bufPtr,16);
       
   444 	contact->SetPostCodeL(bufPtr);
       
   445 	SetRandomAlphaString(bufPtr,32);
       
   446 	contact->SetCountryL(bufPtr);
       
   447 	SetRandomAlphaNumericString(bufPtr,256);
       
   448 	contact->SetNotesL(bufPtr);
       
   449 
       
   450 	iDb->AddNewContactL(contact->ContactItem());
       
   451 	CleanupStack::PopAndDestroy(2); // buf, contact.
       
   452 	}
       
   453 
       
   454 TContactItemId CRandomContactGenerator::AddTypicalContactForFilterL(TInt aBitWiseFilter, TInt& aLeaveCode)
       
   455 	{
       
   456 	TContactItemId retval = 0;
       
   457 	CTestContact* contact=CTestContact::NewLC(*iTemplate);
       
   458 	HBufC* buf=HBufC::NewLC(32);
       
   459 	TPtr bufPtr=buf->Des();
       
   460 	SetRandomAlphaString(bufPtr,16);
       
   461 	contact->SetFirstNameL(bufPtr);
       
   462 	SetRandomAlphaString(bufPtr,16);
       
   463 	contact->SetLastNameL(bufPtr);
       
   464 	SetRandomAlphaString(bufPtr,16);
       
   465 	contact->SetCompanyNameL(bufPtr);
       
   466 
       
   467 	if(aBitWiseFilter&CContactDatabase::ELandLine)
       
   468 		{
       
   469 		SetRandomNumericString(bufPtr,16);
       
   470 		contact->SetWorkPhoneL(bufPtr);
       
   471 		}
       
   472 	if(aBitWiseFilter&CContactDatabase::ESmsable)
       
   473 		{
       
   474 		SetRandomNumericString(bufPtr,16);
       
   475 		contact->SetWorkMobileL(bufPtr);
       
   476 		}
       
   477 	if(aBitWiseFilter&CContactDatabase::EMailable)
       
   478 		{
       
   479 		SetRandomAlphaNumericString(bufPtr,32);
       
   480 		if (aBitWiseFilter&CContactDatabase::EHome)
       
   481 			contact->SetHomeEmailAddressL(bufPtr);
       
   482 		else
       
   483 			contact->SetWorkEmailAddressL(bufPtr);
       
   484 		}
       
   485 	if(aBitWiseFilter&CContactDatabase::EFaxable)
       
   486 		{
       
   487 		SetRandomNumericString(bufPtr,16);
       
   488 		contact->SetFaxL(bufPtr);
       
   489 		}
       
   490 
       
   491 
       
   492 	TRAP( aLeaveCode, { retval = iDb->AddNewContactL(contact->ContactItem()); } );
       
   493 	CleanupStack::PopAndDestroy(2); // buf, contact.
       
   494 	return retval;
       
   495 	}
       
   496 
       
   497 TContactItemId CRandomContactGenerator::AddTypicalContactForFilterL(TInt aBitWiseFilter)
       
   498 	{
       
   499 	TUid fakeUid = TUid::Null();
       
   500 	return AddTypicalContactForFilterL(aBitWiseFilter, fakeUid);
       
   501 	}
       
   502 	
       
   503 TContactItemId CRandomContactGenerator::AddTypicalContactForFilterL(TInt aBitWiseFilter, TUid aIMProtocol)
       
   504 	{
       
   505 	CTestContact* contact=CTestContact::NewLC(*iTemplate);
       
   506 	HBufC* buf=HBufC::NewLC(32);
       
   507 	TPtr bufPtr=buf->Des();
       
   508 	SetRandomAlphaString(bufPtr,16);
       
   509 	contact->SetFirstNameL(bufPtr);
       
   510 	SetRandomAlphaString(bufPtr,16);
       
   511 	contact->SetLastNameL(bufPtr);
       
   512 	SetRandomAlphaString(bufPtr,16);
       
   513 	contact->SetCompanyNameL(bufPtr);
       
   514 
       
   515 	if(aBitWiseFilter&CContactDatabase::ELandLine)
       
   516 		{
       
   517 		SetRandomNumericString(bufPtr,16);
       
   518 		contact->SetWorkPhoneL(bufPtr);
       
   519 		}
       
   520 	if(aBitWiseFilter&CContactDatabase::ESmsable)
       
   521 		{
       
   522 		SetRandomNumericString(bufPtr,16);
       
   523 		contact->SetWorkMobileL(bufPtr);
       
   524 		}
       
   525 	if(aBitWiseFilter&CContactDatabase::EMailable)
       
   526 		{
       
   527 		SetRandomAlphaNumericString(bufPtr,32);
       
   528 		if (aBitWiseFilter&CContactDatabase::EHome)
       
   529 			contact->SetHomeEmailAddressL(bufPtr);
       
   530 		else
       
   531 			contact->SetWorkEmailAddressL(bufPtr);
       
   532 		}
       
   533 	if(aBitWiseFilter&CContactDatabase::EFaxable)
       
   534 		{
       
   535 		SetRandomNumericString(bufPtr,16);
       
   536 		contact->SetFaxL(bufPtr);
       
   537 		}
       
   538 
       
   539 	if(aBitWiseFilter&CContactDatabase::ERingTone)
       
   540 		{
       
   541 		SetRandomNumericString(bufPtr,16);
       
   542 		contact->SetRingToneL(bufPtr);
       
   543 		}
       
   544 	if(aBitWiseFilter&CContactDatabase::EVoiceDial)
       
   545 		{
       
   546 		SetRandomNumericString(bufPtr,16);
       
   547 		contact->SetVoiceDialL(bufPtr);
       
   548 		}
       
   549 
       
   550 	if(aBitWiseFilter&CContactDatabase::EWirelessVillage)
       
   551 		{
       
   552 		SetRandomNumericString(bufPtr,16);
       
   553 		contact->SetIMAddressL(bufPtr, aIMProtocol);
       
   554 		}		
       
   555 
       
   556 	TContactItemId id = iDb->AddNewContactL(contact->ContactItem());
       
   557 	CleanupStack::PopAndDestroy(2); // buf, contact.
       
   558 	return id;
       
   559 	}
       
   560 	
       
   561 
       
   562 TContactItemId CRandomContactGenerator::AddTypicalContactForLocalViewPreferencesL(TContactViewPreferences aContactTypes)
       
   563 	{
       
   564 	CTestContact* contact=CTestContact::NewLC(*iTemplate);
       
   565 	HBufC* buf=HBufC::NewLC(32);
       
   566 	TPtr bufPtr=buf->Des();
       
   567 				
       
   568 	if(aContactTypes&EUnSortedAtBeginning || aContactTypes&EUnSortedAtEnd)
       
   569 		{
       
   570 		SetRandomNumericString(bufPtr,16);
       
   571 		contact->SetWorkPhoneL(bufPtr);
       
   572 		}
       
   573 
       
   574 	if(aContactTypes&ESingleWhiteSpaceIsEmptyField)
       
   575 		{
       
   576 		contact->SetFirstNameL(_L(" "));
       
   577 		contact->SetCompanyNameL(_L(" "));
       
   578 
       
   579 		SetRandomAlphaString(bufPtr,16);
       
   580 		contact->SetLastNameL(bufPtr);
       
   581 
       
   582 		SetRandomNumericString(bufPtr,16);
       
   583 		contact->SetWorkPhoneL(bufPtr);
       
   584 		}
       
   585 
       
   586 
       
   587 	TContactItemId newId = iDb->AddNewContactL(contact->ContactItem());
       
   588 	CleanupStack::PopAndDestroy(2); // buf, contact.
       
   589 	return newId;
       
   590 	}
       
   591 
       
   592 void CRandomContactGenerator::SetRandomAlphaString(TDes& aBuf,TInt aLength)
       
   593 	{
       
   594 	aBuf.SetLength(aLength);
       
   595 
       
   596 	for (TInt ii=0;ii<aLength;++ii)
       
   597 		{
       
   598 		aBuf[ii]=RandomAlphaCharCode();
       
   599 		}
       
   600 	}
       
   601 
       
   602 void CRandomContactGenerator::SetRandomNumericString(TDes& aBuf,TInt aLength)
       
   603 	{
       
   604 	aBuf.SetLength(aLength);
       
   605 
       
   606 	for (TInt ii=0;ii<aLength;++ii)
       
   607 		{
       
   608 		aBuf[ii]=RandomNumericCharCode();
       
   609 		}
       
   610 	}
       
   611 
       
   612 void CRandomContactGenerator::SetRandomAlphaNumericString(TDes& aBuf,TInt aLength)
       
   613 	{
       
   614 	aBuf.SetLength(aLength);
       
   615 
       
   616 	for (TInt ii=0;ii<aLength;++ii)
       
   617 		{
       
   618 		aBuf[ii]=RandomAlphaNumbericCharCode();
       
   619 		}
       
   620 	}
       
   621 
       
   622 TText CRandomContactGenerator::RandomAlphaCharCode()
       
   623 	{
       
   624 	return RandomCharCode('A','z',' ');
       
   625 	}
       
   626 
       
   627 TText CRandomContactGenerator::RandomNumericCharCode()
       
   628 	{
       
   629 	return RandomCharCode('0','9',' ');
       
   630 	}
       
   631 
       
   632 TText CRandomContactGenerator::RandomAlphaNumbericCharCode()
       
   633 	{
       
   634 	return RandomCharCode('0','z',' ');
       
   635 	}
       
   636 
       
   637 TText CRandomContactGenerator::RandomCharCode(TText aLowerBound,TText aUpperBound,TText aException)
       
   638 	{
       
   639 	TText charCode=0;
       
   640 	
       
   641 	do
       
   642 		{
       
   643 		charCode=RandomCharCode(aLowerBound,aUpperBound);
       
   644 		}
       
   645 		while (charCode==aException);
       
   646 
       
   647 	return charCode;
       
   648 	}
       
   649 
       
   650 TText CRandomContactGenerator::RandomCharCode(TText aLowerBound,TText aUpperBound)
       
   651 	{
       
   652 	TText charCode=STATIC_CAST(TText,(Math::Rand(iRandSeed)%(aUpperBound-aLowerBound))+aLowerBound);
       
   653 	ASSERT(charCode>=aLowerBound && charCode<=aUpperBound);
       
   654 	return charCode;
       
   655 	}
       
   656 
       
   657 
       
   658 //
       
   659 // CContactNameGenerator.
       
   660 //
       
   661 /*
       
   662 CContactNameGenerator* CContactNameGenerator::NewL(RTest& aTest,CLog& aLog)
       
   663 	{
       
   664 	CContactNameGenerator* self=new(ELeave) CContactNameGenerator(aTest,aLog);
       
   665 	CleanupStack::PushL(self);
       
   666 	self->ConstructL();
       
   667 	CleanupStack::Pop(); // self.
       
   668 	return self;
       
   669 	}
       
   670 
       
   671 CContactNameGenerator::CContactNameGenerator(RTest& aTest,CLog& aLog)
       
   672 	: iTest(aTest),iLog(aLog)
       
   673 	{
       
   674 	}
       
   675 
       
   676 CContactNameGenerator::~CContactNameGenerator()
       
   677 	{
       
   678 	}
       
   679 
       
   680 void CContactNameGenerator::ConstructL()
       
   681 	{
       
   682 	}
       
   683 
       
   684 void CContactNameGenerator::SetDbL(CContactDatabase& aDb)
       
   685 	{
       
   686 	iDb=&aDb;
       
   687 	iTemplate=STATIC_CAST(CContactTemplate*,iDb->ReadContactL(iDb->TemplateId()));
       
   688 	}
       
   689 */
       
   690 
       
   691 //
       
   692 // CTestContact.
       
   693 //
       
   694 
       
   695 CTestContact* CTestContact::NewL(CContactItem& aSeedContact)
       
   696 	{
       
   697 	CTestContact* self=CTestContact::NewLC(aSeedContact);
       
   698 	CleanupStack::Pop();
       
   699 	return self;
       
   700 	}
       
   701 
       
   702 CTestContact* CTestContact::NewLC(CContactItem& aSeedContact)
       
   703 	{
       
   704 	CTestContact* self=new(ELeave) CTestContact();
       
   705 	CleanupStack::PushL(self);
       
   706 	self->ConstructL(aSeedContact);
       
   707 	return self;
       
   708 	}
       
   709 
       
   710 CTestContact::CTestContact()
       
   711 	{
       
   712 	}
       
   713 
       
   714 void CTestContact::ConstructL(CContactItem& aSeedContact)
       
   715 	{
       
   716 	iContactItem=CContactCard::NewL(&aSeedContact);
       
   717 	}
       
   718 
       
   719 CTestContact::~CTestContact()
       
   720 	{
       
   721 	delete iContactItem;
       
   722 	}
       
   723 
       
   724 CContactItem& CTestContact::ContactItem()
       
   725 	{
       
   726 	return *iContactItem;
       
   727 	}
       
   728 
       
   729 const TPtrC CTestContact::FirstNameL()
       
   730 	{
       
   731 	return TextFieldL(KUidContactFieldGivenName);
       
   732 	}
       
   733 
       
   734 const TPtrC CTestContact::LastNameL()
       
   735 	{
       
   736 	return TextFieldL(KUidContactFieldFamilyName);
       
   737 	}
       
   738 
       
   739 const TPtrC CTestContact::CompanyNameL()
       
   740 	{
       
   741 	return TextFieldL(KUidContactFieldCompanyName);
       
   742 	}
       
   743 
       
   744 const TPtrC CTestContact::JobTitleL()
       
   745 	{
       
   746 	return TextFieldL(KUidContactFieldJobTitle);
       
   747 	}
       
   748 
       
   749 const TPtrC CTestContact::WorkPhoneL()
       
   750 	{
       
   751 	CContentType* contentType=CContentType::NewL();
       
   752 	CleanupStack::PushL(contentType);
       
   753 	contentType->AddFieldTypeL(KUidContactFieldPhoneNumber);
       
   754 	contentType->AddFieldTypeL(KUidContactFieldVCardMapWORK);
       
   755 	contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE);
       
   756 	const TPtrC text=TextFieldL(*contentType);
       
   757 	CleanupStack::PopAndDestroy(); // contentType.
       
   758 	return text;
       
   759 	}
       
   760 
       
   761 const TPtrC CTestContact::WorkMobileL()
       
   762 	{
       
   763 	CContentType* contentType=CContentType::NewL();
       
   764 	CleanupStack::PushL(contentType);
       
   765 	contentType->AddFieldTypeL(KUidContactFieldPhoneNumber);
       
   766 	contentType->AddFieldTypeL(KUidContactFieldVCardMapWORK);
       
   767 	contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE);
       
   768 	contentType->AddFieldTypeL(KUidContactFieldVCardMapCELL);
       
   769 	const TPtrC text=TextFieldL(*contentType);
       
   770 	CleanupStack::PopAndDestroy(); // contentType.
       
   771 	return text;
       
   772 	}
       
   773 
       
   774 const TPtrC CTestContact::HomePhoneL()
       
   775 	{
       
   776 	CContentType* contentType=CContentType::NewL();
       
   777 	CleanupStack::PushL(contentType);
       
   778 	contentType->AddFieldTypeL(KUidContactFieldPhoneNumber);
       
   779 	contentType->AddFieldTypeL(KUidContactFieldVCardMapHOME);
       
   780 	contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE);
       
   781 	const TPtrC text=TextFieldL(*contentType);
       
   782 	CleanupStack::PopAndDestroy(); // contentType.
       
   783 	return text;
       
   784 	}
       
   785 
       
   786 const TPtrC CTestContact::HomeMobileL()
       
   787 	{
       
   788 	CContentType* contentType=CContentType::NewL();
       
   789 	CleanupStack::PushL(contentType);
       
   790 	contentType->AddFieldTypeL(KUidContactFieldPhoneNumber);
       
   791 	contentType->AddFieldTypeL(KUidContactFieldVCardMapHOME);
       
   792 	contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE);
       
   793 	contentType->AddFieldTypeL(KUidContactFieldVCardMapCELL);
       
   794 	const TPtrC text=TextFieldL(*contentType);
       
   795 	CleanupStack::PopAndDestroy(); // contentType.
       
   796 	return text;
       
   797 	}
       
   798 
       
   799 const TPtrC CTestContact::FaxL()
       
   800 	{
       
   801 	return TextFieldL(KUidContactFieldFax);
       
   802 	}
       
   803 
       
   804 const TPtrC CTestContact::EmailAddressL()
       
   805 	{
       
   806 	return TextFieldL(KUidContactFieldEMail);
       
   807 	}
       
   808 
       
   809 const TPtrC CTestContact::InternetAddressL()
       
   810 	{
       
   811 	return TextFieldL(KUidContactFieldUrl);
       
   812 	}
       
   813 
       
   814 const TPtrC CTestContact::StreetL()
       
   815 	{
       
   816 	return TextFieldL(KUidContactFieldAddress);
       
   817 	}
       
   818 
       
   819 const TPtrC CTestContact::TownL()
       
   820 	{
       
   821 	return TextFieldL(KUidContactFieldLocality);
       
   822 	}
       
   823 
       
   824 const TPtrC CTestContact::CountyL()
       
   825 	{
       
   826 	return TextFieldL(KUidContactFieldRegion);
       
   827 	}
       
   828 
       
   829 const TPtrC CTestContact::PostCodeL()
       
   830 	{
       
   831 	return TextFieldL(KUidContactFieldPostcode);
       
   832 	}
       
   833 
       
   834 const TPtrC CTestContact::CountryL()
       
   835 	{
       
   836 	return TextFieldL(KUidContactFieldCountry);
       
   837 	}
       
   838 
       
   839 const TPtrC CTestContact::NotesL()
       
   840 	{
       
   841 	return TextFieldL(KUidContactFieldNote);
       
   842 	}
       
   843 
       
   844 void CTestContact::SetFirstNameL(const TDesC& aFirstName, TBool aIsPronunciation)
       
   845 	{
       
   846 	const TUid id = aIsPronunciation ? KUidContactFieldGivenNamePronunciation : KUidContactFieldGivenName;
       
   847 	SetTextFieldL(id,aFirstName, KUidContactFieldVCardMapUnusedN);
       
   848 	}
       
   849 
       
   850 void CTestContact::SetLastNameL(const TDesC& aLastName, TBool aIsPronunciation)
       
   851 	{
       
   852 	const TUid id = aIsPronunciation ? KUidContactFieldFamilyNamePronunciation : KUidContactFieldFamilyName;
       
   853 	SetTextFieldL(id,aLastName, KUidContactFieldVCardMapUnusedN);
       
   854 	}
       
   855 
       
   856 void CTestContact::SetCompanyNameL(const TDesC& aCompanyName, TBool aIsPronunciation)
       
   857 	{	
       
   858 	if ( aIsPronunciation )
       
   859 		SetTextFieldL(KUidContactFieldCompanyNamePronunciation,aCompanyName, KUidContactFieldVCardMapORGPronunciation);
       
   860 	else
       
   861 		SetTextFieldL(KUidContactFieldCompanyName,aCompanyName, KUidContactFieldVCardMapORG);
       
   862 	}
       
   863 
       
   864 void CTestContact::SetJobTitleL(const TDesC& aJobTitle)
       
   865 	{
       
   866 	SetTextFieldL(KUidContactFieldJobTitle,aJobTitle);
       
   867 	}
       
   868 
       
   869 void CTestContact::SetWorkPhoneL(const TDesC& aWorkPhone)
       
   870 	{
       
   871 	CContentType* contentType=CContentType::NewL();
       
   872 	CleanupStack::PushL(contentType);
       
   873 	contentType->AddFieldTypeL(KUidContactFieldPhoneNumber);
       
   874 	contentType->AddFieldTypeL(KUidContactFieldVCardMapWORK);
       
   875 	contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE);
       
   876 	SetTextFieldL(*contentType,aWorkPhone);
       
   877 	CleanupStack::PopAndDestroy(); // contentType.
       
   878 	}
       
   879 
       
   880 void CTestContact::SetWorkMobileL(const TDesC& aWorkMobile)
       
   881 	{
       
   882 	CContentType* contentType=CContentType::NewL();
       
   883 	CleanupStack::PushL(contentType);
       
   884 	contentType->AddFieldTypeL(KUidContactFieldPhoneNumber);
       
   885 	contentType->AddFieldTypeL(KUidContactFieldVCardMapWORK);
       
   886 	contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE);
       
   887 	contentType->AddFieldTypeL(KUidContactFieldVCardMapCELL);
       
   888 	SetTextFieldL(*contentType,aWorkMobile);
       
   889 	CleanupStack::PopAndDestroy(); // contentType.
       
   890 	}
       
   891 
       
   892 void CTestContact::SetHomePhoneL(const TDesC& aHomePhone)
       
   893 	{
       
   894 	CContentType* contentType=CContentType::NewL();
       
   895 	CleanupStack::PushL(contentType);
       
   896 	contentType->AddFieldTypeL(KUidContactFieldPhoneNumber);
       
   897 	contentType->AddFieldTypeL(KUidContactFieldVCardMapHOME);
       
   898 	contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE);
       
   899 	SetTextFieldL(*contentType,aHomePhone);
       
   900 	CleanupStack::PopAndDestroy(); // contentType.
       
   901 	}
       
   902 
       
   903 void CTestContact::SetHomeMobileL(const TDesC& aHomeMobile)
       
   904 	{
       
   905 	CContentType* contentType=CContentType::NewL();
       
   906 	CleanupStack::PushL(contentType);
       
   907 	contentType->AddFieldTypeL(KUidContactFieldPhoneNumber);
       
   908 	contentType->AddFieldTypeL(KUidContactFieldVCardMapHOME);
       
   909 	contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE);
       
   910 	contentType->AddFieldTypeL(KUidContactFieldVCardMapCELL);
       
   911 	SetTextFieldL(*contentType,aHomeMobile);
       
   912 	CleanupStack::PopAndDestroy(); // contentType.
       
   913 	}
       
   914 
       
   915 void CTestContact::SetFaxL(const TDesC& aFax)
       
   916 	{
       
   917 	SetTextFieldL(KUidContactFieldFax,aFax);
       
   918 	}
       
   919 
       
   920 void CTestContact::SetHomeEmailAddressL(const TDesC& aEmailAddress)
       
   921 	{
       
   922 	CContentType* contentType=CContentType::NewL();
       
   923 	CleanupStack::PushL(contentType);
       
   924 	contentType->AddFieldTypeL(KUidContactFieldEMail);
       
   925 	contentType->AddFieldTypeL(KUidContactFieldVCardMapHOME);
       
   926 	SetTextFieldL(*contentType,aEmailAddress);
       
   927 	CleanupStack::PopAndDestroy(contentType);
       
   928 	}
       
   929 
       
   930 void CTestContact::SetWorkEmailAddressL(const TDesC& aEmailAddress)
       
   931 	{
       
   932 	CContentType* contentType=CContentType::NewL();
       
   933 	CleanupStack::PushL(contentType);
       
   934 	contentType->AddFieldTypeL(KUidContactFieldEMail);
       
   935 	contentType->AddFieldTypeL(KUidContactFieldVCardMapWORK);
       
   936 	SetTextFieldL(*contentType,aEmailAddress);
       
   937 	CleanupStack::PopAndDestroy(contentType); 
       
   938 	}
       
   939 
       
   940 
       
   941 void CTestContact::SetInternetAddressL(const TDesC& aInternetAddress)
       
   942 	{
       
   943 	SetTextFieldL(KUidContactFieldUrl,aInternetAddress);
       
   944 	}
       
   945 
       
   946 void CTestContact::SetStreetL(const TDesC& aStreet)
       
   947 	{
       
   948 	SetTextFieldL(KUidContactFieldAddress,aStreet);
       
   949 	}
       
   950 
       
   951 void CTestContact::SetTownL(const TDesC& aTown)
       
   952 	{
       
   953 	SetTextFieldL(KUidContactFieldLocality,aTown);
       
   954 	}
       
   955 
       
   956 void CTestContact::SetCountyL(const TDesC& aCounty)
       
   957 	{
       
   958 	SetTextFieldL(KUidContactFieldRegion,aCounty);
       
   959 	}
       
   960 
       
   961 void CTestContact::SetPostCodeL(const TDesC& aPostCode)
       
   962 	{
       
   963 	SetTextFieldL(KUidContactFieldPostcode,aPostCode);
       
   964 	}
       
   965 
       
   966 void CTestContact::SetCountryL(const TDesC& aCountry)
       
   967 	{
       
   968 	SetTextFieldL(KUidContactFieldCountry,aCountry);
       
   969 	}
       
   970 
       
   971 void CTestContact::SetNotesL(const TDesC& aNotes)
       
   972 	{
       
   973 	SetTextFieldL(KUidContactFieldNote,aNotes);
       
   974 	}
       
   975 
       
   976 void CTestContact::SetIMAddressL(const TDesC& aIMAddress, TUid aAddOnContentType)
       
   977 	{
       
   978 	SetTextFieldL(KUidContactFieldIMAddress, aIMAddress, aAddOnContentType);
       
   979 	}
       
   980 
       
   981 void CTestContact::InsertTextFieldL(TFieldType aID, const TDesC& aStringOfStuff )
       
   982 	{
       
   983 	CContactItemField* itemFieldPtr = NULL;
       
   984 	CContactTextField* textStoragePtr = NULL;
       
   985 
       
   986 	itemFieldPtr = CContactItemField::NewLC( KStorageTypeText, aID );
       
   987 	textStoragePtr = itemFieldPtr->TextStorage(); // we don't have ownership here, hence no stack.
       
   988 
       
   989 	textStoragePtr->SetTextL( aStringOfStuff );
       
   990 	textStoragePtr = NULL; // we've finished with this ptr now.
       
   991 
       
   992 	iContactItem->AddFieldL( *itemFieldPtr ); // hand ownership over here
       
   993 	CleanupStack::Pop( itemFieldPtr ); // and pop,
       
   994 	}
       
   995 
       
   996 void CTestContact::SetVoiceDialL(const TDesC& aVoiceDial)
       
   997 	{
       
   998 	SetTextFieldL( KUidContactsVoiceDialField, aVoiceDial );
       
   999 	}
       
  1000 
       
  1001 void CTestContact::SetRingToneL(const TDesC& aRingTone)
       
  1002 	{
       
  1003 	SetTextFieldL( KUidContactFieldRingTone, aRingTone );
       
  1004 	}
       
  1005 
       
  1006 const TPtrC CTestContact::TextFieldL(TFieldType aFieldType) const
       
  1007 	{
       
  1008 	CContactItemField& field=FindFieldL(aFieldType);
       
  1009 	ASSERT(field.StorageType()==KStorageTypeText);
       
  1010 	return STATIC_CAST(CContactTextField*,field.Storage())->Text();
       
  1011 	}
       
  1012 
       
  1013 const TPtrC CTestContact::TextFieldL(const CContentType& aTypesToMatch) const
       
  1014 	{
       
  1015 	CContactItemField& field=FindFieldL(aTypesToMatch);
       
  1016 	ASSERT(field.StorageType()==KStorageTypeText);
       
  1017 	return STATIC_CAST(CContactTextField*,field.Storage())->Text();
       
  1018 	}
       
  1019 
       
  1020 // CHANGE, the original SetTextFieldL is const ?!
       
  1021 // ----- Seems really daft since even the very name of the function
       
  1022 // ----- implies that it's modifying data... "SetXXXXX"
       
  1023 void CTestContact::SetTextFieldL(TFieldType aFieldType,const TDesC& aText)
       
  1024 	{
       
  1025 	CContactItemFieldSet& fields = iContactItem->CardFields();
       
  1026 	TInt fieldIndex = 0;
       
  1027 
       
  1028 	fieldIndex = FindField( aFieldType );
       
  1029 
       
  1030 	if ( fieldIndex > KErrNotFound )
       
  1031 		{
       
  1032 		CContactItemField& field = fields[ fieldIndex ];
       
  1033 		ASSERT(field.StorageType()==KStorageTypeText);
       
  1034 		STATIC_CAST(CContactTextField*,field.Storage())->SetText(aText.AllocL());
       
  1035 		}
       
  1036 	else
       
  1037 		{
       
  1038 		InsertTextFieldL(aFieldType, aText);
       
  1039 		}
       
  1040 	}
       
  1041 
       
  1042 void CTestContact::SetTextFieldL(const CContentType& aTypesToMatch,const TDesC& aText) const
       
  1043 	{
       
  1044 	CContactItemField& field=FindFieldL(aTypesToMatch);
       
  1045 	ASSERT(field.StorageType()==KStorageTypeText);
       
  1046 	STATIC_CAST(CContactTextField*,field.Storage())->SetText(aText.AllocL());
       
  1047 	}
       
  1048 
       
  1049 void CTestContact::SetTextFieldL(TFieldType aFieldType, const TDesC& aText, TUid aAddOnContentType) 
       
  1050 	{
       
  1051 	CContactItemFieldSet& fields = iContactItem->CardFields();
       
  1052 	CContactTextField* textField = NULL;
       
  1053 	TInt fieldIndex = 0;
       
  1054 
       
  1055 	fieldIndex = FindField( aFieldType );
       
  1056 
       
  1057 	if (fieldIndex == KErrNotFound )
       
  1058 		{
       
  1059 		InsertTextFieldL( aFieldType, aText );
       
  1060 		fieldIndex = FindField( aFieldType );
       
  1061 		CContactItemField& field = fields[ fieldIndex ];
       
  1062 		field.AddFieldTypeL( aAddOnContentType );
       
  1063 		}
       
  1064 	else if (fieldIndex >= KErrNone )
       
  1065 		{
       
  1066 		
       
  1067 		CContactItemField& field = fields[ fieldIndex ];
       
  1068 		ASSERT(field.StorageType()==KStorageTypeText);
       
  1069 		textField = static_cast<CContactTextField*>(field.Storage());
       
  1070 		textField->SetText( aText.AllocL() );
       
  1071 		field.AddFieldTypeL( aAddOnContentType );
       
  1072 		}
       
  1073 	}
       
  1074 
       
  1075 CContactItemField& CTestContact::FindFieldL(TFieldType aFieldType) const
       
  1076 	{
       
  1077 	CContactItemFieldSet& fields=iContactItem->CardFields();
       
  1078 	TInt index=fields.Find(aFieldType);
       
  1079 	User::LeaveIfError(index);
       
  1080 	return fields[index];
       
  1081 	}
       
  1082 
       
  1083 TInt CTestContact::FindField(TFieldType aFieldType) const
       
  1084 	{
       
  1085 	return iContactItem->CardFields().Find( aFieldType );
       
  1086 	}
       
  1087 
       
  1088 CContactItemField& CTestContact::FindFieldL(const CContentType& aTypesToMatch) const
       
  1089 	{
       
  1090 	CContactItemFieldSet& fields=iContactItem->CardFields();
       
  1091 	const TInt numTypesToMatch(aTypesToMatch.FieldTypeCount());
       
  1092 	const TFieldType mainFieldType(aTypesToMatch.FieldType(0));
       
  1093 	TInt index=-1;
       
  1094 	FOREVER
       
  1095 		{
       
  1096 		index=fields.FindNext(mainFieldType,index+1);
       
  1097 		User::LeaveIfError(index);
       
  1098 
       
  1099 		CContactItemField& thisPhoneField=fields[index];
       
  1100 		const CContentType& thisPhoneFieldTypes=thisPhoneField.ContentType();
       
  1101 		const TInt numFieldTypes(thisPhoneFieldTypes.FieldTypeCount());
       
  1102 
       
  1103 		if (numFieldTypes!=numTypesToMatch)
       
  1104 			{
       
  1105 			continue;
       
  1106 			}
       
  1107 
       
  1108 		TInt numTypesLeftToMatch=numTypesToMatch;
       
  1109 		for (TInt ii=0;ii<numFieldTypes;++ii)
       
  1110 			{
       
  1111 			TFieldType thisFieldType(thisPhoneFieldTypes.FieldType(ii));
       
  1112 			for (TInt jj=0;jj<numTypesToMatch;++jj)
       
  1113 				{
       
  1114 				TFieldType thisFieldTypeToMatch(aTypesToMatch.FieldType(jj));
       
  1115 				if (thisFieldType==thisFieldTypeToMatch)
       
  1116 					{
       
  1117 					if (--numTypesLeftToMatch<=0)
       
  1118 						{
       
  1119 						return thisPhoneField;
       
  1120 						}
       
  1121 
       
  1122 					break;
       
  1123 					}
       
  1124 				}
       
  1125 			}
       
  1126 		}
       
  1127 	}
       
  1128 
       
  1129 MRandomWordGenerator::~MRandomWordGenerator()
       
  1130 	{}
       
  1131 
       
  1132 //
       
  1133 // Class that consumes Database events up to a timeout period.
       
  1134 // At timeout it calls back to a parent class.
       
  1135 // Timer is reset each time a database event is received.
       
  1136 CEventConsumer* CEventConsumer::NewL(CContactDatabase& aDb,TCallBack aCallBack, TTimeIntervalMicroSeconds32 aEventTimeoutInterval)
       
  1137 	{
       
  1138 	CEventConsumer* self = new (ELeave) CEventConsumer(aCallBack,aEventTimeoutInterval);
       
  1139 	CleanupStack::PushL(self);
       
  1140 	self->ConstructL(aDb);
       
  1141 	CleanupStack::Pop(self);
       
  1142 	return self;
       
  1143 	}
       
  1144 
       
  1145 // From MContactDbObserver - Ignores/consumes the event.
       
  1146 void CEventConsumer::HandleDatabaseEventL(TContactDbObserverEvent /*aEvent*/)
       
  1147 	{
       
  1148 	// Timer base class cancel actually cancels the timer
       
  1149 	Cancel();
       
  1150 	// Start the timer again
       
  1151 	After(iEventTimeoutInterval);
       
  1152 	}
       
  1153 
       
  1154 CEventConsumer::CEventConsumer(TCallBack aCallBack, TTimeIntervalMicroSeconds32 aEventTimeoutInterval) : CTimer(EPriorityNormal), iCallBack(aCallBack), iEventTimeoutInterval(aEventTimeoutInterval)
       
  1155 	{
       
  1156 	CActiveScheduler::Add(this);
       
  1157 	}
       
  1158 
       
  1159 void CEventConsumer::RunL()
       
  1160 	{
       
  1161 	// Callback to parent on timer expiry.
       
  1162 	iCallBack.CallBack();
       
  1163 	}
       
  1164 	
       
  1165 TInt CEventConsumer::RunError(TInt aError)
       
  1166     {
       
  1167 	//Problem, RunL left
       
  1168     return aError;
       
  1169     }
       
  1170 
       
  1171 
       
  1172 void CEventConsumer::Start()
       
  1173 	{
       
  1174 	After(iEventTimeoutInterval);	
       
  1175 	}
       
  1176 
       
  1177 CEventConsumer::~CEventConsumer()
       
  1178 	{
       
  1179 	// Timer base class cancel actually cancels the timer
       
  1180 	Cancel();
       
  1181 	delete iChangeNotifier;
       
  1182 	}
       
  1183 
       
  1184 void CEventConsumer::ConstructL(CContactDatabase& aDb)
       
  1185 	{
       
  1186 	// Must call base class construction.
       
  1187 	CTimer::ConstructL();
       
  1188 	// Class enables us to be a database observer.
       
  1189 	iChangeNotifier = CContactChangeNotifier::NewL(aDb,this);
       
  1190 	}