Exemple #1
0
QContactDetail *CntTransformOrganisation::transformItemField(const CContactItemField& field, const QContact &contact)
{
    QContactOrganization *organisation = new QContactOrganization(contact.detail<QContactOrganization>());

	CContactTextField* storage = field.TextStorage();
	QString orgDetail = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length());

	for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) {
		//Company
		if (field.ContentType().FieldType(i) == KUidContactFieldCompanyName) {
            organisation->setName(orgDetail);
		}
		//Department
		else if (field.ContentType().FieldType(i) == KUidContactFieldDepartmentName) {
		    // Assume only a single department
		    QStringList departments = QStringList(orgDetail);
            organisation->setDepartment(departments);
		}
		//Job title
		else if (field.ContentType().FieldType(i) == KUidContactFieldJobTitle) {
            organisation->setTitle(orgDetail);
		}
	    //Assistant name
	    else if (field.ContentType().FieldType(i) == KUidContactFieldAssistant) {
            organisation->setAssistantName(orgDetail);
	    }
	}

	return organisation;
}
QContactDetail *CntTransformOnlineAccount::transformItemField(const CContactItemField& field, const QContact &contact)
{
    Q_UNUSED(contact);

    QContactOnlineAccount *onlineAccount = new QContactOnlineAccount();
	CContactTextField* storage = field.TextStorage();
	QString onlineAccountString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length());

	// Adding Online Account Detail.
    for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) {

        if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapVOIP)) {
            onlineAccount->setAccountUri(onlineAccountString);
            onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeSipVoip);
        }
        else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapSWIS)) {
            onlineAccount->setAccountUri(onlineAccountString);
            onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeVideoShare);
        }
        else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapSIPID)) {
            onlineAccount->setAccountUri(onlineAccountString);
            onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeSip);
        }
    }

    // set context
	for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) {
        setContexts(field.ContentType().FieldType(i), *onlineAccount);
	}

	return onlineAccount;
}
QContactDetail *CntTransformOnlineAccount::transformItemField(const CContactItemField& field, const QContact &contact)
{
    QList<QContactDetail> onlineAccounts = contact.details(QContactOnlineAccount::DefinitionName);
    TLex label(field.Label());
    int counter = -1;
    if (label.Val(counter) != KErrNone) {
        return NULL;
    }
    
    //check what online account detail the provided field belongs to. if there is no such detail yet,
    //let's create it.
    if (onlineAccounts.count() <= counter) {
        for (int i = onlineAccounts.count(); i <= counter; i++) {
            QContactOnlineAccount *account = new QContactOnlineAccount();
            QContact& currentContact = const_cast<QContact&>(contact);
            currentContact.saveDetail(account);
            delete account;
        }
        onlineAccounts = contact.details(QContactOnlineAccount::DefinitionName);
    }
    QContactOnlineAccount *onlineAccount = new QContactOnlineAccount(onlineAccounts.at(counter));

	CContactTextField* storage = field.TextStorage();
	QString onlineAccountString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length());

	// Adding Online Account Detail.
    for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) {

        //Account URI
        if (field.ContentType().ContainsFieldType(KUidContactFieldIMPP)) {
            onlineAccount->setAccountUri(onlineAccountString);
            onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeImpp);
        }
        else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapVOIP)) {
            onlineAccount->setAccountUri(onlineAccountString);
            onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeSipVoip);
        }
        else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapSWIS)) {
            onlineAccount->setAccountUri(onlineAccountString);
            onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeVideoShare);
        }
        else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapSIPID)) {
            onlineAccount->setAccountUri(onlineAccountString);
            onlineAccount->setSubTypes(QContactOnlineAccount::SubTypeSip);
        }
        //Service Provider
        else if (field.ContentType().FieldType(i) == KUidContactFieldServiceProvider) {
            onlineAccount->setServiceProvider(onlineAccountString);
        }
    }

    // set context
	for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) {
        setContexts(field.ContentType().FieldType(i), *onlineAccount);
	}

	return onlineAccount;
}
QContactDetail *CntTransformGender::transformItemField(const CContactItemField& field, const QContact &contact)
{
	Q_UNUSED(contact);

	QContactGender *gender = new QContactGender();

	CContactTextField* storage = field.TextStorage();
	QString genderInfo = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length());

	gender->setGender(genderInfo);
	return gender;
}
Exemple #5
0
QContactDetail *CntTransformNote::transformItemField(const CContactItemField& field, const QContact &contact)
{
	Q_UNUSED(contact);

	QContactNote *note = new QContactNote();

	CContactTextField* storage = field.TextStorage();
	QString noteString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length());

	note->setNote(noteString);
	return note;
}
QContactDetail *CntTransformAvatar::transformItemField(const CContactItemField& field, const QContact &contact)
{
    Q_UNUSED(contact);
    QContactAvatar *avatar = new QContactAvatar();

    if (field.ContentType().ContainsFieldType(KUidContactFieldCodImage)) {
        CContactTextField* storage = field.TextStorage();
        QString avatarString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length());
        avatar->setImageUrl(QUrl(avatarString));
    }

    return avatar;
}
Exemple #7
0
QContactDetail *CntTransformPhoneNumber::transformItemField(const CContactItemField& field, const QContact &contact)
{
	Q_UNUSED(contact);

	QContactPhoneNumber *phoneNumber = new QContactPhoneNumber();

	CContactTextField* storage = field.TextStorage();
	QString number = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length());

	phoneNumber->setNumber(number);

	if (field.ContentType().ContainsFieldType(KUidContactFieldPhoneNumber)) {
        if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapVOICE)) {
            phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeLandline);
        }
        else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapCELL)) {
            phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeMobile);
        }
        else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapPAGER)) {
            phoneNumber->setSubTypes(QContactPhoneNumber::SubTypePager);
        }
        else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapBBS)) {
            phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeBulletinBoardSystem);
        }
        else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapCAR)) {
            phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeCar);
        }
        else if (field.ContentType().Mapping() == KUidContactFieldVCardMapAssistantTel) {
            phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeAssistant);
        }
        else if (field.ContentType().ContainsFieldType(KUidContactFieldVCardMapVIDEO)) {
            phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeVideo);
        }
	}
    else if (field.ContentType().ContainsFieldType(KUidContactFieldFax)) {
        phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeFax);
    }
    else if (field.ContentType().ContainsFieldType(KUidContactFieldDTMF)) {
        phoneNumber->setSubTypes(QContactPhoneNumber::SubTypeDtmfMenu);
    }

	// set context
	for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) {
        setContexts(field.ContentType().FieldType(i), *phoneNumber);
	}

	return phoneNumber;
}
HBufC* CAgentAddressbook::ReadFieldAsTextL(const CContactItemField& itemField)
	{
	if (itemField.Storage() == NULL || !itemField.Storage()->IsFull())
		return HBufC::NewL(0);

	switch (itemField.StorageType())
		{
		case KStorageTypeText:
			{
			CContactTextField* txtField = itemField.TextStorage();
			if (txtField == NULL)
				return HBufC::NewL(0);
			return txtField->Text().AllocL();
			}
		case KStorageTypeDateTime:
			{
			CContactDateField* dateField = itemField.DateTimeStorage();
			if (dateField == NULL)
				return HBufC::NewL(0);
			TTime time = dateField->Time();
			_LIT(KFORMAT_DATE, "%D%M%Y%/0%1%/1%2%/2%3%/3");
			TBuf<30> strTime;
			time.FormatL(strTime, KFORMAT_DATE);
			return strTime.AllocL();
			}
		default:
			return HBufC::NewL(0);
		}
	}
Exemple #9
0
/** 
 * Check that the field of type aFieldType has the same content as 
 * aExpectedContent
 * @param aFieldset Contact item fieldset
 * @param aFieldType Field type to test
 * @param aExpectedContent Expected data
 */
void CheckFieldContentL(CContactItemFieldSet& aFieldset, TFieldType aFieldType, const TDesC& aExpectedContent)
	{
	TInt pos = aFieldset.Find(aFieldType);
	CContactItemField& field = aFieldset[pos];
	CContactTextField* textField = field.TextStorage();
	test(textField != NULL);
	test(textField->Text() == aExpectedContent);
	}
Exemple #10
0
/**
	Try to match the phone number given with existing numbers in the database.
*/
void CCrudOperations::MatchContactsByPhoneNumL()
{
    _LIT(KPass, "Pass");
    _LIT(KFail, "Fail");
    _LIT(KMatchOutputFormat1, "Number of phone numbers matched: %d -- %s\n");
    _LIT(KMatchOutputFormat2, "Phone number lookup took: %d s %03d\n");
    _LIT(KMatchOutputFormat3, "The contact's first name: %S\n");

    _LIT(KPhoneNumberToFind, "241867306233253164487125"); // this number belongs to the 1000th
    // contact item in the database, which
    // has a photo.

    const TInt KMatchLengthFromRight(7); // match on the number without the dialling code prefix
    // to avoid differences like +447876... and 07876...
    _LIT(KPhoneNumberTestTitle, "\nBeginning Phone Number Match testing...\n");


    iTest->Printf(KPhoneNumberTestTitle);
    TCntPerfTimer timer;
    timer.StartTimer();

    // Search the database...
    CContactIdArray* idArray = iDb->MatchPhoneNumberL(KPhoneNumberToFind, KMatchLengthFromRight);
    CleanupStack::PushL(idArray);
    TInt numMatches = idArray->Count();
    iTest->Printf(KMatchOutputFormat1, numMatches, numMatches ? KPass().Ptr() : KFail().Ptr());

    if (numMatches)
    {
        //fetch first contact item in array
        CContactItem* item = iDb->ReadContactLC((*idArray)[0]);
        timer.StopTimer();
        CContactItemFieldSet& fieldSet = item->CardFields();
        TInt firstNameFieldId = fieldSet.Find(KUidContactFieldGivenName);
        if (firstNameFieldId == KErrNotFound)
        {
            User::Leave(KErrNotFound);
        }
        CContactItemField& firstNameField = fieldSet[firstNameFieldId];
        CContactTextField* firstNameText = firstNameField.TextStorage();
        TPtrC firstName(firstNameText->Text());
        iTest->Printf(KMatchOutputFormat3, &firstName);

        CleanupStack::PopAndDestroy(item);
    }
    else
    {
        timer.StopTimer();
    }

    CleanupStack::PopAndDestroy(idArray);

    TInt result = timer.Result();
    TBuf<64> formattable;
    formattable.Format(KMatchOutputFormat2, result / 1000000, (result / 1000) % 1000);
    iTest->Printf(formattable);
}
Exemple #11
0
QContactDetail *CntTransformNickname::transformItemField(const CContactItemField& field, const QContact &contact)
{
	QContactNickname *name = new QContactNickname(contact.detail<QContactNickname>());

	CContactTextField* storage = field.TextStorage();
	QString nameValue = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length());

	for (int i = 0; i < field.ContentType().FieldTypeCount(); i++)
	{
		//Prefix
		if (field.ContentType().FieldType(i) == KUidContactFieldSecondName)
		{
			name->setNickname(nameValue);
		}
	}

	return name;
}
QContactDetail *CntTransformPresence::transformItemField(const CContactItemField& field, const QContact &contact)
{
    QList<QContactDetail> presenceDetails = contact.details(QContactPresence::DefinitionName);
    TLex label(field.Label());
    int counter = -1;
    if (label.Val(counter) != KErrNone) {
        return NULL;
    }
    
    //check what presence detail the provided field belongs to. if there is no such detail yet,
    //let's create it.
    if (presenceDetails.count() <= counter) {
        for (int i = presenceDetails.count(); i <= counter; i++) {
            QContactPresence *presence = new QContactPresence();
            QContact& currentContact = const_cast<QContact&>(contact);
            currentContact.saveDetail(presence);
            delete presence;
        }
        presenceDetails = contact.details(QContactPresence::DefinitionName);
    }
    QContactPresence *presenceDetail = new QContactPresence(presenceDetails.at(counter));

	CContactTextField* storage = field.TextStorage();
	QString presenceString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length());

    for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) {
        //Presence
        if (field.ContentType().FieldType(i) == KUidContactFieldPresence) {
            QContactPresence::PresenceState presenceState = decodePresence(presenceString);
            presenceDetail->setPresenceState(presenceState);
        }
        //Status Message
        else if (field.ContentType().FieldType(i) == KUidContactFieldStatusMsg) {
            presenceDetail->setPresenceStateText(presenceString);
        }
    }

    // set context
	for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) {
        setContexts(field.ContentType().FieldType(i), *presenceDetail);
	}

	return presenceDetail;
}
Exemple #13
0
QContactDetail *CntTransformUrl::transformItemField(const CContactItemField& field, const QContact &contact)
{
	Q_UNUSED(contact);

	QContactUrl *url = new QContactUrl();

	CContactTextField* storage = field.TextStorage();
	QString urlString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length());

	url->setUrl(urlString);
	url->setSubType(QContactUrl::SubTypeHomePage);

	for (int i = 0; i < field.ContentType().FieldTypeCount(); i++)
	{
		setContexts(field.ContentType().FieldType(i), *url);
	}

	return url;
}
void CReadContactsAO::GetTextFieldFromFieldSet(CContactItemFieldSet& aFieldSet, const TUid aField,TDesC& name)
{
	TInt index = aFieldSet.Find(aField);

    if ((index >= 0) && (index < aFieldSet.Count()))
    {
   	    CContactItemField& textfield = aFieldSet[index];
        CContactTextField* textValue = textfield.TextStorage();

		((TDes&)name).Copy(textValue->Text());		
    } 
}
Exemple #15
0
QContactDetail *CntTransformFamily::transformItemField(const CContactItemField& field, const QContact &contact)
{
    QContactFamily *family = new QContactFamily(contact.detail<QContactFamily>());

	CContactTextField* storage = field.TextStorage();
	QString familyString = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length());

	for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) {
        //Spouse
	    if (field.ContentType().FieldType(i) == KUidContactFieldSpouse) {
            family->setSpouse(familyString);
	    }

	    //Children
	    else if (field.ContentType().FieldType(i) == KUidContactFieldChildren) {
            QStringList childrenList = family->children();
            childrenList.append(familyString);
            family->setChildren(childrenList);
	    }
	}

	return family;
}
Exemple #16
0
QContactDetail *CntTransformName::transformItemField(const CContactItemField& field, const QContact &contact)
{
    QContactName *name = new QContactName(contact.detail<QContactName>());

    CContactTextField* storage = field.TextStorage();
    QString nameValue = QString::fromUtf16(storage->Text().Ptr(), storage->Text().Length());

    for (int i = 0; i < field.ContentType().FieldTypeCount(); i++) {
        //Prefix
        if (field.ContentType().FieldType(i) == KUidContactFieldPrefixName) {
            name->setPrefix(nameValue);
        }
        //First name
        else if (field.ContentType().FieldType(i) == KUidContactFieldGivenName) {
            name->setFirstName(nameValue);
        }
        //Middle name
        else if (field.ContentType().FieldType(i) == KUidContactFieldAdditionalName) {
            name->setMiddleName(nameValue);
        }
        //Last name
        else if (field.ContentType().FieldType(i) == KUidContactFieldFamilyName) {
            name->setLastName(nameValue);
        }
        //Suffix
        else if (field.ContentType().FieldType(i) == KUidContactFieldSuffixName) {
            name->setSuffix(nameValue);
        }
        // custom label
        else if (field.ContentType().FieldType(i) == KUidContactFieldTemplateLabel) {
            name->setCustomLabel(nameValue);
        }
    }

    return name;
}
void CReadContactsAO::ReadContactL()
{
	TBuf<150> fname;	
	TBuf<150> lname;	
	TBuf<150> mobile;
	TBuf<50> mobile1;
	TBuf<50> mobile2;
	TBuf<50> mobile3;
	TBuf<50> mobile4;
	TBuf<50> mobile5;
	TBuf<50> mobile6;

	CContactItem* contact;

	TInt cid=(*cArray)[iFlag];

	contact = iPhoneContacts->ReadContactL(cid);
	
	mobile.Copy(_L(""));
	mobile1.Copy(_L(""));
	mobile2.Copy(_L(""));
	mobile3.Copy(_L(""));
	mobile4.Copy(_L(""));
	mobile5.Copy(_L(""));
	mobile6.Copy(_L(""));

	CContactItemFieldSet& fieldSet = contact->CardFields();		   

	for (TInt j = 0; j < fieldSet.Count(); j++) 
	{				
		// Home mobile nos
		if (fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldPhoneNumber)
			&& fieldSet[j].TextStorage()->Text().Length() > 0 
			&& fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldVCardMapHOME)
			&& fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldVCardMapCELL)) 
		{
			CContactItemField& textfield = fieldSet[j];
			CContactTextField* textValue = textfield.TextStorage();
			((TDes&)mobile2).Copy(textValue->Text());
			continue;
		}				
		// Work mobile nos
		if (fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldPhoneNumber) 
			&& fieldSet[j].TextStorage()->Text().Length() > 0 
			&& fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldVCardMapWORK)
			&& fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldVCardMapCELL)) 
		{
			CContactItemField& textfield = fieldSet[j];
			CContactTextField* textValue = textfield.TextStorage();
			((TDes&)mobile3).Copy(textValue->Text());
			continue;
		}								
		// Mobile nos
		if (fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldPhoneNumber) 
			&& fieldSet[j].TextStorage()->Text().Length() > 0 
			&& fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldVCardMapCELL)) 
		{
			CContactItemField& textfield = fieldSet[j];
			CContactTextField* textValue = textfield.TextStorage();
			((TDes&)mobile1).Copy(textValue->Text());			
			continue;
		}
		// Home Telephone nos
		if (fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldPhoneNumber) 
			&& fieldSet[j].TextStorage()->Text().Length() > 0 
			&& fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldVCardMapHOME)
			&& fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldVCardMapTEL)) 
		{
			CContactItemField& textfield = fieldSet[j];
			CContactTextField* textValue = textfield.TextStorage();
			((TDes&)mobile5).Copy(textValue->Text());				
			continue;
		}
		// Work Telephone nos
		if (fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldPhoneNumber) 
			&& fieldSet[j].TextStorage()->Text().Length() > 0 
			&& fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldVCardMapWORK)
			&& fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldVCardMapTEL)) 
		{
			CContactItemField& textfield = fieldSet[j];
			CContactTextField* textValue = textfield.TextStorage();
			((TDes&)mobile6).Copy(textValue->Text());				
			continue;
		}
		// Telephones
		if (fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldPhoneNumber) 
			&& fieldSet[j].TextStorage()->Text().Length() > 0 
			&& fieldSet[j].ContentType().ContainsFieldType(KUidContactFieldVCardMapTEL)) 
		{
			CContactItemField& textfield = fieldSet[j];
			CContactTextField* textValue = textfield.TextStorage();
			((TDes&)mobile4).Copy(textValue->Text());				
			continue;
		}
	}

	if(mobile1.Compare(_L("")) == 0 || mobile1.Compare(_L(" ")) == 0)
	{
		if(mobile2.Compare(_L("")) == 0 || mobile2.Compare(_L(" ")) == 0)
		{
			if(mobile3.Compare(_L("")) == 0 || mobile3.Compare(_L(" ")) == 0)
			{
				if(mobile4.Compare(_L("")) == 0 || mobile4.Compare(_L(" ")) == 0)
				{
					if(mobile5.Compare(_L("")) == 0 || mobile5.Compare(_L(" ")) == 0)
					{
						if(mobile6.Compare(_L("")) == 0 || mobile6.Compare(_L(" ")) == 0)
						{
						}
						else
							mobile.Copy(mobile6);
					}
					else
						mobile.Copy(mobile5);
				}
				else
					mobile.Copy(mobile4);
			}
			else
				mobile.Copy(mobile3);
		}
		else
			mobile.Copy(mobile2);
	}
	else
		mobile.Copy(mobile1);

	if(mobile.Length() != 0) 
	{
		GetTextFieldFromFieldSet(fieldSet, KUidContactFieldGivenName, fname);

		GetTextFieldFromFieldSet(fieldSet, KUidContactFieldFamilyName, lname);
		
		if(lname.Compare(_L("")) !=0 )
		{
			lname.Append(_L(" "));
			fname.Insert(0,lname);
		}
		
		iAppView.iContactsArray->AppendL(fname);
		
		iAppView.iContactsCount++;

		iAppView.iContactsIdArray->AppendL(iFlag);	
	}

	delete contact;
}
Exemple #18
0
/**
	Try to match the phone number given with existing numbers in the database.
*/
void CCrudOperations::MatchContactsByEmailAndSipL()
{
    _LIT(KPass, "Pass");
    _LIT(KFail, "Fail");
    _LIT(KEmailMatchOutputFormat1,"Number of email addresses matched: %d -- %s\n");
    _LIT(KEmailMatchOutputFormat2,"Email address lookup took: %d s %03d\n");
    _LIT(KMatchOutputFormat3, "The contact's first name: %S\n");

    // Test Email address matching

    // this address belongs to the 1000th contact item in the database, which has a photo.
    _LIT(KEmailAddressToFind, "*****@*****.**");
    _LIT(KEmailTestTitle, "\nBeginning Email Address Match testing...\n");

    iTest->Printf(KEmailTestTitle);
    TCntPerfTimer timer;
    timer.StartTimer();

    // Search the database...
    CContactItemFieldDef* fieldsToSearch = new (ELeave) CContactItemFieldDef();
    CleanupStack::PushL(fieldsToSearch);
    fieldsToSearch->AppendL(KUidContactFieldEMail);
    CContactIdArray* idArray = iDb->FindLC(KEmailAddressToFind, fieldsToSearch);
    TInt numMatches = idArray->Count();
    iTest->Printf(KEmailMatchOutputFormat1, numMatches, numMatches ? KPass().Ptr() : KFail().Ptr());

    if (numMatches)
    {
        //fetch first contact item in array
        CContactItem* item = iDb->ReadContactLC((*idArray)[0]);
        CContactItemFieldSet& fieldSet = item->CardFields();
        TInt firstNameFieldId = fieldSet.Find(KUidContactFieldGivenName);
        if (firstNameFieldId == KErrNotFound)
        {
            User::Leave(KErrNotFound);
        }
        CContactItemField& firstNameField = fieldSet[firstNameFieldId];
        CContactTextField* firstNameText = firstNameField.TextStorage();
        TPtrC firstName(firstNameText->Text());
        iTest->Printf(KMatchOutputFormat3, &firstName);
        CleanupStack::PopAndDestroy(item);
    }

    timer.StopTimer();
    CleanupStack::PopAndDestroy(2, fieldsToSearch); // and idArray


    TInt result = timer.Result();
    TBuf<64> formattable;
    formattable.Format(KEmailMatchOutputFormat2, result / 1000000, (result / 1000) % 1000);
    iTest->Printf(formattable);

    // reset variables
    fieldsToSearch = NULL;
    idArray = NULL;
    numMatches = 0;
    timer.ResetTimer();
    result = 0;
    formattable.Zero();


    // Test SIP address matching

    // this address belongs to the 1000th contact item in the database, which has a photo.
    _LIT(KSipAddressToFind, "sip:[email protected]");
    _LIT(KSipTestTitle, "\nBeginning SIP Address Match testing...\n");
    _LIT(KSipMatchOutputFormat1,"Number of SIP addresses matched: %d -- %s\n");
    _LIT(KSipMatchOutputFormat2,"SIP address lookup took: %d s %03d\n");

    iTest->Printf(KSipTestTitle);
    timer.StartTimer();

    // Search the database...
    fieldsToSearch = new (ELeave) CContactItemFieldDef();
    CleanupStack::PushL(fieldsToSearch);
    fieldsToSearch->AppendL(KUidContactFieldSIPID);
    idArray = iDb->FindLC(KSipAddressToFind, fieldsToSearch);
    numMatches = idArray->Count();
    iTest->Printf(KSipMatchOutputFormat1, numMatches, numMatches ? KPass().Ptr() : KFail().Ptr());

    if (numMatches)
    {
        //fetch first contact item in array
        CContactItem* item = iDb->ReadContactLC((*idArray)[0]);
        CContactItemFieldSet& fieldSet = item->CardFields();
        TInt firstNameFieldId = fieldSet.Find(KUidContactFieldGivenName);
        if (firstNameFieldId == KErrNotFound)
        {
            User::Leave(KErrNotFound);
        }
        CContactItemField& firstNameField = fieldSet[firstNameFieldId];
        CContactTextField* firstNameText = firstNameField.TextStorage();
        TPtrC firstName(firstNameText->Text());
        iTest->Printf(KMatchOutputFormat3, &firstName);
        CleanupStack::PopAndDestroy(item);
    }

    timer.StopTimer();
    CleanupStack::PopAndDestroy(2, fieldsToSearch); // and idArray

    result = timer.Result();
    formattable.Format(KSipMatchOutputFormat2, result / 1000000, (result / 1000) % 1000);
    iTest->Printf(formattable);
}