diff -r d4f567ce2e7c -r 5b6f26637ad3 phonebookengines_old/contactsmodel/tsrc/t_utils2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines_old/contactsmodel/tsrc/t_utils2.cpp Tue Aug 31 15:05:21 2010 +0300 @@ -0,0 +1,1190 @@ +// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include +#include +#include +#include +#include +#include "t_utils2.h" +#include +#include +#include +// +// Constants. +// + +_LIT(KNewLine,"\n"); +_LIT(KBackSpace,"\x08"); +_LIT(KVisualCounterFormat,"%S%d"); +_LIT8(KUnicodeStartFile,"\xFF\xFE"); +_LIT8(KUnicodeLineEnd,"\x0D\x00\x0a\x00"); +const TInt KMaxLogLength=0x100; + + + + +// +// CLog. +// + +CLog* CLog::NewL(RTest& aTest,const TDesC& aLogFileName) + { + CLog* self=new(ELeave) CLog(aTest,aLogFileName); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); // self. + return self; + } + +CLog::CLog(RTest& aTest,const TDesC& aLogFileName) + : iTest(aTest),iLogFileName(aLogFileName),iVisualCounter(-1) + { + } + +CLog::~CLog() + { + iLogFile.Close(); + delete iFileRegister; + } + +void CLog::ConstructL() + { + iFileRegister = CTestRegister::NewLC(); + CleanupStack::Pop(iFileRegister); + + iFileRegister->CreateLogFileLC(iLogFile, iLogFileName); + User::LeaveIfError(iLogFile.Write(KUnicodeStartFile)); + CleanupStack::Pop(&iLogFile); // This file stays open + } + +void CLog::Log(TRefByValue aFmt,...) + { + VA_LIST list; + VA_START(list,aFmt); + TBuf buf; + buf.FormatList(aFmt,list); + + iLogFile.Write(TPtrC8((TUint8 *)buf.Ptr(),buf.Size())); + iLogFile.Flush(); + iTest.Printf(buf); + } + +void CLog::LogLine(TRefByValue aFmt,...) + { + VA_LIST list; + VA_START(list,aFmt); + TBuf buf; + buf.FormatList(aFmt,list); + + iLogFile.Write(TPtrC8((TUint8 *)buf.Ptr(),buf.Size())); + iLogFile.Write(KUnicodeLineEnd); + iLogFile.Flush(); + buf.Append(KNewLine); + iTest.Printf(buf); + } + +void CLog::LogLineNoEcho(TRefByValue aFmt,...) + { + VA_LIST list; + VA_START(list,aFmt); + TBuf buf; + buf.FormatList(aFmt,list); + + iLogFile.Write(TPtrC8((TUint8 *)buf.Ptr(),buf.Size())); + iLogFile.Write(KUnicodeLineEnd); + iLogFile.Flush(); + } + +void CLog::WriteLogToCommPortL() + { + iLogFile.Close(); + iFileRegister->OpenLogFileLC(iLogFile, iLogFileName); + CleanupStack::Pop(&iLogFile); + TInt pos=2; + iLogFile.Seek(ESeekStart,pos); // Ignore Unicode header. + TBuf line; + while (ReadLogLineL(line)) + { + RDebug::Print(line); + } + } + +TBool CLog::ReadLogLineL(TDes& aLine) + { + TBuf8<2> character=_L8(" "); + TBuf8<4> lineEndTestBuf=_L8(" "); + + aLine.SetLength(0); + while (lineEndTestBuf!=KUnicodeLineEnd) + { + User::LeaveIfError(iLogFile.Read(character,2)); + if (character.Length()>0) + { + lineEndTestBuf[0]=lineEndTestBuf[2]; + lineEndTestBuf[1]=lineEndTestBuf[3]; + lineEndTestBuf[2]=character[0]; + lineEndTestBuf[3]=character[1]; + + const TPtrC16 widePtr((TUint16*)character.Ptr(),1); + aLine.Append(widePtr); + } + else + { + return EFalse; + } + } + + aLine=aLine.Left(aLine.Length()-2); // Strip off \n\r. + return ETrue; + } + +void CLog::IncVisualCounter() + { + TBuf<8> backSpaceBuf; + + if (iVisualCounter>=0) + { + TInt numDigits=1; + TInt divisor=10; + + FOREVER + { + if (iVisualCounter/divisor>0) + { + divisor*=10; + ++numDigits; + } + else + { + break; + } + } + + for (TInt ii=0;iiConstructL(); + CleanupStack::Pop(); // self. + return self; + } + +/** Takes ownership of the args. If this Leaves the args will be deleted. Args can be duplicates + If aCompany is NULL, this uses aLastname to generate company names. + If aLastname is NULL, this uses aFirstname to generate last names (and, potentially, company names as well) */ +CRandomContactGenerator* CRandomContactGenerator::NewL(MRandomWordGenerator* aFirstname, MRandomWordGenerator* aLastname, MRandomWordGenerator* aCompany ) + { + CRandomContactGenerator* self=new(ELeave) CRandomContactGenerator(aFirstname, aLastname, aCompany); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); // self. + return self; + } + +void CRandomContactGenerator::ConstructL() + {} + + +void CRandomContactGenerator::SetDbL(CContactDatabase& aDb) + { + iDb=&aDb; + iTemplate=STATIC_CAST(CContactTemplate*,iDb->ReadContactL(iDb->TemplateId())); + } + +TPtrC CRandomContactGenerator::PhoneMatch() const + { + return TPtrC(iPhoneMatch); + } + +TPtrC CRandomContactGenerator::NameMatch() const + { + return TPtrC(iNameMatch); + } + +TPtrC CRandomContactGenerator::EmailMatch() const + { + return TPtrC(iEmailMatch); + } + +void CRandomContactGenerator::SetRandomWordL(TDes& aBuf, TInt32 aType ) + { + MRandomWordGenerator* word = iFirstName; + TInt len = 16; + switch (aType) + { + case KUidContactFieldFamilyNameValue: + case KUidContactFieldFamilyNamePronunciationValue: + word = iLastName; + break; + case KUidContactFieldCompanyNameValue: + case KUidContactFieldCompanyNamePronunciationValue: + word = iCoName; + break; + case KUidContactFieldEMailValue: + len = 32; + break; + } + if(!word) + { + SetRandomAlphaString(aBuf,len); + return; + } + aBuf = *word->WordLC(); + CleanupStack::PopAndDestroy(); + + // the following are to make these look a bite more realistic + if(aType==KUidContactFieldEMailValue) + { + aBuf.Append('@'); + aBuf.Append(*word->WordLC()); + CleanupStack::PopAndDestroy(); + aBuf.Append(_L(".co.uk")); + } + if((aType==KUidContactFieldCompanyNameValue || aType==KUidContactFieldCompanyNamePronunciationValue) + && word==iLastName) + { + aBuf.Append(' '); + aBuf.Append(*word->WordLC()); + CleanupStack::PopAndDestroy(); + aBuf.Append(_L(" Ltd.")); + } + } + +TContactItemId CRandomContactGenerator::AddTypicalRandomContactL() + { + CTestContact* contact=CTestContact::NewLC(*iTemplate); + HBufC* buf=HBufC::NewLC(64); + TPtr bufPtr=buf->Des(); + SetRandomWordL(bufPtr,KUidContactFieldGivenNameValue); + contact->SetFirstNameL(bufPtr); + iNameMatch=bufPtr; + SetRandomWordL(bufPtr,KUidContactFieldFamilyNameValue); + contact->SetLastNameL(bufPtr); + SetRandomWordL(bufPtr,KUidContactFieldCompanyNameValue); + contact->SetCompanyNameL(bufPtr); + SetRandomNumericString(bufPtr,16); + contact->SetWorkPhoneL(bufPtr); + iPhoneMatch=bufPtr; + SetRandomNumericString(bufPtr,16); + contact->SetWorkMobileL(bufPtr); + SetRandomNumericString(bufPtr,16); + contact->SetHomePhoneL(bufPtr); + SetRandomWordL(bufPtr,KUidContactFieldEMailValue); + contact->SetWorkEmailAddressL(bufPtr); + iEmailMatch=bufPtr; + + TContactItemId id = iDb->AddNewContactL(contact->ContactItem()); + CleanupStack::PopAndDestroy(2); // buf, contact. + return id; + } + +TContactItemId CRandomContactGenerator::AddTypicalRandomContactWithNamesL(const RArray& iNames, TBool aWithMapping) + { + CTestContact* contact=CTestContact::NewLC(*iTemplate); + HBufC* buf=HBufC::NewLC(64); + TPtr bufPtr=buf->Des(); + TInt i; + for(i=iNames.Count()-1;i>=0;i--) + { + SetRandomWordL(bufPtr,iNames[i]); + if(!aWithMapping ) + { + contact->SetTextFieldL(TUid::Uid(iNames[i]),bufPtr); + } + else + { + switch (iNames[i]) + { + case KUidContactFieldCompanyNameValue: + contact->SetCompanyNameL(bufPtr); + break; + case KUidContactFieldCompanyNamePronunciationValue: + contact->SetCompanyNameL(bufPtr, ETrue); + break; + case KUidContactFieldGivenNameValue: + contact->SetFirstNameL(bufPtr); + break; + case KUidContactFieldGivenNamePronunciationValue: + contact->SetFirstNameL(bufPtr, ETrue); + break; + case KUidContactFieldFamilyNameValue: + contact->SetLastNameL(bufPtr); + break; + case KUidContactFieldFamilyNamePronunciationValue: + contact->SetLastNameL(bufPtr, ETrue); + break; + default: + contact->SetTextFieldL(TUid::Uid(iNames[i]),bufPtr); + } + } + iNameMatch=bufPtr; + } + + SetRandomNumericString(bufPtr,16); + contact->SetWorkPhoneL(bufPtr); + iPhoneMatch=bufPtr; + SetRandomNumericString(bufPtr,16); + contact->SetWorkMobileL(bufPtr); + SetRandomNumericString(bufPtr,16); + contact->SetHomePhoneL(bufPtr); + SetRandomWordL(bufPtr,KUidContactFieldEMailValue); + contact->SetWorkEmailAddressL(bufPtr); + iEmailMatch=bufPtr; + + TContactItemId id = iDb->AddNewContactL(contact->ContactItem()); + CleanupStack::PopAndDestroy(2); // buf, contact. + return id; + } + +void CRandomContactGenerator::AddAtypicalRandomContactL() + { + CTestContact* contact=CTestContact::NewLC(*iTemplate); + HBufC* buf=HBufC::NewLC(256); + TPtr bufPtr=buf->Des(); + SetRandomAlphaString(bufPtr,32); + contact->SetFirstNameL(bufPtr); + SetRandomAlphaString(bufPtr,32); + contact->SetLastNameL(bufPtr); + SetRandomAlphaString(bufPtr,32); + contact->SetCompanyNameL(bufPtr); + SetRandomAlphaString(bufPtr,32); + contact->SetJobTitleL(bufPtr); + SetRandomNumericString(bufPtr,24); + contact->SetWorkPhoneL(bufPtr); + SetRandomNumericString(bufPtr,24); + contact->SetWorkMobileL(bufPtr); + SetRandomNumericString(bufPtr,24); + contact->SetHomePhoneL(bufPtr); + SetRandomNumericString(bufPtr,24); + contact->SetHomeMobileL(bufPtr); + SetRandomNumericString(bufPtr,24); + contact->SetFaxL(bufPtr); + SetRandomAlphaNumericString(bufPtr,48); + contact->SetWorkEmailAddressL(bufPtr); + SetRandomAlphaNumericString(bufPtr,48); + contact->SetInternetAddressL(bufPtr); + SetRandomAlphaNumericString(bufPtr,32); + contact->SetStreetL(bufPtr); + SetRandomAlphaString(bufPtr,32); + contact->SetTownL(bufPtr); + SetRandomAlphaString(bufPtr,32); + contact->SetCountyL(bufPtr); + SetRandomAlphaNumericString(bufPtr,16); + contact->SetPostCodeL(bufPtr); + SetRandomAlphaString(bufPtr,32); + contact->SetCountryL(bufPtr); + SetRandomAlphaNumericString(bufPtr,256); + contact->SetNotesL(bufPtr); + + iDb->AddNewContactL(contact->ContactItem()); + CleanupStack::PopAndDestroy(2); // buf, contact. + } + +TContactItemId CRandomContactGenerator::AddTypicalContactForFilterL(TInt aBitWiseFilter, TInt& aLeaveCode) + { + TContactItemId retval = 0; + CTestContact* contact=CTestContact::NewLC(*iTemplate); + HBufC* buf=HBufC::NewLC(32); + TPtr bufPtr=buf->Des(); + SetRandomAlphaString(bufPtr,16); + contact->SetFirstNameL(bufPtr); + SetRandomAlphaString(bufPtr,16); + contact->SetLastNameL(bufPtr); + SetRandomAlphaString(bufPtr,16); + contact->SetCompanyNameL(bufPtr); + + if(aBitWiseFilter&CContactDatabase::ELandLine) + { + SetRandomNumericString(bufPtr,16); + contact->SetWorkPhoneL(bufPtr); + } + if(aBitWiseFilter&CContactDatabase::ESmsable) + { + SetRandomNumericString(bufPtr,16); + contact->SetWorkMobileL(bufPtr); + } + if(aBitWiseFilter&CContactDatabase::EMailable) + { + SetRandomAlphaNumericString(bufPtr,32); + if (aBitWiseFilter&CContactDatabase::EHome) + contact->SetHomeEmailAddressL(bufPtr); + else + contact->SetWorkEmailAddressL(bufPtr); + } + if(aBitWiseFilter&CContactDatabase::EFaxable) + { + SetRandomNumericString(bufPtr,16); + contact->SetFaxL(bufPtr); + } + + + TRAP( aLeaveCode, { retval = iDb->AddNewContactL(contact->ContactItem()); } ); + CleanupStack::PopAndDestroy(2); // buf, contact. + return retval; + } + +TContactItemId CRandomContactGenerator::AddTypicalContactForFilterL(TInt aBitWiseFilter) + { + TUid fakeUid = TUid::Null(); + return AddTypicalContactForFilterL(aBitWiseFilter, fakeUid); + } + +TContactItemId CRandomContactGenerator::AddTypicalContactForFilterL(TInt aBitWiseFilter, TUid aIMProtocol) + { + CTestContact* contact=CTestContact::NewLC(*iTemplate); + HBufC* buf=HBufC::NewLC(32); + TPtr bufPtr=buf->Des(); + SetRandomAlphaString(bufPtr,16); + contact->SetFirstNameL(bufPtr); + SetRandomAlphaString(bufPtr,16); + contact->SetLastNameL(bufPtr); + SetRandomAlphaString(bufPtr,16); + contact->SetCompanyNameL(bufPtr); + + if(aBitWiseFilter&CContactDatabase::ELandLine) + { + SetRandomNumericString(bufPtr,16); + contact->SetWorkPhoneL(bufPtr); + } + if(aBitWiseFilter&CContactDatabase::ESmsable) + { + SetRandomNumericString(bufPtr,16); + contact->SetWorkMobileL(bufPtr); + } + if(aBitWiseFilter&CContactDatabase::EMailable) + { + SetRandomAlphaNumericString(bufPtr,32); + if (aBitWiseFilter&CContactDatabase::EHome) + contact->SetHomeEmailAddressL(bufPtr); + else + contact->SetWorkEmailAddressL(bufPtr); + } + if(aBitWiseFilter&CContactDatabase::EFaxable) + { + SetRandomNumericString(bufPtr,16); + contact->SetFaxL(bufPtr); + } + + if(aBitWiseFilter&CContactDatabase::ERingTone) + { + SetRandomNumericString(bufPtr,16); + contact->SetRingToneL(bufPtr); + } + if(aBitWiseFilter&CContactDatabase::EVoiceDial) + { + SetRandomNumericString(bufPtr,16); + contact->SetVoiceDialL(bufPtr); + } + + if(aBitWiseFilter&CContactDatabase::EWirelessVillage) + { + SetRandomNumericString(bufPtr,16); + contact->SetIMAddressL(bufPtr, aIMProtocol); + } + + TContactItemId id = iDb->AddNewContactL(contact->ContactItem()); + CleanupStack::PopAndDestroy(2); // buf, contact. + return id; + } + + +TContactItemId CRandomContactGenerator::AddTypicalContactForLocalViewPreferencesL(TContactViewPreferences aContactTypes) + { + CTestContact* contact=CTestContact::NewLC(*iTemplate); + HBufC* buf=HBufC::NewLC(32); + TPtr bufPtr=buf->Des(); + + if(aContactTypes&EUnSortedAtBeginning || aContactTypes&EUnSortedAtEnd) + { + SetRandomNumericString(bufPtr,16); + contact->SetWorkPhoneL(bufPtr); + } + + if(aContactTypes&ESingleWhiteSpaceIsEmptyField) + { + contact->SetFirstNameL(_L(" ")); + contact->SetCompanyNameL(_L(" ")); + + SetRandomAlphaString(bufPtr,16); + contact->SetLastNameL(bufPtr); + + SetRandomNumericString(bufPtr,16); + contact->SetWorkPhoneL(bufPtr); + } + + + TContactItemId newId = iDb->AddNewContactL(contact->ContactItem()); + CleanupStack::PopAndDestroy(2); // buf, contact. + return newId; + } + +void CRandomContactGenerator::SetRandomAlphaString(TDes& aBuf,TInt aLength) + { + aBuf.SetLength(aLength); + + for (TInt ii=0;ii=aLowerBound && charCode<=aUpperBound); + return charCode; + } + + +// +// CContactNameGenerator. +// +/* +CContactNameGenerator* CContactNameGenerator::NewL(RTest& aTest,CLog& aLog) + { + CContactNameGenerator* self=new(ELeave) CContactNameGenerator(aTest,aLog); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); // self. + return self; + } + +CContactNameGenerator::CContactNameGenerator(RTest& aTest,CLog& aLog) + : iTest(aTest),iLog(aLog) + { + } + +CContactNameGenerator::~CContactNameGenerator() + { + } + +void CContactNameGenerator::ConstructL() + { + } + +void CContactNameGenerator::SetDbL(CContactDatabase& aDb) + { + iDb=&aDb; + iTemplate=STATIC_CAST(CContactTemplate*,iDb->ReadContactL(iDb->TemplateId())); + } +*/ + +// +// CTestContact. +// + +CTestContact* CTestContact::NewL(CContactItem& aSeedContact) + { + CTestContact* self=CTestContact::NewLC(aSeedContact); + CleanupStack::Pop(); + return self; + } + +CTestContact* CTestContact::NewLC(CContactItem& aSeedContact) + { + CTestContact* self=new(ELeave) CTestContact(); + CleanupStack::PushL(self); + self->ConstructL(aSeedContact); + return self; + } + +CTestContact::CTestContact() + { + } + +void CTestContact::ConstructL(CContactItem& aSeedContact) + { + iContactItem=CContactCard::NewL(&aSeedContact); + } + +CTestContact::~CTestContact() + { + delete iContactItem; + } + +CContactItem& CTestContact::ContactItem() + { + return *iContactItem; + } + +const TPtrC CTestContact::FirstNameL() + { + return TextFieldL(KUidContactFieldGivenName); + } + +const TPtrC CTestContact::LastNameL() + { + return TextFieldL(KUidContactFieldFamilyName); + } + +const TPtrC CTestContact::CompanyNameL() + { + return TextFieldL(KUidContactFieldCompanyName); + } + +const TPtrC CTestContact::JobTitleL() + { + return TextFieldL(KUidContactFieldJobTitle); + } + +const TPtrC CTestContact::WorkPhoneL() + { + CContentType* contentType=CContentType::NewL(); + CleanupStack::PushL(contentType); + contentType->AddFieldTypeL(KUidContactFieldPhoneNumber); + contentType->AddFieldTypeL(KUidContactFieldVCardMapWORK); + contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE); + const TPtrC text=TextFieldL(*contentType); + CleanupStack::PopAndDestroy(); // contentType. + return text; + } + +const TPtrC CTestContact::WorkMobileL() + { + CContentType* contentType=CContentType::NewL(); + CleanupStack::PushL(contentType); + contentType->AddFieldTypeL(KUidContactFieldPhoneNumber); + contentType->AddFieldTypeL(KUidContactFieldVCardMapWORK); + contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE); + contentType->AddFieldTypeL(KUidContactFieldVCardMapCELL); + const TPtrC text=TextFieldL(*contentType); + CleanupStack::PopAndDestroy(); // contentType. + return text; + } + +const TPtrC CTestContact::HomePhoneL() + { + CContentType* contentType=CContentType::NewL(); + CleanupStack::PushL(contentType); + contentType->AddFieldTypeL(KUidContactFieldPhoneNumber); + contentType->AddFieldTypeL(KUidContactFieldVCardMapHOME); + contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE); + const TPtrC text=TextFieldL(*contentType); + CleanupStack::PopAndDestroy(); // contentType. + return text; + } + +const TPtrC CTestContact::HomeMobileL() + { + CContentType* contentType=CContentType::NewL(); + CleanupStack::PushL(contentType); + contentType->AddFieldTypeL(KUidContactFieldPhoneNumber); + contentType->AddFieldTypeL(KUidContactFieldVCardMapHOME); + contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE); + contentType->AddFieldTypeL(KUidContactFieldVCardMapCELL); + const TPtrC text=TextFieldL(*contentType); + CleanupStack::PopAndDestroy(); // contentType. + return text; + } + +const TPtrC CTestContact::FaxL() + { + return TextFieldL(KUidContactFieldFax); + } + +const TPtrC CTestContact::EmailAddressL() + { + return TextFieldL(KUidContactFieldEMail); + } + +const TPtrC CTestContact::InternetAddressL() + { + return TextFieldL(KUidContactFieldUrl); + } + +const TPtrC CTestContact::StreetL() + { + return TextFieldL(KUidContactFieldAddress); + } + +const TPtrC CTestContact::TownL() + { + return TextFieldL(KUidContactFieldLocality); + } + +const TPtrC CTestContact::CountyL() + { + return TextFieldL(KUidContactFieldRegion); + } + +const TPtrC CTestContact::PostCodeL() + { + return TextFieldL(KUidContactFieldPostcode); + } + +const TPtrC CTestContact::CountryL() + { + return TextFieldL(KUidContactFieldCountry); + } + +const TPtrC CTestContact::NotesL() + { + return TextFieldL(KUidContactFieldNote); + } + +void CTestContact::SetFirstNameL(const TDesC& aFirstName, TBool aIsPronunciation) + { + const TUid id = aIsPronunciation ? KUidContactFieldGivenNamePronunciation : KUidContactFieldGivenName; + SetTextFieldL(id,aFirstName, KUidContactFieldVCardMapUnusedN); + } + +void CTestContact::SetLastNameL(const TDesC& aLastName, TBool aIsPronunciation) + { + const TUid id = aIsPronunciation ? KUidContactFieldFamilyNamePronunciation : KUidContactFieldFamilyName; + SetTextFieldL(id,aLastName, KUidContactFieldVCardMapUnusedN); + } + +void CTestContact::SetCompanyNameL(const TDesC& aCompanyName, TBool aIsPronunciation) + { + if ( aIsPronunciation ) + SetTextFieldL(KUidContactFieldCompanyNamePronunciation,aCompanyName, KUidContactFieldVCardMapORGPronunciation); + else + SetTextFieldL(KUidContactFieldCompanyName,aCompanyName, KUidContactFieldVCardMapORG); + } + +void CTestContact::SetJobTitleL(const TDesC& aJobTitle) + { + SetTextFieldL(KUidContactFieldJobTitle,aJobTitle); + } + +void CTestContact::SetWorkPhoneL(const TDesC& aWorkPhone) + { + CContentType* contentType=CContentType::NewL(); + CleanupStack::PushL(contentType); + contentType->AddFieldTypeL(KUidContactFieldPhoneNumber); + contentType->AddFieldTypeL(KUidContactFieldVCardMapWORK); + contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE); + SetTextFieldL(*contentType,aWorkPhone); + CleanupStack::PopAndDestroy(); // contentType. + } + +void CTestContact::SetWorkMobileL(const TDesC& aWorkMobile) + { + CContentType* contentType=CContentType::NewL(); + CleanupStack::PushL(contentType); + contentType->AddFieldTypeL(KUidContactFieldPhoneNumber); + contentType->AddFieldTypeL(KUidContactFieldVCardMapWORK); + contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE); + contentType->AddFieldTypeL(KUidContactFieldVCardMapCELL); + SetTextFieldL(*contentType,aWorkMobile); + CleanupStack::PopAndDestroy(); // contentType. + } + +void CTestContact::SetHomePhoneL(const TDesC& aHomePhone) + { + CContentType* contentType=CContentType::NewL(); + CleanupStack::PushL(contentType); + contentType->AddFieldTypeL(KUidContactFieldPhoneNumber); + contentType->AddFieldTypeL(KUidContactFieldVCardMapHOME); + contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE); + SetTextFieldL(*contentType,aHomePhone); + CleanupStack::PopAndDestroy(); // contentType. + } + +void CTestContact::SetHomeMobileL(const TDesC& aHomeMobile) + { + CContentType* contentType=CContentType::NewL(); + CleanupStack::PushL(contentType); + contentType->AddFieldTypeL(KUidContactFieldPhoneNumber); + contentType->AddFieldTypeL(KUidContactFieldVCardMapHOME); + contentType->AddFieldTypeL(KUidContactFieldVCardMapVOICE); + contentType->AddFieldTypeL(KUidContactFieldVCardMapCELL); + SetTextFieldL(*contentType,aHomeMobile); + CleanupStack::PopAndDestroy(); // contentType. + } + +void CTestContact::SetFaxL(const TDesC& aFax) + { + SetTextFieldL(KUidContactFieldFax,aFax); + } + +void CTestContact::SetHomeEmailAddressL(const TDesC& aEmailAddress) + { + CContentType* contentType=CContentType::NewL(); + CleanupStack::PushL(contentType); + contentType->AddFieldTypeL(KUidContactFieldEMail); + contentType->AddFieldTypeL(KUidContactFieldVCardMapHOME); + SetTextFieldL(*contentType,aEmailAddress); + CleanupStack::PopAndDestroy(contentType); + } + +void CTestContact::SetWorkEmailAddressL(const TDesC& aEmailAddress) + { + CContentType* contentType=CContentType::NewL(); + CleanupStack::PushL(contentType); + contentType->AddFieldTypeL(KUidContactFieldEMail); + contentType->AddFieldTypeL(KUidContactFieldVCardMapWORK); + SetTextFieldL(*contentType,aEmailAddress); + CleanupStack::PopAndDestroy(contentType); + } + + +void CTestContact::SetInternetAddressL(const TDesC& aInternetAddress) + { + SetTextFieldL(KUidContactFieldUrl,aInternetAddress); + } + +void CTestContact::SetStreetL(const TDesC& aStreet) + { + SetTextFieldL(KUidContactFieldAddress,aStreet); + } + +void CTestContact::SetTownL(const TDesC& aTown) + { + SetTextFieldL(KUidContactFieldLocality,aTown); + } + +void CTestContact::SetCountyL(const TDesC& aCounty) + { + SetTextFieldL(KUidContactFieldRegion,aCounty); + } + +void CTestContact::SetPostCodeL(const TDesC& aPostCode) + { + SetTextFieldL(KUidContactFieldPostcode,aPostCode); + } + +void CTestContact::SetCountryL(const TDesC& aCountry) + { + SetTextFieldL(KUidContactFieldCountry,aCountry); + } + +void CTestContact::SetNotesL(const TDesC& aNotes) + { + SetTextFieldL(KUidContactFieldNote,aNotes); + } + +void CTestContact::SetIMAddressL(const TDesC& aIMAddress, TUid aAddOnContentType) + { + SetTextFieldL(KUidContactFieldIMAddress, aIMAddress, aAddOnContentType); + } + +void CTestContact::InsertTextFieldL(TFieldType aID, const TDesC& aStringOfStuff ) + { + CContactItemField* itemFieldPtr = NULL; + CContactTextField* textStoragePtr = NULL; + + itemFieldPtr = CContactItemField::NewLC( KStorageTypeText, aID ); + textStoragePtr = itemFieldPtr->TextStorage(); // we don't have ownership here, hence no stack. + + textStoragePtr->SetTextL( aStringOfStuff ); + textStoragePtr = NULL; // we've finished with this ptr now. + + iContactItem->AddFieldL( *itemFieldPtr ); // hand ownership over here + CleanupStack::Pop( itemFieldPtr ); // and pop, + } + +void CTestContact::SetVoiceDialL(const TDesC& aVoiceDial) + { + SetTextFieldL( KUidContactsVoiceDialField, aVoiceDial ); + } + +void CTestContact::SetRingToneL(const TDesC& aRingTone) + { + SetTextFieldL( KUidContactFieldRingTone, aRingTone ); + } + +const TPtrC CTestContact::TextFieldL(TFieldType aFieldType) const + { + CContactItemField& field=FindFieldL(aFieldType); + ASSERT(field.StorageType()==KStorageTypeText); + return STATIC_CAST(CContactTextField*,field.Storage())->Text(); + } + +const TPtrC CTestContact::TextFieldL(const CContentType& aTypesToMatch) const + { + CContactItemField& field=FindFieldL(aTypesToMatch); + ASSERT(field.StorageType()==KStorageTypeText); + return STATIC_CAST(CContactTextField*,field.Storage())->Text(); + } + +// CHANGE, the original SetTextFieldL is const ?! +// ----- Seems really daft since even the very name of the function +// ----- implies that it's modifying data... "SetXXXXX" +void CTestContact::SetTextFieldL(TFieldType aFieldType,const TDesC& aText) + { + CContactItemFieldSet& fields = iContactItem->CardFields(); + TInt fieldIndex = 0; + + fieldIndex = FindField( aFieldType ); + + if ( fieldIndex > KErrNotFound ) + { + CContactItemField& field = fields[ fieldIndex ]; + ASSERT(field.StorageType()==KStorageTypeText); + STATIC_CAST(CContactTextField*,field.Storage())->SetText(aText.AllocL()); + } + else + { + InsertTextFieldL(aFieldType, aText); + } + } + +void CTestContact::SetTextFieldL(const CContentType& aTypesToMatch,const TDesC& aText) const + { + CContactItemField& field=FindFieldL(aTypesToMatch); + ASSERT(field.StorageType()==KStorageTypeText); + STATIC_CAST(CContactTextField*,field.Storage())->SetText(aText.AllocL()); + } + +void CTestContact::SetTextFieldL(TFieldType aFieldType, const TDesC& aText, TUid aAddOnContentType) + { + CContactItemFieldSet& fields = iContactItem->CardFields(); + CContactTextField* textField = NULL; + TInt fieldIndex = 0; + + fieldIndex = FindField( aFieldType ); + + if (fieldIndex == KErrNotFound ) + { + InsertTextFieldL( aFieldType, aText ); + fieldIndex = FindField( aFieldType ); + CContactItemField& field = fields[ fieldIndex ]; + field.AddFieldTypeL( aAddOnContentType ); + } + else if (fieldIndex >= KErrNone ) + { + + CContactItemField& field = fields[ fieldIndex ]; + ASSERT(field.StorageType()==KStorageTypeText); + textField = static_cast(field.Storage()); + textField->SetText( aText.AllocL() ); + field.AddFieldTypeL( aAddOnContentType ); + } + } + +CContactItemField& CTestContact::FindFieldL(TFieldType aFieldType) const + { + CContactItemFieldSet& fields=iContactItem->CardFields(); + TInt index=fields.Find(aFieldType); + User::LeaveIfError(index); + return fields[index]; + } + +TInt CTestContact::FindField(TFieldType aFieldType) const + { + return iContactItem->CardFields().Find( aFieldType ); + } + +CContactItemField& CTestContact::FindFieldL(const CContentType& aTypesToMatch) const + { + CContactItemFieldSet& fields=iContactItem->CardFields(); + const TInt numTypesToMatch(aTypesToMatch.FieldTypeCount()); + const TFieldType mainFieldType(aTypesToMatch.FieldType(0)); + TInt index=-1; + FOREVER + { + index=fields.FindNext(mainFieldType,index+1); + User::LeaveIfError(index); + + CContactItemField& thisPhoneField=fields[index]; + const CContentType& thisPhoneFieldTypes=thisPhoneField.ContentType(); + const TInt numFieldTypes(thisPhoneFieldTypes.FieldTypeCount()); + + if (numFieldTypes!=numTypesToMatch) + { + continue; + } + + TInt numTypesLeftToMatch=numTypesToMatch; + for (TInt ii=0;iiConstructL(aDb); + CleanupStack::Pop(self); + return self; + } + +// From MContactDbObserver - Ignores/consumes the event. +void CEventConsumer::HandleDatabaseEventL(TContactDbObserverEvent /*aEvent*/) + { + // Timer base class cancel actually cancels the timer + Cancel(); + // Start the timer again + After(iEventTimeoutInterval); + } + +CEventConsumer::CEventConsumer(TCallBack aCallBack, TTimeIntervalMicroSeconds32 aEventTimeoutInterval) : CTimer(EPriorityNormal), iCallBack(aCallBack), iEventTimeoutInterval(aEventTimeoutInterval) + { + CActiveScheduler::Add(this); + } + +void CEventConsumer::RunL() + { + // Callback to parent on timer expiry. + iCallBack.CallBack(); + } + +TInt CEventConsumer::RunError(TInt aError) + { + //Problem, RunL left + return aError; + } + + +void CEventConsumer::Start() + { + After(iEventTimeoutInterval); + } + +CEventConsumer::~CEventConsumer() + { + // Timer base class cancel actually cancels the timer + Cancel(); + delete iChangeNotifier; + } + +void CEventConsumer::ConstructL(CContactDatabase& aDb) + { + // Must call base class construction. + CTimer::ConstructL(); + // Class enables us to be a database observer. + iChangeNotifier = CContactChangeNotifier::NewL(aDb,this); + }