diff -r d4f567ce2e7c -r 5b6f26637ad3 phonebookengines_old/contactsmodel/tsrc/T_VIEW.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookengines_old/contactsmodel/tsrc/T_VIEW.CPP Tue Aug 31 15:05:21 2010 +0300 @@ -0,0 +1,657 @@ +// 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 +#include +#include +#include +#include +#include +#include +#include +#include "T_UTILS.H" +#include + +CCntTest* CntTest=NULL; + +LOCAL_D RTest test(_L("T_VIEW")); +LOCAL_D CContactDatabase* TheDb; +LOCAL_D TContactItemId TheId; + +const TPtrC KDatabaseFileName=_L("C:T_VIEW"); + +const TPtrC KDateFormatText1=_L("%1/%2/%3"); +const TPtrC KDateFormatText2=_L("AbcdefghijklmNopqrstuvwxyz%1/%2/%3AbcdefghijklmNopqrstuvwxyz1234567890"); // Should be long enough to overflow a TTextFieldMinimal buf + +LOCAL_C void CreateView1L() + { + CContactItemViewDef* viewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EMaskHiddenFields); + viewDef->AddL(KUidContactFieldGivenName); + viewDef->AddL(KUidContactFieldFamilyName); + viewDef->AddL(KUidContactFieldPhoneNumber); + viewDef->AddL(KUidContactFieldCompanyName); + viewDef->AddL(KUidContactFieldAddress); + test(viewDef->Count()==5); + test((*viewDef)[0]==KUidContactFieldGivenName); + test((*viewDef)[1]==KUidContactFieldFamilyName); + test((*viewDef)[2]==KUidContactFieldPhoneNumber); + test((*viewDef)[3]==KUidContactFieldCompanyName); + test((*viewDef)[4]==KUidContactFieldAddress); + TInt index=viewDef->Find(KUidContactFieldCompanyName); + test(index!=KErrNotFound); + viewDef->Remove(index); + test(viewDef->Find(KUidContactFieldCompanyName)==KErrNotFound); + test(viewDef->Count()==4); + viewDef->Remove(KUidContactFieldPhoneNumber); + test(viewDef->Find(KUidContactFieldPhoneNumber)==KErrNotFound); + test(viewDef->Count()==3); + viewDef->Reset(); + test(viewDef->Count()==0); + CleanupStack::PopAndDestroy(); // viewDef + } + +LOCAL_C void CreateView2L() + { + CContactItemViewDef* viewDef=CContactItemViewDef::NewL(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EMaskHiddenFields); + CleanupStack::PushL(viewDef); + viewDef->AddL(KUidContactFieldPhoneNumber); + viewDef->AddL(KUidContactFieldPrefixName); + viewDef->AddL(KUidContactFieldCompanyName); + viewDef->AddL(KUidContactFieldGivenName); + test(viewDef->Count()==4); + test(viewDef->Find(KUidContactFieldPhoneNumber)!=KErrNotFound); + test(viewDef->Find(KUidContactFieldPhoneNumber)!=KErrNotFound); + test(viewDef->Find(KUidContactFieldMatchAll)!=KErrNotFound); + test(viewDef->Find(KUidContactFieldSuffixName)==KErrNotFound); + test(viewDef->Find(KUidContactFieldPrefixName)!=KErrNotFound); + test(viewDef->Find(KUidContactFieldCompanyName)!=KErrNotFound); + test(viewDef->Use()==CContactItemViewDef::EIncludeFields); + viewDef->SetUse(CContactItemViewDef::EMaskFields); + test(viewDef->Use()==CContactItemViewDef::EMaskFields); + CleanupStack::PopAndDestroy(); // viewDef + } + +LOCAL_C void PopulateDatabaseL() + { + CContactItem* item=CContactCard::NewLC(); + CContactItemField* field=CContactItemField::NewLC(KStorageTypeText,KUidContactFieldCompanyName); + field->SetMapping(KUidContactFieldVCardMapORG); + field->TextStorage()->SetTextL(_L("x")); + item->AddFieldL(*field); + CleanupStack::Pop(); // field + field=CContactItemField::NewLC(KStorageTypeText,KUidContactFieldPhoneNumber); + field->SetMapping(KUidContactFieldVCardMapTEL); + field->TextStorage()->SetTextL(_L("x")); + item->AddFieldL(*field); + CleanupStack::Pop(); // field + field=CContactItemField::NewLC(KStorageTypeText,KUidContactFieldPhoneNumber); + field->SetMapping(KUidContactFieldVCardMapTEL); + field->TextStorage()->SetTextL(_L("x")); + item->AddFieldL(*field); + CleanupStack::Pop(); // field + field=CContactItemField::NewLC(KStorageTypeText,KUidContactFieldPhoneNumber); + field->SetMapping(KUidContactFieldVCardMapTEL); + field->TextStorage()->SetTextL(_L("x")); + item->AddFieldL(*field); + CleanupStack::Pop(); // field + field=CContactItemField::NewLC(KStorageTypeText,KUidContactFieldPhoneNumber); + field->SetMapping(KUidContactFieldVCardMapTEL); + field->SetHidden(ETrue); + field->TextStorage()->SetTextL(_L("x")); + item->AddFieldL(*field); + CleanupStack::Pop(); // field + field=CContactItemField::NewLC(KStorageTypeText,KUidContactFieldSuffixName); + field->SetMapping(KUidContactFieldVCardMapUnusedN); + field->TextStorage()->SetTextL(_L("x")); + item->AddFieldL(*field); + CleanupStack::Pop(); // field + field=CContactItemField::NewLC(KStorageTypeText,KUidContactFieldPrefixName); + field->SetMapping(KUidContactFieldVCardMapUnusedN); + field->TextStorage()->SetTextL(_L("x")); + item->AddFieldL(*field); + CleanupStack::Pop(); // field + + TheId=TheDb->AddNewContactL(*item); + CleanupStack::PopAndDestroy(); // item + } + +LOCAL_C void SetViewsL() + { + CContactItem* item=TheDb->ReadContactLC(TheId); + test(item->CardFields().Count()==6); + CleanupStack::PopAndDestroy(); // item + CContactItemViewDef* viewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EMaskHiddenFields); + viewDef->AddL(KUidContactFieldPhoneNumber); + viewDef->AddL(KUidContactFieldCompanyName); + CContactViewDef* def=CContactViewDef::NewLC(viewDef); + CleanupStack::Pop(); // viewDef + + // Try setting to null. Should do nothing but shouldn't crash. + TheDb->SetViewDefinitionL( NULL ); + + TheDb->SetViewDefinitionL(def); + CleanupStack::Pop(); // def + item=TheDb->ReadContactLC(TheId); + test(item->CardFields().Count()==4); + CleanupStack::PopAndDestroy(); // item + + viewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EIncludeHiddenFields); + viewDef->AddL(KUidContactFieldPhoneNumber); + viewDef->AddL(KUidContactFieldCompanyName); + def=CContactViewDef::NewLC(viewDef); + CleanupStack::Pop(); // viewDef + TheDb->SetViewDefinitionL(def); + CleanupStack::Pop(); // def + item=TheDb->ReadContactLC(TheId); + CleanupStack::PopAndDestroy(); // item + + viewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EIncludeHiddenFields); + viewDef->AddL(KUidContactFieldPhoneNumber); + def=CContactViewDef::NewLC(viewDef); + CleanupStack::Pop(); // viewDef + TheDb->SetViewDefinitionL(def); + CleanupStack::Pop(); // def + item=TheDb->ReadContactLC(TheId); + test(item->CardFields().Count()==4); + CleanupStack::PopAndDestroy(); // item + + viewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EMaskHiddenFields); + viewDef->AddL(KUidContactFieldPhoneNumber); + viewDef->AddL(KUidContactFieldCompanyName); + def=CContactViewDef::NewLC(viewDef); + CleanupStack::Pop(); // viewDef + TheDb->SetViewDefinitionL(def); + CleanupStack::Pop(); // def + item=TheDb->ReadContactLC(TheId); + test(item->CardFields().Count()==4); + CleanupStack::PopAndDestroy(); // item + + viewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EMaskHiddenFields); + viewDef->AddL(KUidContactFieldFamilyName); + def=CContactViewDef::NewLC(viewDef); + CleanupStack::Pop(); // viewDef + TheDb->SetViewDefinitionL(def); + CleanupStack::Pop(); // def + item=TheDb->ReadContactLC(TheId); + test(item->CardFields().Count()==0); + CleanupStack::PopAndDestroy(); // item + } + +LOCAL_C void SetMaskedViewsL() + { + CContactItemViewDef* viewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EMaskFields,CContactItemViewDef::EMaskHiddenFields); + viewDef->AddL(KUidContactFieldPhoneNumber); + viewDef->AddL(KUidContactFieldCompanyName); + CContactViewDef* def=CContactViewDef::NewLC(viewDef); + CleanupStack::Pop(); // viewDef + TheDb->SetViewDefinitionL(def); + CleanupStack::Pop(); // def + CContactItem* item=TheDb->ReadContactLC(TheId); + test(item->CardFields().Count()==2); + CleanupStack::PopAndDestroy(); // item + + viewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EMaskFields,CContactItemViewDef::EMaskHiddenFields); + viewDef->AddL(KUidContactFieldPhoneNumber); + viewDef->AddL(KUidContactFieldCompanyName); + def=CContactViewDef::NewLC(viewDef); + CleanupStack::Pop(); // viewDef + TheDb->SetViewDefinitionL(def); + CleanupStack::Pop(); // def + item=TheDb->ReadContactLC(TheId); + test(item->CardFields().Count()==2); + CleanupStack::PopAndDestroy(); // item + + viewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EMaskFields,CContactItemViewDef::EMaskHiddenFields); + viewDef->AddL(KUidContactFieldPhoneNumber); + viewDef->AddL(KUidContactFieldCompanyName); + def=CContactViewDef::NewLC(viewDef); + CleanupStack::Pop(); // viewDef + TheDb->SetViewDefinitionL(def); + CleanupStack::Pop(); // def + item=TheDb->ReadContactLC(TheId); + test(item->CardFields().Count()==2); + CleanupStack::PopAndDestroy(); // item + + viewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EMaskFields,CContactItemViewDef::EMaskHiddenFields); + viewDef->AddL(KUidContactFieldNone); + def=CContactViewDef::NewLC(viewDef); + CleanupStack::Pop(); // viewDef + TheDb->SetViewDefinitionL(def); + CleanupStack::Pop(); // def + item=TheDb->ReadContactLC(TheId); + test(item->CardFields().Count()==6); + CleanupStack::PopAndDestroy(); // item + + viewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EMaskFields,CContactItemViewDef::EMaskHiddenFields); + viewDef->AddL(KUidContactFieldNone); + def=CContactViewDef::NewLC(viewDef); + CleanupStack::Pop(); // viewDef + TheDb->SetViewDefinitionL(def); + CleanupStack::Pop(); // def + item=TheDb->ReadContactLC(TheId); + test(item->CardFields().Count()==6); + CleanupStack::PopAndDestroy(); // item + + viewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EMaskFields,CContactItemViewDef::EMaskHiddenFields); + viewDef->AddL(KUidContactFieldNone); + def=CContactViewDef::NewLC(viewDef); + CleanupStack::Pop(); // viewDef + TheDb->SetViewDefinitionL(def); + CleanupStack::Pop(); // def + item=TheDb->ReadContactLC(TheId); + test(item->CardFields().Count()==6); + CleanupStack::PopAndDestroy(); // item + + viewDef=CContactItemViewDef::NewLC(CContactItemViewDef::EMaskFields,CContactItemViewDef::EMaskHiddenFields); + viewDef->AddL(KUidContactFieldMatchAll); + def=CContactViewDef::NewLC(viewDef); + CleanupStack::Pop(); // viewDef + TheDb->SetViewDefinitionL(def); + CleanupStack::Pop(); // def + item=TheDb->ReadContactLC(TheId); + test(item->CardFields().Count()==0); + CleanupStack::PopAndDestroy(); // item + } + +LOCAL_C void SetNameL(CContactItem& aItem,TUid aFieldType,const TDesC& aName) + { + CContactItemField* field=CContactItemField::NewLC(KStorageTypeText,aFieldType); + field->SetMapping(KUidContactFieldVCardMapUnusedN); + field->TextStorage()->SetTextL(aName); + aItem.AddFieldL(*field); + CleanupStack::Pop(); // field + } + +LOCAL_C void SetTimeDateL(CContactItem& aItem,TUid aFieldType,TTime aTime) + { + CContactItemField* field=CContactItemField::NewLC(KStorageTypeDateTime,aFieldType); + field->SetMapping(KUidContactFieldVCardMapUnusedN); + field->DateTimeStorage()->SetTime(aTime); + aItem.AddFieldL(*field); + CleanupStack::Pop(); // field + } + +LOCAL_C void doTestTextDefinitionL(TBool aPreLoadTest, TContactItemId aTextDefItem, TContactTextDefItem aItem1, TContactTextDefItem aItem2, TContactTextDefItem aItem3, TContactTextDefItem aItem4, TFieldType aFieldType, const TDesC &aTestText) + { + CContactItem *item=NULL; + if (aPreLoadTest) + item=TheDb->ReadContactLC(aTextDefItem); + CContactTextDef *textDef=CContactTextDef::NewLC(); + if (aItem1.iFieldType!=KNullUid) + textDef->AppendL(aItem1); + if (aItem2.iFieldType!=KNullUid) + textDef->AppendL(aItem2); + if (aItem3.iFieldType!=KNullUid) + textDef->AppendL(aItem3); + if (aItem4.iFieldType!=KNullUid) + textDef->AppendL(aItem4); + if (aFieldType!=KUidContactFieldNone) + textDef->SetFallbackField(aFieldType); + if (aItem1.iFieldType!=KNullUid) + { + test((*textDef)[0].iFieldType==aItem1.iFieldType); + test((*textDef)[0].iSeperator==aItem1.iSeperator); + } + if (aItem2.iFieldType!=KNullUid) + { + test((*textDef)[1].iFieldType==aItem2.iFieldType); + test((*textDef)[1].iSeperator==aItem2.iSeperator); + } + if (aItem3.iFieldType!=KNullUid) + { + test((*textDef)[2].iFieldType==aItem3.iFieldType); + test((*textDef)[2].iSeperator==aItem3.iSeperator); + } + if (aItem4.iFieldType!=KNullUid) + { + test((*textDef)[3].iFieldType==aItem4.iFieldType); + test((*textDef)[3].iSeperator==aItem4.iSeperator); + } +// + TText chars[0x100]; + for(TInt length=0;length<=aTestText.Length();length++) + { + Mem::FillZ(&chars[0],sizeof(chars)); + TPtr ptr(&chars[0],length); + if (item) + TheDb->ReadContactTextDefL(*item,ptr,textDef); + else + TheDb->ReadContactTextDefL(aTextDefItem,ptr,textDef); + test(ptr==aTestText.Left(length)); + } +// + TheDb->SetTextDefinitionL(textDef); + CleanupStack::Pop(); // textDef + TBuf<0x100> buf1; + if (item) + TheDb->ReadContactTextDefL(*item,buf1); + else + TheDb->ReadContactTextDefL(aTextDefItem,buf1); + test(buf1==aTestText); + TheDb->SetTextDefinitionL(NULL); + if (aPreLoadTest) + CleanupStack::PopAndDestroy(); // item + } + +LOCAL_C void TestTextDefinitionL(TContactItemId aTextDefItem, TContactTextDefItem aItem1, TContactTextDefItem aItem2, TContactTextDefItem aItem3, TContactTextDefItem aItem4, TFieldType aFieldType, const TDesC &aTestText) + { + doTestTextDefinitionL(EFalse, aTextDefItem, aItem1, aItem2, aItem3, aItem4, aFieldType, aTestText); + doTestTextDefinitionL(ETrue, aTextDefItem, aItem1, aItem2, aItem3, aItem4, aFieldType, aTestText); + } + +LOCAL_C void TestContactTextDefL() + { + CContactTextDef* textDef1=CContactTextDef::NewL(); + delete textDef1; + CContactTextDef* textDef2=CContactTextDef::NewLC(); + CleanupStack::PopAndDestroy(); // textDef2 + textDef2=NULL; // to shut unused warning up +// + CContactItem* item=CContactCard::NewLC(); + SetNameL(*item,KUidContactFieldGivenName,_L("Given")); + SetNameL(*item,KUidContactFieldFamilyName,_L("Family")); + SetNameL(*item,KUidContactFieldSuffixName,_L("Suffix")); + SetNameL(*item,KUidContactFieldCompanyName,_L("Company")); + SetNameL(*item,KUidContactFieldNote,_L("Two line\nnote")); + TTime testTime(TDateTime(2001,EJuly,15,18,0,0,0)); + SetTimeDateL(*item,KUidContactFieldBirthday,testTime); + TheDb->SetDateFormatTextL(KDateFormatText1); + TContactItemId textDefItem=TheDb->AddNewContactL(*item); + CleanupStack::PopAndDestroy(); // item +// + CContactItemViewDef *itemDef=CContactItemViewDef::NewLC(CContactItemViewDef::EIncludeFields,CContactItemViewDef::EMaskHiddenFields); + itemDef->AddL(KUidContactFieldMatchAll); + CContactViewDef *def=CContactViewDef::NewL(itemDef); + CleanupStack::Pop(); // itemDef + CleanupStack::PushL(def); + TheDb->SetViewDefinitionL(def); + CleanupStack::Pop(); // def +// + TestTextDefinitionL(textDefItem, + TContactTextDefItem(KUidContactFieldAdditionalName,_L(",")), + TContactTextDefItem(KUidContactFieldCompanyName), + TContactTextDefItem(), + TContactTextDefItem(), + KUidContactFieldNone, + _L("Company")); +// + TestTextDefinitionL(textDefItem, + TContactTextDefItem(KUidContactFieldGivenName,_L("<-->")), + TContactTextDefItem(KUidContactFieldFamilyName), + TContactTextDefItem(), + TContactTextDefItem(), + KUidContactFieldNone, + _L("Given<-->Family")); +// + TestTextDefinitionL(textDefItem, + TContactTextDefItem(KUidContactFieldFamilyName,_L(", ")), + TContactTextDefItem(KUidContactFieldGivenName,_L("")), + TContactTextDefItem(KUidContactFieldCompanyName), + TContactTextDefItem(), + KUidContactFieldNone, + _L("Family, GivenCompany")); +// + TestTextDefinitionL(textDefItem, + TContactTextDefItem(KUidContactFieldNote,_L(", ")), + TContactTextDefItem(KUidContactFieldGivenName,_L("")), + TContactTextDefItem(KUidContactFieldCompanyName), + TContactTextDefItem(), + KUidContactFieldSuffixName, + _L("Two line, GivenCompany")); +// + TestTextDefinitionL(textDefItem, // None of these fields exist in the DB + TContactTextDefItem(KUidContactFieldAdditionalName,_L("")), + TContactTextDefItem(KUidContactFieldAddress,_L("----")), + TContactTextDefItem(KUidContactFieldPrefixName), + TContactTextDefItem(), + KUidContactFieldNone, + _L("Given")); + TestTextDefinitionL(textDefItem, // None of these fields exist in the DB, fall back to suffix + TContactTextDefItem(KUidContactFieldAdditionalName,_L("")), + TContactTextDefItem(KUidContactFieldAddress,_L("----")), + TContactTextDefItem(KUidContactFieldPrefixName), + TContactTextDefItem(), + KUidContactFieldSuffixName, + _L("Suffix")); +// + TestTextDefinitionL(textDefItem, // None of these fields exist in the DB, and no fallback field Ivor. + TContactTextDefItem(KUidContactFieldAdditionalName,_L("")), + TContactTextDefItem(KUidContactFieldAddress,_L("----")), + TContactTextDefItem(KUidContactFieldPrefixName), + TContactTextDefItem(), + KUidContactFieldNone, + _L("Given")); +// + TestTextDefinitionL(textDefItem, // None of these fields exist in the DB, including the fallback field. + TContactTextDefItem(KUidContactFieldAdditionalName,_L("")), + TContactTextDefItem(KUidContactFieldAddress,_L("----")), + TContactTextDefItem(KUidContactFieldPrefixName), + TContactTextDefItem(), + KUidContactFieldSms, + _L("Given")); + +// +// + TheDb->SetTextDefinitionL(NULL); + } + + +// Test for Defect INC066425 ContactDatabase::SetViewDefinitionL panic +// This tests that when a view is defined to exclude all fields in the empty array (count=0) +// that there is NO panic. +// The original test done in CContactDatabase::SetViewDefinitionL for the panic was not valid: + +LOCAL_C void TestSetViewDefinitionPanicL() + { + CContactItemViewDef* contactItemViewDef = CContactItemViewDef::NewLC( CContactItemViewDef::EMaskFields, CContactItemViewDef::EIncludeHiddenFields ) ; + CContactViewDef* cvd = CContactViewDef::NewLC( contactItemViewDef ) ; + CleanupStack::Pop(); // contactItemViewDef + TheDb->SetViewDefinitionL( cvd ) ; + CleanupStack::Pop(); // cvd + } + +// Contact view obverser class used by TestOOMOnServerSideL. +class CntViewObserver : public MContactViewObserver + { +public: + void HandleContactViewEvent(const CContactViewBase &aView, const TContactViewEvent &aEvent); + }; + +void CntViewObserver::HandleContactViewEvent(const CContactViewBase& /*aView*/, const TContactViewEvent& /*aEvent*/) + { + CActiveScheduler::Stop(); + } + +#if defined(_DEBUG) +// Wait for server exit which is used by TestOOMOnServerSideL. +LOCAL_C void WaitForServerToExit() + { + TInt findProcessResult(KErrNone); + + // The name of the CntSrv process includes its uid like this [10003a73] + TFindProcess findProcess(_L("*[10003a73]*")); + TFullName fullName; + + findProcessResult = findProcess.Next(fullName); + while(findProcessResult == KErrNone) + { + // the CntSrv process is running so wait + RProcess process; + if (process.Open(fullName) == KErrNone) + { + //process.Kill(0); + TRequestStatus status; + process.Logon(status); // ask for a callback when the process ends + User::WaitForRequest(status); + User::LeaveIfError(status.Int()); + test.Printf(_L("*** The CntSrv process has been stopped ***\n")); + process.Close(); + } + + findProcessResult = findProcess.Next(fullName); + } + + } +#endif + +#define HEAPFAIL_RATE_START 560 //The rate just start to triger OOM fail in CViewIteratorManager::CreateViewFromMultipleTablesL +#define HEAPFAIL_RATE_END 570 //The rate just end of trigering OOM fail in CViewIteratorManager::CreateViewFromMultipleTablesL + +#if defined(_DEBUG) +// Test for Defect DEF086689 Remote view server-side memory leak +// This tests is to check if there is any memory leak on server side when creating a remote view. +LOCAL_C void TestOOMOnServerSideL(TBool aRemoteView) + { + CntViewObserver observer; + RContactViewSortOrder contactViewSortOrder; + contactViewSortOrder.AppendL( KUidContactFieldAddress ); + contactViewSortOrder.AppendL( KUidContactFieldVCardMapTEL ); + contactViewSortOrder.AppendL( KUidContactFieldPhoneNumber ); + + TInt count(HEAPFAIL_RATE_START); + + while(count++ < HEAPFAIL_RATE_END) + { + //Populate contact data; + for(TInt i(0); i < 10; i++) + { + PopulateDatabaseL(); + } + + TInt err(KErrNone); + CContactViewBase* contactView=NULL; + + //Enable server side OOM failure when client is creating remote view. + TheDb->SetCntServerHeapFailure(RHeap::EDeterministic,count); + if(aRemoteView) + { + TRAP(err, contactView = CContactRemoteView::NewL(observer, *TheDb, contactViewSortOrder, EContactsOnly)); + } + else + { + TRAP(err, contactView = CContactLocalView::NewL(observer, *TheDb, contactViewSortOrder, EContactsOnly)); + } + TheDb->SetCntServerHeapFailure(RHeap::ENone,0); + + if(err == KErrNone) + { + contactView->Close(observer); + } + + //delete the session and wait for the server to close + CntTest->CloseDatabase(); + WaitForServerToExit(); + + // Re=open the database for future test cases + TheDb = CntTest->OpenDatabaseL(); + } + } +#endif + +/** + +@SYMTestCaseID PIM-T-VIEW-0001 + +*/ + +LOCAL_C void DoTestsL() + { + CTestRegister * TempFiles = CTestRegister::NewLC(); + TempFiles->RegisterL(KDatabaseFileName, EFileTypeCnt); + + test.Start(_L("@SYMTESTCaseID:PIM-T-VIEW-0001 CContactItemViewDef with only iMajor typing info")); + + TRAPD(err,CreateView1L()); + test(err==KErrNone); + + test.Next(_L("CContactItemViewDef with full typing info")); + + TRAP(err,CreateView2L()); + test(err==KErrNone); + + // create test database + TheDb=CntTest->CreateDatabaseL(); + CntTest->DeleteAllTemplateFieldsL(); + PopulateDatabaseL(); + test.Next(_L("Read item with view defs")); + + TRAP(err,SetViewsL()); + test(err==KErrNone); + + test.Next(_L("Read item with view masks")); + + TRAP(err,SetMaskedViewsL()); + test(err==KErrNone); + + test.Next(_L("CContactTextDef tests")); + + TRAP(err,TestContactTextDefL()); + test(err==KErrNone); + + test.Next(_L("INC066425 SetViewDefinitionL panic test")); + + TRAP(err,TestSetViewDefinitionPanicL()); + test(err==KErrNone); + + // create test database + TheDb=CntTest->CreateDatabaseL(); + +#if defined(_DEBUG) +// DEF100291: +// The macro is added because TestOOMOnServerSideL tests for Memory Leaks. +// This is only possible in DEBUG mode. +// In addition, this test function cannot be executed in the Techview environment, as +// the boot-up sequence includes the argument: "nontransient", which will +// cause this function to time out (hang). + test.Next(_L("DEF086689 Remote view OOM test on server side")); + + TRAP(err,TestOOMOnServerSideL(ETrue)); + test(err==KErrNone); + + test.Next(_L("DEF086713 Local view OOM test on server side")); + + TRAP(err,TestOOMOnServerSideL(EFalse)); + test(err==KErrNone); +#endif + + CntTest->CloseDatabase(); + + CleanupStack::PopAndDestroy(TempFiles); + + // stop efsrv.lib warning on 8.1a wins + TEntry dummy; + (void)dummy.IsTypeValid(); + } + + +LOCAL_C void CleanupFilesL() + { + // delete the database file + if (CContactDatabase::ContactDatabaseExistsL(KDatabaseFileName) ) + { + CContactDatabase::DeleteDatabaseL(KDatabaseFileName); + } + } + + +GLDEF_C TInt E32Main() + { + CntTest=new(ELeave) CCntTest; + CntTest->ConstructL(test,KDatabaseFileName); + TRAPD(err,DoTestsL()); + TRAP_IGNORE(CleanupFilesL() ); + CntTest->EndTestLib(err); + return KErrNone; + }