--- /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 <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;
+ }