// Copyright (c) 2003-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:
// This test code tests the vCard import / export functionality that was introduced as a result of the
// defect DEF023159. This defect requires the implementation of a flag which tells the import/export
// routines to ignore white-space only valued properties within a Contact Entry / vCard file.
//
//
#include "t_timeis.h"
#include <vutil.h>
#include <coreappstest/testserver.h>
// include templates for CleanupResetAndDestroyPushL(T)
#include "cntviewprivate.h"
RTest test(_L("T_TimeIS - exp/importing using TimeIS protocol"));
const TPtrC KDatabaseName=_L("C:TimeISdb.cdb");
const TPtrC KTestFile4_1=_L("Z:\\t_TimeIS\\Connectivity.vcf");
const TPtrC KTestFile1_1=_L("C:\\Test1_1.vcf");
const TPtrC KTestFile1_2=_L("C:\\Test1_2.vcf");
const TPtrC KTestFile1_3=_L("C:\\Test1_3.vcf");
const TPtrC KTestFile3_1=_L("C:\\Test3_1.vcf");
const TPtrC KTestFile5_1=_L("C:\\Test5_1.vcf");
const TPtrC KTestFile5_2=_L("C:\\Test5_2.vcf");
const TPtrC KTestFile5_3=_L("C:\\Test5_3.vcf");
const TPtrC KTestFile6_1=_L("C:\\Test6_1.vcf");
const TPtrC KTestFile6_2=_L("C:\\Test6_2.vcf");
const TPtrC KTestFile7_1=_L("C:\\Test7_1.vcf");
const TPtrC KTestFile7_2=_L("C:\\Test7_2.vcf");
const TPtrC KTestFile7_3=_L("C:\\Test7_3.vcf");
const TPtrC KTestFile8_1=_L("C:\\Test8_1.vcf");
const TPtrC KTestFile8_2=_L("C:\\Test8_2.vcf");
const TPtrC KTestFile8_3=_L("C:\\Test8_3.vcf");
CTimeISTest::CTimeISTest()
{
} // Contructor
CTimeISTest::~CTimeISTest()
{
delete iDb;
CActiveScheduler* scheduler=CActiveScheduler::Current(); //get current
CActiveScheduler::Install(NULL); //uninstall
delete scheduler; // delete uninstalled scheduler
iFs.Close();
} // Destructor
CTimeISTest* CTimeISTest::NewLC(RTest& aTest)
{
CTimeISTest* self=new(ELeave) CTimeISTest();
CleanupStack::PushL(self);
self->ConstructL(aTest);
return(self);
} //NewLC
void CTimeISTest::CloseDb()
{
delete iDb;
iDb = 0;
}
void CTimeISTest::ConstructL(RTest& aTest)
{
User::LeaveIfError(iFs.Connect());
CActiveScheduler::Install(new(ELeave) CActiveScheduler);
iTest = &aTest;
iDb = CContactDatabase::ReplaceL(KDatabaseName);
}; // ConstructL
// ---------------- Utility Methods
// Using a text string, create a vCard. Return the pointer to the newly created instance
// The caller will take ownership of it.
CParserVCard* CTimeISTest::CreateVCardLC(const TDesC8& aContents)
{
CParserVCard* vCardParser=CParserVCard::NewL();
CleanupStack::PushL(vCardParser);
RDesReadStream stream(aContents);
stream.PushL();
vCardParser->InternalizeL(stream);
CleanupStack::PopAndDestroy(); // stream
return vCardParser;
}
// Externalise the VCard to the file. If the file does not exist it is created, if the
// file already exists it is overwritted.
void CTimeISTest::WriteVCardL(const TDesC& aFileName, CParserVCard& aVCard)
{
RFileWriteStream vCardWrite;
vCardWrite.PushL();
User::LeaveIfError(vCardWrite.Replace(iFs,aFileName,EFileWrite));
aVCard.ExternalizeL(vCardWrite);
vCardWrite.CommitL();
CleanupStack::PopAndDestroy(); //vCardWrite
}
// Find a field value of type aFieldType and return true if it matches the aExpected value.
TBool CTimeISTest::CheckSingleFieldValue(CContactItemFieldSet& aFieldSet, TFieldType aFieldType, const TDesC& aExpectedValue)
{
TBool correctValue = EFalse;
TInt pos = aFieldSet.Find(aFieldType);
if (pos != KErrNotFound)
{
// Verify
CContactItemField& field = aFieldSet[pos];
CContactTextField* storage = field.TextStorage();
correctValue = (storage->Text().CompareF(aExpectedValue) == 0);
}
//
return correctValue;
}
// Find a parameter and field value of type aFieldType and return true if it matches the aExpected value.
TBool CTimeISTest::CheckSingleParameterFieldValues(CContactItemFieldSet& aFieldSet, TFieldType aFieldType, TUid aMapping, const TDesC& aExpectedValue, TBool aFieldPresent)
{
TBool correctValue = EFalse;
TInt pos = 0;
TBool fieldFound = EFalse;
TInt startPos = KContactFieldSetSearchAll;
while(!fieldFound && !(pos == KErrNotFound))
{
pos = aFieldSet.FindNext(aFieldType, startPos);
startPos = pos + 1;
if (pos != KErrNotFound )
{
CContactItemField& tempField = aFieldSet[pos];
const CContentType& tempContentType = tempField.ContentType();
if (aMapping == KNullUid)
{
TBool additionalMapFound = EFalse;
additionalMapFound |= tempContentType.ContainsFieldType(KUidContactFieldVCardMapHOME);
additionalMapFound |= tempContentType.ContainsFieldType(KUidContactFieldVCardMapWORK);
additionalMapFound |= tempContentType.ContainsFieldType(KUidContactFieldVCardMapPREF);
if (!additionalMapFound)
{
fieldFound = ETrue;
}
}
else
{
fieldFound = tempContentType.ContainsFieldType(aMapping);
}
}
}
if (fieldFound)
{
CContactItemField& aItemField = aFieldSet[pos];
// Verify
CContactTextField* storage = aItemField.TextStorage();
correctValue = (storage->Text().CompareF(aExpectedValue) == 0);
}
if (!aFieldPresent && !fieldFound)
{
correctValue = ETrue;
}
return correctValue;
}
// Create a contact entry in the Contact Database and return the ID
TContactItemId CTimeISTest::CreateContactL()
{
const TContactItemId templateId = iDb->TemplateId();
CContactItem* templateCard = iDb->ReadContactLC(templateId);
CContactCard* card = CContactCard::NewL(templateCard);
CleanupStack::PushL(card);
//
CContactItemFieldSet& cardFields=card->CardFields();
// Set the telephone number
TInt pos=cardFields.Find(KUidContactFieldPhoneNumber);
if (pos!=KErrNotFound)
{
cardFields[pos].SetMapping(KUidContactFieldVCardMapTEL);
cardFields[pos].TextStorage()->SetTextL(_L("1234"));
}
// Set the label
pos=cardFields.Find(KUidContactFieldNote);
if (pos!=KErrNotFound)
{
cardFields[pos].SetMapping(KUidContactFieldVCardMapLABEL);
cardFields[pos].TextStorage()->SetTextL(_L(" "));
}
//
const TContactItemId id = iDb->AddNewContactL(*card);
CleanupStack::PopAndDestroy(2, templateCard);
return id;
}
// Read in the file and parse it using Versit
CParserVCard* CTimeISTest::ParseVCardLC(const TDesC& aFilename)
{
CParserVCard* vCardParser=CParserVCard::NewL();
CleanupStack::PushL(vCardParser);
//
RFile readFile;
const TInt error = readFile.Open(iFs, aFilename, EFileRead);
User::LeaveIfError(error);
CleanupClosePushL(readFile);
//
RFileReadStream stream(readFile);
stream.PushL();
vCardParser->InternalizeL(stream);
CleanupStack::PopAndDestroy(); // stream
CleanupStack::PopAndDestroy(); // readFile
return vCardParser;
}
// ---------------- Test Methods
CArrayPtr<CContactItem>* CTimeISTest::ImportVCardLC(const TDesC& aFilename, TBool aConnectWhitespaceOption)
{
CArrayPtr<CContactItem>* contactItems;
RFileReadStream vCardRead;
TBool importOK;
vCardRead.PushL();
User::LeaveIfError(vCardRead.Open(iFs,aFilename,EFileRead));
// Just a precaution. This array must be empty before we go and add more data
if (aConnectWhitespaceOption)
{
contactItems = iDb->ImportContactsL(TUid::Uid(KUidVCardConvDefaultImpl),vCardRead,importOK,(CContactVCardConverter::EImportSingleContact | CContactVCardConverter::EConnectWhitespace));
}
else
{
contactItems = iDb->ImportContactsL(TUid::Uid(KUidVCardConvDefaultImpl),vCardRead,importOK,(CContactVCardConverter::EImportSingleContact));
}
CleanupStack::PopAndDestroy(); // vCardRead
CleanupStack::PushL(contactItems);
return contactItems;
}
void CTimeISTest::TestOneL()
{
// Create a vCard with actual telephone number
iTest->Printf(_L("Creating test vCard Files\n"));
_LIT8(KRealTel, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:1\r\nNOTE:text\r\nEND:VCARD\r\n");
CParserVCard* vCard = CreateVCardLC(KRealTel);
WriteVCardL(KTestFile1_1,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Create a vCard with spaced telephone number
_LIT8(KSpaceTel, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:1\r\nNOTE: \r\nTEL:1\r\nEND:VCARD\r\n");
vCard = CreateVCardLC(KSpaceTel);
WriteVCardL(KTestFile1_2,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Create a vCard with null telephone number
_LIT8(KNULLTel, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:1\r\nNOTE:\r\nTEL:1\r\nEND:VCARD\r\n");
vCard = CreateVCardLC(KNULLTel);
WriteVCardL(KTestFile1_3,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Now import the files and check the behaviour
iTest->Printf(_L("Importing vCard files to contacts\n"));
iTest->Printf(_L("New File\n"));
CArrayPtr<CContactItem>* contactItems = ImportVCardLC(KTestFile1_1);
(*iTest)(contactItems->Count() == 1);
CContactItem* cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldNote,_L("text")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
iTest->Printf(_L("Spaced value field\n"));
contactItems = ImportVCardLC(KTestFile1_2);
(*iTest)(contactItems->Count() == 1);
cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldNote,_L("text")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
iTest->Printf(_L("NULL value field\n"));
contactItems = ImportVCardLC(KTestFile1_3);
(*iTest)(contactItems->Count() == 1);
cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldNote,_L("")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
iTest->Printf(_L("Behaviour correct\n"));
}
void CTimeISTest::TestTwoL()
{
// Create a vCard with actual telephone number, Home Work Preferred and default addresses.
iTest->Printf(_L("Creating test vCard Files\n"));
_LIT8(KNewN, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:1\r\nN:A;B;C\r\nEND:VCARD\r\n");
CParserVCard* vCard = CreateVCardLC(KNewN);
WriteVCardL(KTestFile1_1,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Create a vCard with spaced telephone number, null address regions.
_LIT8(KModN, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:1\r\nN:A;;C\r\nTEL:1\r\nEND:VCARD\r\n");
vCard = CreateVCardLC(KModN);
WriteVCardL(KTestFile1_2,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Create a vCard with null telephone number, spaced address localities.
_LIT8(KDelN, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:1\r\nN: ;;C\r\nTEL:2\r\nEND:VCARD\r\n");
vCard = CreateVCardLC(KDelN);
WriteVCardL(KTestFile1_3,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Now import the files and check the behaviour
iTest->Printf(_L("Importing vCard files to contacts\n"));
iTest->Printf(_L("New File\n"));
CArrayPtr<CContactItem>* contactItems = ImportVCardLC(KTestFile1_1);
(*iTest)(contactItems->Count() == 1);
CContactItem* cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldFamilyName,_L("A")));
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldGivenName,_L("B")));
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldAdditionalName,_L("C")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
iTest->Printf(_L("A non supported field\n"));
contactItems = ImportVCardLC(KTestFile1_2);
(*iTest)(contactItems->Count() == 1);
cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldFamilyName,_L("A")));
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldGivenName,_L("B")));
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldAdditionalName,_L("C")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
iTest->Printf(_L("Empty field\n"));
contactItems = ImportVCardLC(KTestFile1_3);
(*iTest)(contactItems->Count() == 1);
cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldFamilyName,_L("")));
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldGivenName,_L("B")));
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldAdditionalName,_L("C")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
}
void CTimeISTest::TestThree()
{
iTest->Printf(_L("Testing Export\n"));
// Create a contacts entry and export it via CntVCard
iTest->Printf(_L("Creating the Contact and exporting it\n"));
CContactIdArray* idArray = CContactIdArray::NewLC();
TContactItemId contactID = CreateContactL();
idArray->AddL(contactID);
RFileWriteStream vCardWrite;
vCardWrite.PushL();
User::LeaveIfError(vCardWrite.Replace(iFs,KTestFile3_1,EFileWrite));
iDb->ExportSelectedContactsL(TUid::Uid(KUidVCardConvDefaultImpl),*idArray,vCardWrite,(CContactVCardConverter::EImportSingleContact | CContactVCardConverter::EConnectWhitespace));
vCardWrite.CommitL();
CleanupStack::PopAndDestroy(); //vCardWrite
CleanupStack::PopAndDestroy(idArray);
// Verify that the card contains a telephone field and NOT a LABEL field.
iTest->Printf(_L("Checking its contents\n"));
const TUid KVersitTELPropertyValueType = { KVersitPropertyHBufCUid };
const TUid KVersitLABELPropertyValueType = { KVersitPropertyHBufCUid };
CParserVCard* parser = ParseVCardLC(KTestFile3_1);
CArrayPtr<CParserProperty>* properties = parser->PropertyL(KVersitTokenTEL,KVersitTELPropertyValueType, EFalse);
// If properties were found this will have a value
(*iTest)(!(properties == NULL));
delete properties;
properties = parser->PropertyL(KVersitTokenLABEL,KVersitLABELPropertyValueType, EFalse);
// If properties were found this will have a value
(*iTest)(properties == NULL);
CleanupStack::PopAndDestroy(parser);
}
void CTimeISTest::TestFour()
{
// Create a badly formatted vCard.
iTest->Printf(_L("Importing bad vCard to contacts\n"));
CArrayPtr<CContactItem>* contactItems = ImportVCardLC(KTestFile4_1);
(*iTest)(contactItems->Count() == 1);
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(contactItems);
}
void CTimeISTest::TestFiveL()
{
// Create a vCard with actual telephone number, Home Work Preferred and default addresses.
iTest->Printf(_L("Creating test vCard Files\n"));
_LIT8(KNewN, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:3\r\nADR;HOME:;;;HLocal;HRegion;HPost;\r\nADR;WORK:;;;WLocal;WRegion;WPost;\r\nADR:;;;Local;Region;Post;\r\nADR;PREF:;;;PLocal;PRegion;PPost;\r\nEND:VCARD\r\n");
CParserVCard* vCard = CreateVCardLC(KNewN);
WriteVCardL(KTestFile5_1,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Create a vCard with spaced telephone number, null address regions.
_LIT8(KModN, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:3\r\nADR;HOME:;;;HLocal;;HPost;\r\nADR;WORK:;;;WLocal;;WPost;\r\nADR:;;;Local;;Post;\r\nADR;PREF:;;;PLocal;;PPost;\r\nEND:VCARD\r\n");
vCard = CreateVCardLC(KModN);
WriteVCardL(KTestFile5_2,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Create a vCard with null telephone number, spaced address localities.
_LIT8(KDelN, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:3\r\nADR;HOME:;;; ;;HPost;\r\nADR;WORK:;;; ;;WPost;\r\nADR:;;; ;;Post;\r\nADR;PREF:;;; ;;PPost;\r\nEND:VCARD\r\n");
vCard = CreateVCardLC(KDelN);
WriteVCardL(KTestFile5_3,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Now import the files and check the behaviour
iTest->Printf(_L("Importing vCard files to contacts -Test 5\n"));
iTest->Printf(_L("New File -Test 5\n\r"));
CArrayPtr<CContactItem>* contactItems = ImportVCardLC(KTestFile5_1);
(*iTest)(contactItems->Count() == 1);
CContactItem* cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapHOME,_L("HLocal")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapWORK,_L("WLocal")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KNullUid,_L("Local")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapPREF,_L("PLocal")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapHOME,_L("HRegion")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapWORK,_L("WRegion")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KNullUid,_L("Region")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapPREF,_L("PRegion")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapHOME,_L("HPost")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapWORK,_L("WPost")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KNullUid,_L("Post")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapPREF,_L("PPost")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
iTest->Printf(_L("A non supported field -Test 5\n\r"));
contactItems = ImportVCardLC(KTestFile5_2);
(*iTest)(contactItems->Count() == 1);
cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapHOME,_L("HLocal")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapWORK,_L("WLocal")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KNullUid,_L("Local")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapPREF,_L("PLocal")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapHOME,_L("HRegion")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapWORK,_L("WRegion")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KNullUid,_L("Region")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapPREF,_L("PRegion")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapHOME,_L("HPost")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapWORK,_L("WPost")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KNullUid,_L("Post")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapPREF,_L("PPost")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
iTest->Printf(_L("Empty field -Test 5\n\r"));
contactItems = ImportVCardLC(KTestFile5_3);
(*iTest)(contactItems->Count() == 1);
cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapHOME,_L("")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapWORK,_L("")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KNullUid,_L(""), EFalse));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapPREF,_L(""), EFalse));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapHOME,_L("HRegion")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapWORK,_L("WRegion")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KNullUid,_L("Region")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapPREF,_L("PRegion")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapHOME,_L("HPost")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapWORK,_L("WPost")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KNullUid,_L("Post")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapPREF,_L("PPost")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
}
void CTimeISTest::TestSixL()
{
// Create a vCard with actual telephone number, Home Work Preferred and default addresses.
iTest->Printf(_L("Creating test vCard Files\n"));
_LIT8(KNewN, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:5\r\nADR;HOME:;;;HLocal;HRegion;HPost;\r\nEND:VCARD\r\n");
CParserVCard* vCard = CreateVCardLC(KNewN);
WriteVCardL(KTestFile6_1,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Create a vCard with spaced telephone number, null address regions.
_LIT8(KModN, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:5\r\nADR;WORK:;;;WLocal;WRegion;WPost;\r\nEND:VCARD\r\n");
vCard = CreateVCardLC(KModN);
WriteVCardL(KTestFile6_2,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Now import the files and check the behaviour
iTest->Printf(_L("Importing vCard files to contacts -Test 6\n"));
iTest->Printf(_L("New File -Test 6\n\r"));
CArrayPtr<CContactItem>* contactItems = ImportVCardLC(KTestFile6_1);
(*iTest)(contactItems->Count() == 1);
CContactItem* cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapHOME,_L("HLocal")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapHOME,_L("HRegion")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapHOME,_L("HPost")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
iTest->Printf(_L("A non supported field -Test 6\n\r"));
contactItems = ImportVCardLC(KTestFile6_2);
(*iTest)(contactItems->Count() == 1);
cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapHOME,_L("HLocal")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapHOME,_L("HRegion")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapHOME,_L("HPost")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapWORK,_L("WLocal")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapWORK,_L("WRegion")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapWORK,_L("WPost")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
}
void CTimeISTest::TestSevenL()
{
// Create a vCard with actual telephone number, Home Work Preferred and default addresses.
iTest->Printf(_L("Creating test vCard Files -Test 7\n"));
_LIT8(KNewN, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:7\r\nN:A;B;C\r\nEND:VCARD\r\n");
CParserVCard* vCard = CreateVCardLC(KNewN);
WriteVCardL(KTestFile7_1,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Create a vCard with spaced telephone number, null address regions.
_LIT8(KModN, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:7\r\nN:A;;C\r\nTEL:1\r\nEND:VCARD\r\n");
vCard = CreateVCardLC(KModN);
WriteVCardL(KTestFile7_2,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Create a vCard with null telephone number, spaced address localities.
_LIT8(KDelN, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:7\r\nN: ;;C\r\nTEL:2\r\nEND:VCARD\r\n");
vCard = CreateVCardLC(KDelN);
WriteVCardL(KTestFile7_3,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Now import the files and check the behaviour
iTest->Printf(_L("Importing vCard files to contacts -Test 7\n"));
iTest->Printf(_L("New File -Test 7\n"));
CArrayPtr<CContactItem>* contactItems = ImportVCardLC(KTestFile7_1, 0);
(*iTest)(contactItems->Count() == 1);
CContactItem* cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldFamilyName,_L("A")));
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldGivenName,_L("B")));
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldAdditionalName,_L("C")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
iTest->Printf(_L("A non supported field -Test 7\n"));
contactItems = ImportVCardLC(KTestFile7_2, 0);
(*iTest)(contactItems->Count() == 1);
cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldFamilyName,_L("A")));
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldGivenName,_L("")));
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldAdditionalName,_L("C")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
iTest->Printf(_L("Empty field -Test 7\n"));
contactItems = ImportVCardLC(KTestFile7_3, 0);
(*iTest)(contactItems->Count() == 1);
cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldFamilyName,_L(" ")));
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldGivenName,_L("")));
(*iTest)(CheckSingleFieldValue(cItem->CardFields(),KUidContactFieldAdditionalName,_L("C")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
}
void CTimeISTest::TestEightL()
{
// Create a vCard with actual telephone number, Home Work Preferred and default addresses.
iTest->Printf(_L("Creating test vCard Files - Test 8\n"));
_LIT8(KNewN, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:8\r\nADR;HOME:;;;HLocal;HRegion;HPost;\r\nADR;WORK:;;;WLocal;WRegion;WPost;\r\nADR:;;;Local;Region;Post;\r\nADR;PREF:;;;PLocal;PRegion;PPost;\r\nEND:VCARD\r\n");
CParserVCard* vCard = CreateVCardLC(KNewN);
WriteVCardL(KTestFile8_1,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Create a vCard with spaced telephone number, null address regions.
_LIT8(KModN, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:8\r\nADR;HOME:;;;HLocal;;HPost;\r\nADR;WORK:;;;WLocal;;WPost;\r\nADR:;;;Local;;Post;\r\nADR;PREF:;;;PLocal;;PPost;\r\nEND:VCARD\r\n");
vCard = CreateVCardLC(KModN);
WriteVCardL(KTestFile8_2,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Create a vCard with null telephone number, spaced address localities.
_LIT8(KDelN, "BEGIN:VCARD\r\nVERSION:2.1\r\nUID:8\r\nADR;HOME:;;; ;;HPost;\r\nADR;WORK:;;; ;;WPost;\r\nADR:;;; ;;Post;\r\nADR;PREF:;;; ;;PPost;\r\nEND:VCARD\r\n");
vCard = CreateVCardLC(KDelN);
WriteVCardL(KTestFile8_3,*vCard);
CleanupStack::PopAndDestroy(vCard);
// Now import the files and check the behaviour
iTest->Printf(_L("Importing vCard files to contacts -Test 8\n"));
iTest->Printf(_L("New File -Test 8\n\r"));
CArrayPtr<CContactItem>* contactItems = ImportVCardLC(KTestFile8_1, 0);
(*iTest)(contactItems->Count() == 1);
CContactItem* cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapHOME,_L("HLocal")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapWORK,_L("WLocal")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KNullUid,_L("Local")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapPREF,_L("PLocal")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapHOME,_L("HRegion")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapWORK,_L("WRegion")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KNullUid,_L("Region")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapPREF,_L("PRegion")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapHOME,_L("HPost")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapWORK,_L("WPost")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KNullUid,_L("Post")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapPREF,_L("PPost")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
iTest->Printf(_L("A non supported field -Test 8\n\r"));
contactItems = ImportVCardLC(KTestFile8_2, 0);
(*iTest)(contactItems->Count() == 1);
cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapHOME,_L("HLocal")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapWORK,_L("WLocal")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KNullUid,_L("Local")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapPREF,_L("PLocal")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapHOME,_L("")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapWORK,_L("")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KNullUid,_L(""), EFalse));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapPREF,_L(""), EFalse));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapHOME,_L("HPost")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapWORK,_L("WPost")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KNullUid,_L("Post")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapPREF,_L("PPost")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
iTest->Printf(_L("Empty field -Test 8\n\r"));
contactItems = ImportVCardLC(KTestFile8_3, 0);
(*iTest)(contactItems->Count() == 1);
cItem = iDb->ReadContactLC(contactItems->At(0)->Id());
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapHOME,_L(" ")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapWORK,_L(" ")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KNullUid,_L(" ")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldLocality,KUidContactFieldVCardMapPREF,_L(" ")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapHOME,_L("")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapWORK,_L("")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KNullUid,_L(""), EFalse));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldRegion,KUidContactFieldVCardMapPREF,_L(""), EFalse));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapHOME,_L("HPost")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapWORK,_L("WPost")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KNullUid,_L("Post")));
(*iTest)(CheckSingleParameterFieldValues(cItem->CardFields(),KUidContactFieldPostcode,KUidContactFieldVCardMapPREF,_L("PPost")));
contactItems->ResetAndDestroy();
CleanupStack::PopAndDestroy(cItem);
CleanupStack::PopAndDestroy(contactItems);
}
void CTimeISTest::TestBirthdayDeletionL(TBool aAddNameField)
/**
*Testing the deletion of a birthday field in a contact card through the time IS protocol
*@param TBool aAddNameField specify whether or not adding a name field to the contact card
*/
{
TDateTime date(1976,EAugust,28,22,0,0,0);
TTime time(date);
//Create a contact with just a birthday date
const TContactItemId templateId = iDb->TemplateId();
CContactItem* templateCard = iDb->ReadContactLC(templateId);
CContactCard* card = CContactCard::NewL(templateCard);
CleanupStack::PushL(card);
//
CContactItemFieldSet& cardFields=card->CardFields();
// Set the birthday
TInt pos=cardFields.Find(KUidContactFieldBirthday);
if (pos!=KErrNotFound)
{
cardFields[pos].SetMapping(KUidContactFieldVCardMapBDAY);
cardFields[pos].DateTimeStorage()->SetTime(date);
}
if (aAddNameField)
{
pos=cardFields.Find(KUidContactFieldFamilyName);
if (pos!=KErrNotFound)
{
cardFields[pos].TextStorage()->SetTextL(_L("MyName"));
}
}
//Create contact now
const TContactItemId id = iDb->AddNewContactL(*card);
CleanupStack::PopAndDestroy(2, templateCard);
CContactIdArray* idArray = CContactIdArray::NewLC();
idArray->AddL(id);
//export contact to buf
TBuf8<256> buf;//256 bytes should be ok
RDesWriteStream vCardWriteStream(buf);
vCardWriteStream.PushL();
iDb->ExportSelectedContactsL(TUid::Uid(KUidVCardConvDefaultImpl),*idArray,vCardWriteStream,CContactVCardConverter::EConnectWhitespace);
vCardWriteStream.CommitL();
CleanupStack::PopAndDestroy(&vCardWriteStream);
CleanupStack::PopAndDestroy(idArray);
//modify the exported vcard to remove birthday date and add a white space
pos=buf.Find(KVersitTokenBDAY);
(*iTest)(pos>0);
pos+=5; //jump over the token and colon
_LIT8(KEndOfLine,"\n");
TInt charToDelete=buf.Mid(pos).Find(KEndOfLine); //search for the next 0A
charToDelete--; // don't delete the 0A
buf.Delete(pos,charToDelete); //delete now
//Now add white space in vcard
_LIT8(KWhiteSpace," ");
buf.Insert(pos,KWhiteSpace); //insert now
//now import back that vcard it should not change user data
CArrayPtr<CContactItem>* contactItems;
RDesReadStream vCardReadStream(buf);
TBool importOK;
vCardReadStream.PushL();
contactItems = iDb->ImportContactsL(TUid::Uid(KUidVCardConvDefaultImpl),vCardReadStream,importOK,CContactVCardConverter::EConnectWhitespace);
CleanupStack::PopAndDestroy(); // vCardReadStream
CleanupStack::PushL(contactItems);
CleanupResetAndDestroyPushL(*contactItems);
//make sure contact is imported
(*iTest)(contactItems->Count()==1);
TInt fieldPos=contactItems->At(0)->CardFields().Find(KUidContactFieldBirthday);
//make sure field has not been deleted
(*iTest)(fieldPos!=KErrNotFound);
//make sure birthday date as not changed
(*iTest)(contactItems->At(0)->CardFields()[fieldPos].DateTimeStorage()->Time()==time);
CleanupStack::PopAndDestroy(2,contactItems); // ResetAndDestroy
//Now try to delete that field through the symbian connect timeIS protocol by importing a NULL field
//First delete that space in vcard
buf.Delete(pos,1);
//now import back that vcard it should delete the birthday field
vCardReadStream.PushL();
vCardReadStream.Open(buf);
contactItems = iDb->ImportContactsL(TUid::Uid(KUidVCardConvDefaultImpl),vCardReadStream,importOK,CContactVCardConverter::EConnectWhitespace);
CleanupStack::PopAndDestroy(); // vCardReadStream
CleanupStack::PushL(contactItems);
CleanupResetAndDestroyPushL(*contactItems);
(*iTest)(contactItems->Count()==1); //make sure one contact is imported
//Make sure birthday has been deleted
/*TInt*/ fieldPos=contactItems->At(0)->CardFields().Find(KUidContactFieldBirthday);
(*iTest)(fieldPos==KErrNotFound); //make sure field has been deleted
CleanupStack::PopAndDestroy(2,contactItems); // ResetAndDestroy
}
void CTimeISTest::RunTestsL()
{
iTest->Printf(_L("Time IS Tests Starting\n"));
TestBirthdayDeletionL(ETrue);
TestOneL();
TestTwoL();
TestThree();
TestFour();
TestFiveL();
TestSixL();
TestSevenL();
TestEightL();
}
void DoTestsL()
{
CTimeISTest* theTest = CTimeISTest::NewLC(test);
CTestRegister * TempFiles = CTestRegister::NewLC();
TempFiles->RegisterL(KDatabaseName, EFileTypeCnt);
TempFiles->RegisterL(KTestFile1_1);
TempFiles->RegisterL(KTestFile1_2);
TempFiles->RegisterL(KTestFile1_3);
TempFiles->RegisterL(KTestFile3_1);
TempFiles->RegisterL(KTestFile5_1);
TempFiles->RegisterL(KTestFile5_2);
TempFiles->RegisterL(KTestFile5_3);
TempFiles->RegisterL(KTestFile6_1);
TempFiles->RegisterL(KTestFile6_2);
TempFiles->RegisterL(KTestFile7_1);
TempFiles->RegisterL(KTestFile7_2);
TempFiles->RegisterL(KTestFile7_3);
TempFiles->RegisterL(KTestFile8_1);
TempFiles->RegisterL(KTestFile8_2);
TempFiles->RegisterL(KTestFile8_3);
theTest->RunTestsL();
theTest->CloseDb();
CleanupStack::PopAndDestroy(2, theTest);
} //DoTestsL
/**
@SYMTestCaseID PIM-T-TIMEIS-0001
*/
GLDEF_C TInt E32Main()
{
__UHEAP_MARK;
test.Title();
test.Start(_L("@SYMTESTCaseID:PIM-T-TIMEIS-0001 CNTVCard - Check TimeIS import / export support"));
CTrapCleanup* theCleanup = CTrapCleanup::New();
if (!theCleanup)
return KErrNoMemory;
TRAPD(ret, DoTestsL());
test(ret == KErrNone);
delete theCleanup;
test.End();
test.Close();
__UHEAP_MARKEND;
return(0);
}