phonebookengines_old/contactsmodel/tsrc/T_VIEW.CPP
branchGCC_SURGE
changeset 41 d11de32a5e6f
parent 40 b46a585f6909
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines_old/contactsmodel/tsrc/T_VIEW.CPP	Tue Jun 15 14:45:31 2010 +0100
@@ -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 <e32test.h>
+#include <f32file.h>
+#include <s32file.h>
+#include <cntdb.h>
+#include <cntitem.h>
+#include <cntfield.h>
+#include <cntfldst.h>
+#include <cntviewbase.h>
+#include "T_UTILS.H"
+#include <coreappstest/testserver.h>
+
+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;
+    }