--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/contactsmodel/tsrc/T_VERS.CPP Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,901 @@
+// Copyright (c) 1997-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 <e32test.h>
+#include <f32file.h>
+#include <s32file.h>
+#include <s32mem.h>
+#include <cntdb.h>
+#include <cntitem.h>
+#include <cntfldst.h>
+#include <e32def.h>
+#include "T_VERS.H"
+#include "T_UTILS.H"
+#include <coreappstest/testserver.h>
+
+enum ImpExpTestFlags
+ {
+ EImpExpTestMultipleEntries=0x1,
+ EImpExpTestModifyEntries=0x2,
+ EImpExpTestExportExtraEntry=0x4,
+ };
+
+CCntTest* CntTest=NULL;
+LOCAL_D RTest test(_L("T_VERS"));
+LOCAL_D CContactIdArray* TheIds;
+
+LOCAL_D CArrayPtr<CContactItem>* TheItems;
+LOCAL_D CArrayPtr<CContactItem>* TheItems2;
+LOCAL_D CArrayPtr<CContactItem>* TheItems3;
+LOCAL_D CArrayPtr<CContactItem>* TheItems4;
+
+const TPtrC KDatabaseFileName=_L("C:T_VERS");
+
+_LIT(KVCardFileToImport,"c:\\t_vers.vcf");
+
+//
+// CVersitTest
+//
+
+CVersitTest::CVersitTest()
+ {}
+
+CVersitTest::~CVersitTest()
+ {
+ delete iParser;
+ delete iStore;
+ }
+
+void CVersitTest::StreamInL()
+//Convert the iVersit into stream format, save it as "VersitIn"
+//and internalize it as a CVersitParser
+ {
+ CFileStore* store = CDirectFileStore::ReplaceLC(CntTest->Fs(),_L("c:\\Versit2"),EFileWrite);
+ store->SetTypeL(KDirectFileStoreLayoutUid);
+ RStoreWriteStream outstream;
+ TStreamId id = outstream.CreateLC(*store);
+ TInt length=iVersit.Length();
+ for (TInt ii=0; ii<length; ii++)
+ outstream.WriteInt8L(iVersit[ii]);
+ outstream.CommitL();
+ CleanupStack::PopAndDestroy();
+ store->SetRootL(id);
+ store->CommitL();
+ CleanupStack::PopAndDestroy();
+ store = CDirectFileStore::OpenLC(CntTest->Fs(),_L("c:\\Versit2"),EFileRead); //retrieve stream
+ RStoreReadStream instream;
+ instream.OpenLC(*store,store->Root());
+ iParser->InternalizeL(instream);
+ CleanupStack::PopAndDestroy(2); //store + stream
+ }
+
+void CVersitTest::StreamLCC(RReadStream& aStream, TInt aMode, TInt aContactId)
+ {
+ switch(aMode)
+ {
+ case 1:
+ GetSampleVersitL();
+ break;
+ case 2:
+ GetSampleVersit2L(aContactId);
+ break;
+ case 3:
+ GetSampleVersit3L();
+ break;
+ }
+ TFileName versitIn;
+ versitIn.Format(_L("c:\\VersitIn%d"),aMode);
+ CFileStore* store = CDirectFileStore::ReplaceLC(CntTest->Fs(),versitIn,EFileWrite);
+ store->SetTypeL(KDirectFileStoreLayoutUid);
+ RStoreWriteStream outstream;
+ TStreamId id = outstream.CreateLC(*store);
+ TInt length=iVersit.Length();
+ for (TInt ii=0; ii<length; ii++)
+ outstream.WriteInt8L(iVersit[ii]);
+ outstream.CommitL();
+ CleanupStack::PopAndDestroy();
+ store->SetRootL(id);
+ store->CommitL();
+ CleanupStack::PopAndDestroy(); // store
+ store = CDirectFileStore::OpenLC(CntTest->Fs(),versitIn,EFileRead); //retrieve stream
+ RStoreReadStream instream;
+ instream.OpenLC(*store,store->Root());
+ CleanupStack::Pop(); // instream
+ aStream=RReadStream(instream);
+ }
+
+void CVersitTest::StreamOutL()
+ {
+ }
+
+void CVersitTest::SaveFileVersitL()
+// Save iParser into VersitFile
+ {
+ if (iParser)
+ {
+ User::LeaveIfError(CntTest->Fs().Connect());
+ RFile file;
+ if (file.Replace(CntTest->Fs(),_L("C:\\VersitFile"),EFileWrite)==KErrNone)
+ iParser->ExternalizeL(file);
+ }
+ }
+
+//
+// CVCardTest
+//
+
+void CVCardTest::LoadFileVersitL()
+// Read VCard.vcf into iVersit
+ {
+ iParser=CParserVCard::NewL();
+ User::LeaveIfError(CntTest->Fs().Connect());
+ RFile file;
+ if (file.Open(CntTest->Fs(),_L("C:\\VCard.vcf"),EFileRead)==KErrNone)
+ {
+ TInt start=0;
+ iParser->InternalizeL(file,start);
+ }
+ }
+
+LOCAL_C void DisplayField(TInt aFieldNumber, const CContentType &aContentType, const TDesC &aDes)
+ {
+ TBuf<128> out;
+ out.Format(_L("Field %d mapped to %x {"),aFieldNumber,aContentType.Mapping());
+ for(TInt loop=0;loop<aContentType.FieldTypeCount();loop++)
+ {
+ if (loop>0)
+ out.Append(TChar(','));
+ out.AppendFormat(_L("%x"),aContentType.FieldType(loop));
+ }
+ out.AppendFormat(_L("} is %S store type"),&aDes);
+ test.Printf(out);
+ }
+
+LOCAL_C void DisplayDatabase()
+ {
+ TContactItemId theid;
+ CContactItem* contactItem=NULL;
+ TContactIter iter(*CntTest->Db());
+ theid=iter.FirstL();
+ while(theid!=KNullContactId )
+ {
+ test.Printf(_L("\n========================ROW ID %d"),theid);
+ contactItem=CntTest->Db()->ReadContactLC(theid);
+ CContactItemFieldSet& fieldSet=contactItem->CardFields();
+ TInt fieldcount=fieldSet.Count();
+ test.Printf(_L(" %d fields"),fieldcount);
+ for (TInt ii=0;ii<fieldcount;ii++)
+ {
+ const CContentType &content=fieldSet[ii].ContentType();
+ test.Printf(_L("\nLabel ["));
+ test.Printf(fieldSet[ii].Label());
+ test.Printf(_L("]\n"));
+ switch(fieldSet[ii].StorageType())
+ {
+ case KStorageTypeText:
+ {
+ DisplayField(ii, content, _L("Text"));
+ test.Printf(_L("\n"));
+ TPtrC fieldText=fieldSet[ii].TextStorage()->Text();
+// test.Printf(fieldText);
+ test.Printf(_L("\tLength = %d"),fieldText.Length());
+ }
+ break;
+ case KStorageTypeStore:
+ DisplayField(ii, content, _L("Store"));
+ break;
+ case KStorageTypeDateTime:
+ DisplayField(ii, content, _L("DateTime"));
+ break;
+ case KStorageTypeContactItemId:
+ DisplayField(ii, content, _L("ContactItemId"));
+ break;
+ default:
+ DisplayField(ii, content, _L("unknown"));
+ break;
+ }
+// test.Getch();
+ }
+ theid=iter.NextL();
+ CleanupStack::PopAndDestroy(); // contactItem
+ }
+ test.Printf(_L("\nEnd of the database\n"));
+ }
+
+LOCAL_C void AddLocalLabels()
+ {
+ TContactItemId theid;
+ TContactIter iter(*CntTest->Db());
+ theid=iter.FirstL();
+ while(theid!=KNullContactId )
+ {
+ CContactItem* contactItem=CntTest->Db()->OpenContactL(theid);
+ CleanupStack::PushL(contactItem);
+ CContactItemFieldSet& fieldSet=contactItem->CardFields();
+ TInt fieldcount=fieldSet.Count();
+ for (TInt ii=0;ii<fieldcount;ii=ii+2)
+ {
+ TPtrC labelName(_L("aTestLabelName"));
+ fieldSet[ii].SetLabelL(labelName);
+ }
+ theid=iter.NextL();
+ CntTest->Db()->CommitContactL(*contactItem);
+ CleanupStack::PopAndDestroy(); // contactitem
+ }
+ }
+
+LOCAL_C void DecAccessCount()
+ {
+ TContactItemId theid;
+ TContactIter iter(*CntTest->Db());
+ theid=iter.FirstL();
+ while(theid!=KNullContactId )
+ {
+ CContactItem* contactItem=CntTest->Db()->OpenContactL(theid);
+ CleanupStack::PushL(contactItem);
+ contactItem->DecAccessCount();
+ CntTest->Db()->CommitContactL(*contactItem);
+ theid=iter.NextL();
+ CleanupStack::PopAndDestroy(); // contactitem
+ }
+ }
+
+/*
+LOCAL_C void RemoveBlankFields(CContactItem &aItem)
+ {
+ CContactItemFieldSet& fieldSet=aItem.CardFields();
+ for(TInt loop1=0;loop1<fieldSet.Count();)
+ {
+ if (fieldSet[loop1].Storage()->IsFull())
+ loop1++;
+ else
+ fieldSet.Remove(loop1);
+ }
+ }
+
+LOCAL_C void TestExportCard(CContactItem &aItem, const CContactItem &aOriginal)
+ {
+ CContactItemFieldSet& fieldSet=aItem.CardFields();
+ CContactCard *origCopy=CContactCard::NewLC(&aOriginal);
+//
+ RemoveBlankFields(*origCopy);
+ RemoveBlankFields(aItem);
+ CContactItemFieldSet& origFieldSet=origCopy->CardFields();
+//
+ test(fieldSet.Count()==origFieldSet.Count());
+ for(TInt loop=0;loop<fieldSet.Count();loop++)
+ {
+ CContactItemField& field=fieldSet[loop];
+ CContactItemField& origField=origFieldSet[loop];
+ switch(field.StorageType())
+ {
+ case KStorageTypeText:
+ {
+ TPtrC fieldTxt(field.TextStorage()->Text());
+ TPtrC origFieldTxt(origField.TextStorage()->Text());
+ test(fieldTxt==origFieldTxt);
+ }
+ break;
+ case KStorageTypeDateTime:
+ {
+ const TDateTime dt1(field.DateTimeStorage()->Time().DateTime());
+ const TDateTime dt2(origField.DateTimeStorage()->Time().DateTime());
+ test(dt1.Year()==dt2.Year());
+ test(dt1.Month()==dt2.Month());
+ test(dt1.Day()==dt2.Day());
+ }
+ break;
+ case KStorageTypeStore:
+ case KStorageTypeContactItemId:
+ break;
+ }
+ CntTest->CompareFields(field,origField);
+ }
+ CleanupStack::PopAndDestroy(); // origCopy
+ }
+
+LOCAL_C void SetTestField(CContactItemFieldSet &aFieldSet,TInt aIndex, TBool aIsModifiedVersion)
+ {
+ CContactItemField& field=aFieldSet[aIndex];
+ switch(field.StorageType())
+ {
+ case KStorageTypeText:
+ {
+ TBuf<16> buf;
+ if (aIsModifiedVersion)
+ buf.Format(_L("TxtMod[%d]"),aIndex);
+ else
+ buf.Format(_L("Txt[%d]"),aIndex);
+ field.TextStorage()->SetTextL(buf);
+ }
+ break;
+ case KStorageTypeDateTime:
+ if (aIsModifiedVersion)
+ field.DateTimeStorage()->SetTime(TTime(aIndex*1000000));
+ else
+ field.DateTimeStorage()->SetTime(TTime(aIndex*2000000));
+ break;
+ case KStorageTypeStore:
+ case KStorageTypeContactItemId:
+ break;
+ }
+ }
+
+LOCAL_C void DuplicateTestField(CContactItemFieldSet &aFieldSet,TInt aIndex)
+ {
+ CContactItemField *field=CContactItemField::NewLC(aFieldSet[aIndex]);
+ aFieldSet.InsertL(aIndex+1,*field);
+ CleanupStack::Pop(); // field
+ }
+
+LOCAL_C void SetTestFields(CContactItem &aContact, TInt aTestNum, TUint aTestFlags, TBool aIsModifiedVersion)
+ {
+ if (aTestFlags&EImpExpTestMultipleEntries)
+ {
+ for(TInt loop=aTestNum;loop<aContact.CardFields().Count();loop+=(aTestNum+1))
+ SetTestField(aContact.CardFields(),loop,aIsModifiedVersion);
+ }
+ else
+ SetTestField(aContact.CardFields(),aTestNum,aIsModifiedVersion);
+ }
+
+LOCAL_C CContactItem* ReadContactIncHiddenFieldsLC(CContactDatabase* aDb, TContactItemId aContactId)
+ {
+ CContactItemViewDef *viewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EMaskFields,CContactItemViewDef::EIncludeHiddenFields);
+ CContactItem *contact=aDb->ReadContactL(aContactId,*viewDef);
+ CleanupStack::PopAndDestroy(); // viewDef
+ CleanupStack::PushL(contact);
+ return(contact);
+ }
+
+LOCAL_C void doTestExportImportContactL(CContactItem *aTemplateItem, TInt aTestNum, TUint aTestFlags)
+ {
+ CContactItem *originalContact=CContactCard::NewLC(aTemplateItem);
+ SetTestFields(*originalContact,aTestNum,aTestFlags,EFalse);
+ TContactItemId addId=CntTest->Db()->AddNewContactL(*originalContact);
+ CContactIdArray *ids=CContactIdArray::NewLC();
+ ids->AddL(addId);
+ const TInt KMaxFormats=8;
+ for(TInt format=0;format<KMaxFormats;format++)
+ {
+ TUint formatFlags=0;
+ if (format&0x1)
+ formatFlags|=CContactDatabase::EIncludeX;
+ if (format&0x2)
+ formatFlags|=CContactDatabase::ETTFormat;
+ if (format&0x4)
+ {
+ if (aTestFlags&EImpExpTestModifyEntries)
+ continue;
+ formatFlags|=CContactDatabase::EExcludeUid;
+ }
+ else if (!(formatFlags&CContactDatabase::ETTFormat))
+ continue;
+ CVCardTestStore* store=CntTest->ExportContactsLC(ids,formatFlags);
+//
+ if (aTestFlags&EImpExpTestModifyEntries)
+ {
+ CContactItem* modifyItem=CntTest->Db()->OpenContactLX(originalContact->Id());
+ CleanupStack::PushL(modifyItem);
+ SetTestFields(*modifyItem,aTestNum,aTestFlags,ETrue);
+ CntTest->Db()->CommitContactL(*modifyItem);
+ CleanupStack::PopAndDestroy(2); // modifyItem,modifyItem->Close()
+ }
+ if (aTestFlags&EImpExpTestExportExtraEntry)
+ {
+ CContactItem* modifyItem=CntTest->Db()->OpenContactLX(originalContact->Id());
+ CleanupStack::PushL(modifyItem);
+ SetTestFields(*modifyItem,(aTestNum+5)%10,0,EFalse);
+ SetTestFields(*modifyItem,(aTestNum+1)%10,0,EFalse);
+ CntTest->Db()->CommitContactL(*modifyItem);
+ CleanupStack::PopAndDestroy(2); // modifyItem,modifyItem->Close()
+ }
+//
+ CArrayPtr<CContactItem>* items=CntTest->ImportContactsLC(store,formatFlags);
+ test(items->Count()==1);
+ if (!(formatFlags&CContactDatabase::EExcludeUid))
+ TestExportCard(*(*items)[0],*originalContact);
+ TContactItemId addedId=(*items)[0]->Id();
+ CleanupStack::PopAndDestroy(); // items->ResetAndDestroy()
+ CContactItem *reloadedItem=ReadContactIncHiddenFieldsLC(CntTest->Db(),addedId);
+ TestExportCard(*reloadedItem,*originalContact);
+ CleanupStack::PopAndDestroy(); // reloadedItem
+ CleanupStack::PopAndDestroy(); // store
+ }
+ CleanupStack::PopAndDestroy(); // ids
+ CleanupStack::PopAndDestroy(); // originalContact
+//
+ CContactIdArray *deleteIds=CContactIdArray::NewLC(CntTest->Db()->SortedItemsL());
+ CntTest->Db()->DeleteContactsL(*deleteIds);
+ CleanupStack::PopAndDestroy(); // deleteIds
+//
+ if (CntTest->Db()->CompressRequired())
+ CntTest->Db()->CompressL();
+ test.Printf(_L(".")); // Just to show some life
+ }
+*/
+
+
+/**
+LOCAL_C void TestExportImportContactL()
+ {
+ test.Next(_L("Export/Import test"));
+
+ CContactDatabase *db=CntTest->CreateDatabaseL();
+ CContactItem *templateItem=ReadContactIncHiddenFieldsLC(db,db->TemplateId());
+ TInt templateFieldCount=templateItem->CardFields().Count();
+// Create an contact with all template entries doubled up
+ CContactItem *templateItem2=ReadContactIncHiddenFieldsLC(db,db->TemplateId());
+const TInt KNonDuplicateFields=5; // Names can not be duplicated
+ for(TInt dblLoop=KNonDuplicateFields;dblLoop<templateFieldCount;dblLoop++)
+ DuplicateTestField(templateItem2->CardFields(),dblLoop*2-KNonDuplicateFields);
+// Create an contact with just the fourth template entry doubled up
+ CContactItem *templateItem3=ReadContactIncHiddenFieldsLC(db,db->TemplateId());
+ DuplicateTestField(templateItem3->CardFields(),7);
+// Test all the fields 1 at a time
+ for(TInt loop1=0;loop1<templateFieldCount;loop1++)
+ {
+ doTestExportImportContactL(templateItem,loop1,0);
+ doTestExportImportContactL(templateItem2,loop1,0);
+ doTestExportImportContactL(templateItem3,loop1,0);
+// doTestExportImportContactL(templateItem,loop1,EImpExpTestExportExtraEntry);
+// doTestExportImportContactL(templateItem,loop1,EImpExpTestModifyEntries);
+// doTestExportImportContactL(templateItem2,loop1,EImpExpTestModifyEntries);
+// doTestExportImportContactL(templateItem3,loop1,EImpExpTestModifyEntries);
+ }
+// Test various combinations of fields being set
+// (Mode 0 will test a card with all fields set)
+ doTestExportImportContactL(templateItem2,0,EImpExpTestMultipleEntries|EImpExpTestModifyEntries);
+ for(TInt testNum=0;testNum<templateFieldCount;testNum++)
+ {
+ doTestExportImportContactL(templateItem,testNum,EImpExpTestMultipleEntries);
+ doTestExportImportContactL(templateItem2,testNum,EImpExpTestMultipleEntries);
+ doTestExportImportContactL(templateItem3,testNum,EImpExpTestMultipleEntries);
+ doTestExportImportContactL(templateItem,testNum,EImpExpTestMultipleEntries|EImpExpTestModifyEntries);
+// doTestExportImportContactL(templateItem2,testNum,EImpExpTestMultipleEntries|EImpExpTestModifyEntries);
+// doTestExportImportContactL(templateItem3,testNum,EImpExpTestMultipleEntries|EImpExpTestModifyEntries);
+// doTestExportImportContactL(templateItem,testNum,EImpExpTestMultipleEntries|EImpExpTestExportExtraEntry);
+ }
+//
+ CleanupStack::PopAndDestroy(3); // templateItem,templateItem2,templateItem3
+ CntTest->CloseDatabase();
+ }
+*/
+
+// modified since vCards which don't exist in the database are now added rather than leaving
+// this is necessary so that vcards of contacts with deleted uids are added.
+LOCAL_C void SynchWithNonExistentRecordL()
+ {
+ CntTest->CreateDatabaseL();
+ TContactItemId addId1=AddContactL(CntTest->Db(),KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("Add1"));
+//
+ CVCardTestStore* store=CntTest->ExportContactLC(addId1,CContactDatabase::ETTFormat);
+ CntTest->DeleteContact(addId1);
+ CArrayPtr<CContactItem>* items=NULL;
+ TRAPD(err, items=CntTest->ImportContactsL(store,CContactDatabase::ETTFormat));
+ test(err==KErrNone);
+ items->ResetAndDestroy();
+ delete items;
+//
+ CleanupStack::PopAndDestroy(); // store
+ CntTest->CloseDatabase();
+ }
+
+/*
+LOCAL_C void MergeBlankVCardL(TContactItemId aId)
+ {
+ CVCardTest *vtest=new(ELeave) CVCardTest;
+ CleanupStack::PushL(vtest);
+ RReadStream stream;
+ vtest->StreamLCC(stream,2,aId);
+ stream.PushL();
+ TBool success;
+ CArrayPtr<CContactItem>* items=CntTest->Db()->ImportContactsL(TUid::Uid(KUidVCardConvDefaultImpl),stream,success,0);
+ CleanupStack::PushL(TCleanupItem(CleanUpResetAndDestroy,items));
+ test(success);
+ CleanupStack::PopAndDestroy(4); // stream,store,vtest,items
+ }
+*/
+
+// This test doesn't do anything useful anymore - since vCalendar import to
+// change deleted contacts creates new contacts rather than updating them.
+//
+
+#if defined(_DEBUG)
+LOCAL_C void BlankImportL()
+ {
+ CntTest->CreateDatabaseL();
+ CntTest->Db()->OverrideMachineUniqueId(0); //testcode assumes that HAL would return 0
+ TContactItemId addId1=AddContactL(CntTest->Db(),KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("Add1"));
+ TContactItemId addId2=AddContactL(CntTest->Db(),KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("Add2"));
+ CntTest->AdjustContactAccessCountL(addId1,1);
+ CntTest->AdjustContactAccessCountL(addId2,1);
+//
+ CntTest->DeleteContact(addId1);
+ CntTest->CheckDeletedContact(addId1);
+// MergeBlankVCardL(addId1);
+ CntTest->CheckDeletedContact(addId1);
+ CntTest->AdjustContactAccessCountL(addId1,-1);
+ CntTest->CheckContactDoesNotExist(addId1);
+//
+// MergeBlankVCardL(addId2);
+ CntTest->DeleteContact(addId2);
+ CntTest->CheckDeletedContact(addId2);
+ CntTest->AdjustContactAccessCountL(addId2,-1);
+ CntTest->CheckContactDoesNotExist(addId2);
+//
+ CntTest->CloseDatabase();
+ }
+
+LOCAL_C void ExportImportDifferentMachineIds()
+ {
+ CntTest->CreateDatabaseL();
+ CntTest->Db()->OverrideMachineUniqueId(0x1);
+ TContactItemId addId1=AddContactL(CntTest->Db(),KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("Add1"));
+ HBufC *uid1=CntTest->ContactUidLC(addId1,0x1);
+ CVCardTestStore* store=CntTest->ExportContactLC(addId1,CContactDatabase::ETTFormat);
+ TInt oldCount=CntTest->Db()->CountL();
+//
+ CArrayPtr<CContactItem>* items=CntTest->ImportContactsLC(store,CContactDatabase::ETTFormat);
+ test(items->Count()==1);
+ CleanupStack::PopAndDestroy(2); // store,items
+ test(oldCount==CntTest->Db()->CountL());
+//
+ store=CntTest->ExportContactLC(addId1,CContactDatabase::ETTFormat);
+ CntTest->Db()->OverrideMachineUniqueId(0x2);
+ items=CntTest->ImportContactsLC(store,CContactDatabase::ETTFormat);
+ test(items->Count()==1);
+ TContactItemId importId=(*items)[0]->Id();
+ test((oldCount+1)==CntTest->Db()->CountL());
+ HBufC *uid2=CntTest->ContactUidLC(importId,0x2);
+ test(*uid1==*uid2);
+ CleanupStack::PopAndDestroy(3); // store,items,uid2
+//
+ store=CntTest->ExportContactLC(addId1,CContactDatabase::ETTFormat);
+ items=CntTest->ImportContactsLC(store,CContactDatabase::ETTFormat);
+ test(items->Count()==1);
+ CleanupStack::PopAndDestroy(2); // store,items
+ test((oldCount+1)==CntTest->Db()->CountL());
+//
+ store=CntTest->ExportContactLC(importId,CContactDatabase::ETTFormat);
+ items=CntTest->ImportContactsLC(store,CContactDatabase::ETTFormat);
+ test(items->Count()==1);
+ CleanupStack::PopAndDestroy(2); // store,items
+ test((oldCount+1)==CntTest->Db()->CountL());
+//
+ CleanupStack::PopAndDestroy(); // uid1
+ CntTest->CloseDatabase();
+ }
+
+#endif //(_DEBUG)
+
+LOCAL_C void DoTests1L()
+ {
+ // create test database
+ TheIds=CContactIdArray::NewLC();
+ CVersitTest* vtest=NULL;
+ vtest=new(ELeave)CVCardTest;
+ CleanupStack::PushL(vtest);
+ CVersitTest* vtest2=NULL;
+ vtest2=new(ELeave)CVCardTest;
+ CleanupStack::PushL(vtest2);
+ //Import
+ test.Next(_L("Importing vcard"));
+
+
+ CContactDatabase *db=CntTest->CreateDatabaseL();
+ test.Next(_L(""));
+
+// TInt64 machineUid = db->MachineId();
+
+
+ TBool success;
+ TUid vcardmode;
+ vcardmode.iUid=KUidVCardConvDefaultImpl;
+ RReadStream stream;
+ vtest->StreamLCC(stream,1,-1);
+ stream.PushL();
+ TheItems=db->ImportContactsL(vcardmode,stream,success,CContactDatabase::EIncludeX|CContactDatabase::EImportSingleContact|CContactDatabase::EIncreaseAccessCount);
+ test(success);
+ test(db->CountL()==2); // the first contact has an agent, that makes it 2
+ TheItems2=db->ImportContactsL(vcardmode,stream,success,CContactDatabase::EIncludeX|CContactDatabase::EIncreaseAccessCount);
+ test(success);
+
+ AddLocalLabels();
+ CleanupStack::PopAndDestroy(2); // stream,store
+ test(db->CountL()==3);
+ DisplayDatabase();
+ //Export
+ test.Next(_L("Exporting vcard"));
+
+ TStreamId id;
+ CFileStore* store ;
+ RStoreWriteStream outstream;
+ TUid uid;
+ /*= CDirectFileStore::ReplaceLC(CntTest->Fs(),_L("Versitout"),EFileWrite);
+ store->SetTypeL(KDirectFileStoreLayoutUid);
+ RStoreWriteStream outstream;
+ TStreamId id = outstream.CreateLC(*store);
+ //TUid uid;
+ uid.iUid=KUidVCardConvDefaultImpl;
+ TInt itemCount=TheItems->Count();
+ for (TInt ii=0;ii<itemCount;ii++)
+ TheIds->AddL((*TheItems)[ii]->Id());
+ db->ExportSelectedContactsL(uid,*TheIds,outstream,CContactDatabase::EDefault);
+ outstream.CommitL();
+ store->SetRootL(id);
+ store->CommitL();
+ CleanupStack::PopAndDestroy(2); // store+ oustream*/
+ //Update 2 (delete record 0)
+ test.Next(_L("Updating vcard 2"));
+
+ RReadStream stream2;
+ vtest2->StreamLCC(stream2,2,1);
+ stream2.PushL();
+ TheItems3=db->ImportContactsL(vcardmode,stream2,success,CContactDatabase::EIncreaseAccessCount);
+ test(success);
+ CleanupStack::PopAndDestroy(2); // stream,store
+ test(db->CountL()==2);
+//
+ CArrayFix<CContactDatabase::TSortPref>* sortOrder=new(ELeave) CArrayFixFlat<CContactDatabase::TSortPref>(1);
+ CleanupStack::PushL(sortOrder);
+ sortOrder->AppendL(CContactDatabase::TSortPref(KUidContactFieldFamilyName,CContactDatabase::TSortPref::EAsc));
+ db->SortL(sortOrder);
+ CleanupStack::Pop(); // sortOrder
+ sortOrder=new(ELeave) CArrayFixFlat<CContactDatabase::TSortPref>(1);
+ CleanupStack::PushL(sortOrder);
+ db->SortL(sortOrder);
+ CleanupStack::Pop(); // sortOrder
+//
+ DecAccessCount();
+ test(db->CountL()==2);
+ //Export again
+ test.Next(_L("Exporting vcard"));
+
+ TheIds->Reset();
+ TheIds->AddL(2);// zzz shouldn't be hardwired value
+ store = CDirectFileStore::ReplaceLC(CntTest->Fs(),_L("c:\\Versitoutb"),EFileWrite);
+ store->SetTypeL(KDirectFileStoreLayoutUid);
+ id = outstream.CreateLC(*store);
+ uid.iUid=KUidVCardConvDefaultImpl;
+ db->ExportSelectedContactsL(uid,*TheIds,outstream,CContactDatabase::EIncludeX);
+ outstream.CommitL();
+ store->SetRootL(id);
+ store->CommitL();
+ CleanupStack::PopAndDestroy(2); // store+ oustream
+
+ if (TheItems)
+ TheItems->ResetAndDestroy();
+ delete TheItems;
+ if (TheItems2)
+ TheItems2->ResetAndDestroy();
+ delete TheItems2;
+ if (TheItems3)
+ TheItems3->ResetAndDestroy();
+ delete TheItems3;
+
+ CleanupStack::PopAndDestroy(2); // vtest, vtest2
+ CleanupStack::PopAndDestroy(); //TheIds
+//
+ CVCardTest *vtest3=new(ELeave) CVCardTest;
+ CleanupStack::PushL(vtest3);
+ test.Next(_L("Multiple card import"));
+
+ RReadStream stream3;
+ vtest3->StreamLCC(stream3,3,-1);
+ stream3.PushL();
+ TInt oldCount=db->CountL();
+ TheItems4=db->ImportContactsL(vcardmode,stream3,success,CContactDatabase::EIncreaseAccessCount);
+ test(success);
+ CleanupStack::PopAndDestroy(2); // stream3,store
+ test(TheItems4->Count()==2);
+ test(db->CountL()==(oldCount+TheItems4->Count()));
+ CleanupStack::PopAndDestroy(); // vtest3
+//
+ TheItems4->ResetAndDestroy();
+ delete TheItems4;
+ CntTest->CloseDatabase();
+ }
+
+LOCAL_C void TestIncludeXL()
+ {
+ CContactDatabase *db=CntTest->CreateDatabaseL();
+ CntTest->DeleteAllTemplateFieldsL();
+ CContactCard *item=CContactCard::NewLC();
+ SetNameL(*item,KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("FamilyName"),ETrue);
+ SetNameL(*item,KUidContactFieldNote,KUidContactFieldVCardMapNOTE,_L("Note"),ETrue);
+ SetNameL(*item,KUidContactFieldJobTitle,KUidContactFieldVCardMapTITLE,_L("Job Title"),ETrue);
+ SetNameL(*item,KUidContactFieldPhoneNumber,KUidContactFieldVCardMapTEL,_L("Tel"),ETrue);
+ CContactItemFieldSet& fieldSet=item->CardFields();
+ fieldSet[3].SetHidden(ETrue); // zzz if set to 0 fails, names don't support hidden flag
+ fieldSet[1].SetReadOnly(ETrue);
+ fieldSet[2].SetHidden(ETrue);
+ fieldSet[2].SetReadOnly(ETrue);
+ fieldSet[0].SetLabelL(_L("Field 0 Label"));
+ fieldSet[1].SetLabelL(_L("Field 1 Label"));
+ fieldSet[2].SetLabelL(_L("Field 2 Label"));
+ fieldSet[3].SetLabelL(_L("Field 3 Label"));
+ TContactItemId addId1=db->AddNewContactL(*item);
+//
+ CVCardTestStore* store=CntTest->ExportContactLC(addId1,CContactDatabase::EIncludeX|CContactDatabase::EExcludeUid,KVCardStoreTypeFile,9);
+
+ CArrayPtr<CContactItem>* importedItems=CntTest->ImportContactsLC(store,CContactDatabase::EIncludeX|CContactDatabase::EExcludeUid);
+ test(CompareItemFields((*importedItems)[0],item));
+ CleanupStack::PopAndDestroy(2); // importedItems,store
+//
+ CleanupStack::PopAndDestroy(); // item
+//
+ CntTest->CloseDatabase();
+ }
+
+void createTestVCardL(RFs& aFs)
+ {
+ RFile file;
+ TInt err=file.Replace(aFs, KVCardFileToImport, EFileWrite+EFileShareAny+EFileStreamText);
+ User::LeaveIfError(err);
+ TPtrC8 content((const TText8*) "BEGIN:VCARD\r\n"
+ "VERSION:2.1\r\n"
+ "REV:20020520T134824Z\r\n"
+ "N:smith;john;;;\r\n"
+ "TEL;HOME;VOICE:020 8450 1537\r\n"
+ "END:VCARD\r\n");
+ file.Write(content);
+ file.Close();
+ }
+
+TContactItemId ImportVCalL(CContactDatabase* aDb,RFs& aFs,TBool aUseNullTemplateId = EFalse)
+ {
+ RFileReadStream vcard;
+ User::LeaveIfError(vcard.Open(aFs, KVCardFileToImport, EFileRead));
+ CleanupClosePushL(vcard);
+
+ TBool success=EFalse;
+ TInt options=0;
+ options |= CContactDatabase::EImportSingleContact;
+ if (aUseNullTemplateId)
+ {
+ options |= CContactDatabase::ENullTemplateId;
+ }
+ CArrayPtr<CContactItem>* contactItems=aDb->ImportContactsL(TUid::Uid(KUidVCardConvDefaultImpl), vcard, success, options);
+ CleanupStack::PopAndDestroy(&vcard);
+ TContactItemId id=(*contactItems)[0]->Id();
+ contactItems->ResetAndDestroy();
+ delete contactItems;
+ return id;
+ }
+
+#if defined(_DEBUG)
+LOCAL_C void TestImportWithNullTemplateIdL()
+ {
+ CntTest->CreateDatabaseL();
+//
+ // Get the number of fields in the golden template
+ CContactItem* item = CntTest->Db()->ReadContactLC(KGoldenTemplateId);
+ TInt goldenTemplateCount = item->CardFields().Count();
+ CleanupStack::PopAndDestroy(item);
+//
+ // Test fields imported using golden template
+ createTestVCardL(CntTest->Fs());
+ TContactItemId id = ImportVCalL(CntTest->Db(),CntTest->Fs());
+ item = CntTest->Db()->ReadContactLC(id);
+ test(item->CardFields().Count() == goldenTemplateCount);
+ CleanupStack::PopAndDestroy(item);
+//
+ // Test fields imported using null template
+ createTestVCardL(CntTest->Fs());
+ id = ImportVCalL(CntTest->Db(),CntTest->Fs(),ETrue);
+ item = CntTest->Db()->ReadContactLC(id);
+ test(item->CardFields().Count() == 3); // number of fields in vCard
+ CleanupStack::PopAndDestroy(item);
+//
+ CntTest->Fs().Delete(KVCardFileToImport);
+ CntTest->CloseDatabase();
+ }
+
+LOCAL_C void TestsAccessCountL()
+ {
+ CntTest->OpenDatabaseL();
+ TContactItemId addId1=AddContactL(CntTest->Db(),KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("Add1"));
+ CContactIdArray *ids=CContactIdArray::NewLC();
+ ids->AddL(addId1);
+//
+ CntTest->TestAccessCount(addId1,0);
+ CVCardTestStore* store1=CntTest->ExportContactsLC(ids,CContactDatabase::EIncreaseAccessCount);
+ CntTest->TestAccessCount(addId1,1);
+ CntTest->ImportContactsLC(store1,CContactDatabase::EIncreaseAccessCount);
+ CleanupStack::PopAndDestroy(2); // items->ResetAndDestroy(),store1
+ CntTest->TestAccessCount(addId1,2);
+//
+ CVCardTestStore* store2=CntTest->ExportContactsLC(ids,CContactDatabase::EDecreaseAccessCount);
+ CntTest->TestAccessCount(addId1,1);
+ CntTest->ImportContactsLC(store2,CContactDatabase::EDecreaseAccessCount);
+ CleanupStack::PopAndDestroy(2); // items->ResetAndDestroy(),store2
+ CntTest->TestAccessCount(addId1,0);
+ CleanupStack::PopAndDestroy(); // ids
+//
+ TContactItemId addId2=AddContactL(CntTest->Db(),KUidContactFieldFamilyName,KUidContactFieldVCardMapUnusedN,_L("Add1"));
+ ids=CContactIdArray::NewLC();
+ ids->AddL(addId2);
+//
+ CntTest->TestAccessCount(addId2,0);
+ CntTest->ExportContactsLC(ids,CContactDatabase::EIncreaseAccessCount);
+ CleanupStack::PopAndDestroy(2); // ids,store from ExportContactsLC
+ CntTest->TestAccessCount(addId2,1);
+//
+ CVCardTest *vtest=new(ELeave) CVCardTest;
+ CleanupStack::PushL(vtest);
+ RReadStream stream;
+ vtest->StreamLCC(stream,2,addId2);
+ stream.PushL();
+ TBool success;
+ CntTest->Db()->OverrideMachineUniqueId(0); //testcode assumes that HAL would return 0
+ CArrayPtr<CContactItem>* items=CntTest->Db()->ImportContactsL(TUid::Uid(KUidVCardConvDefaultImpl),stream,success,CContactDatabase::EDecreaseAccessCount);
+ CleanupStack::PushL(TCleanupItem(CleanUpResetAndDestroy,items));
+ CntTest->CheckContactDoesNotExist(addId2);
+ CleanupStack::PopAndDestroy(4); // stream,store,vtest,items
+//
+ CntTest->CloseDatabase();
+ }
+
+#endif //(_DEBUG)
+
+/**
+
+@SYMTestCaseID PIM-T-VERS-0001
+
+*/
+
+LOCAL_C void DoTestsL()
+ {
+ test.Start(_L("@SYMTESTCaseID:PIM-T-VERS-0001 Preparing tests"));
+
+
+ CTestRegister * TempFiles = CTestRegister::NewLC();
+ TempFiles->RegisterL(KDatabaseFileName, EFileTypeCnt);
+ TempFiles->RegisterL(KVCardFileToImport);
+ TempFiles->RegisterL(_L("c:\\versit2"));
+ TempFiles->RegisterL(_L("c:\\versitin1"));
+ TempFiles->RegisterL(_L("c:\\versitin2"));
+ TempFiles->RegisterL(_L("c:\\versitin3"));
+ TempFiles->RegisterL(_L("c:\\versitfile"));
+ TempFiles->RegisterL(_L("c:\\vcard.vcf"));
+ TempFiles->RegisterL(_L("c:\\versitoutb"));
+
+ DoTests1L();
+#if defined(_DEBUG)
+ TestsAccessCountL();
+ ExportImportDifferentMachineIds();
+#endif
+ SynchWithNonExistentRecordL();
+#if defined(_DEBUG)
+ BlankImportL();
+#endif
+ TestIncludeXL();
+#if defined(_DEBUG)
+ TestImportWithNullTemplateIdL();
+#endif
+// TestExportImportContactL();
+
+ CleanupStack::PopAndDestroy(TempFiles);
+ }
+
+GLDEF_C TInt E32Main()
+ {
+ CntTest=new(ELeave) CCntTest;
+ CntTest->ConstructL(test,KDatabaseFileName);
+ TRAPD(err,DoTestsL());
+ CntTest->EndTestLib(err);
+ return KErrNone;
+ }