landmarks/locationlandmarks/tsrc/LandmarkTestModule/src/FT_CPosTp101.cpp
branchRCL_3
changeset 44 2b4ea9893b66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarks/locationlandmarks/tsrc/LandmarkTestModule/src/FT_CPosTp101.cpp	Tue Aug 31 15:37:04 2010 +0300
@@ -0,0 +1,1245 @@
+/*
+* Copyright (c) 2005 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: 
+*   ?description_line
+*
+*/
+
+
+//  INCLUDES
+
+#include "FT_CPosTp101.h"
+#include "FT_LandmarkConstants.h"
+#include <EPos_CPosLandmarkDatabase.h>
+#include <EPos_CPosLmCategoryManager.h>
+#include <EPos_CPosLmTextCriteria.h>
+#include <EPos_CPosLmDisplayData.h>
+
+// CONSTANTS  
+const TInt KNrOfDbs = 5;
+const TInt KLmPerDb = 20;
+const TInt KTotLms = 105;
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CPosTp101::CloseTest
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp101::CloseTest()
+    {
+    delete iDatabase;
+    iDatabase = NULL;
+    
+    delete iDbArray;
+
+    delete iLmMultiSearch;
+    iLmMultiSearch = NULL;
+    
+    iSearchResults.ResetAndDestroy();
+    
+    REComSession::FinalClose();
+    }
+    
+// ---------------------------------------------------------
+// CPosTp101::StartL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp101::StartL()
+    {    
+    // Split databases, NrOfDBs db, LmPerDb lm in each, TotLms is last lm id from original db, debug
+    iDbArray = CreateDatabasesL(KNrOfDbs, KLmPerDb, KTotLms); //, ETrue);    
+    
+    
+    // Check setting of databases is correct
+    // Should be move to TC119 - Multi Db - Extended testing
+    VerifySetOfDatabasesL();
+
+    // Constructing a lm multi search 
+    iLmMultiSearch = CPosLmMultiDbSearch::NewL(*iDbArray);
+    
+    // Check that iterator is NOT NULL before search has started (and that iterator is empty)
+    for (TInt i=0;i<iDbArray->Count();i++)
+    	{
+    	CPosLmItemIterator* iter = iLmMultiSearch->MatchIteratorL(i);
+    	CleanupStack::PushL(iter);
+    	AssertTrueSecL(iter->NumOfItemsL() == 0, _L("Iterator should be empty"));
+    	CleanupStack::PopAndDestroy(iter);
+    	}
+    
+    // Read search information from file    
+    AppendSearchResultsL();
+
+    // Do the search testing     
+    iLog->Log(_L("Testing multi db search with criterias read from LmDbSearchResult.txt syncronously"));
+    SearchL(iSearchResults, ESynchronous);
+
+    iLog->Log(_L("Testing multi db search with criterias read from LmDbSearchResult.txt asyncronously"));
+    SearchL(iSearchResults, EAsynchronous);
+
+    // Not possible to use User::WaitForRequest when using Multi Db search!
+    // iLog->Log(_L("Testing multi db search with criterias read from LmDbSearchResult.txt asyncronously using User::WaitForRequest"));
+    // SearchL(SearchResults(), EWaitForRequest);
+
+    iLog->Log(_L("Testing search with a defined sortorder"));
+    SearchWithSortOrderL(iSearchResults);   
+
+    iLog->Log(_L("Testing search and cancel"));
+    SearchAndCancelL();
+   
+    iLog->Log(_L("Testing maximum number of matches"));
+    SearchWithMaximumL(iSearchResults);
+
+    iLog->Log(_L("Testing searching on the fly"));
+    OnTheFlySearchL();
+
+    iLog->Log(_L("Testing search after a landmark has been removed"));
+    SearchAndDeleteL(iSearchResults);
+
+    iLog->Log(_L("Testing search after landmarks have been renamed"));
+    SearchAndRenameL(iSearchResults);
+
+
+    // Test specific Text Criteria error case
+    TUint attr = CPosLandmark::ELandmarkName | CPosLandmark::EDescription;
+    CPosLmTextCriteria* textCriteria = CPosLmTextCriteria::NewLC();
+    textCriteria->SetAttributesToSearch(attr);
+    textCriteria->SetTextL(_L(""));
+
+    _LIT(KEmptyTextCriteriaErr, "An empty string as text criteria should not be allowed");
+    TRAPD(err, iLmMultiSearch->StartLandmarkSearchL(*textCriteria)); 
+    AssertTrueSecL(err == KErrArgument, KEmptyTextCriteriaErr);
+
+    CleanupStack::PopAndDestroy(textCriteria);
+    
+    delete iLmMultiSearch;
+    iLmMultiSearch = NULL;
+    // Constructing a lm multi search 
+    iLmMultiSearch = CPosLmMultiDbSearch::NewL(*iDbArray);
+    
+    // Check that iterator is NOT NULL before search has started (and that iterator is empty)
+    for (TInt i=0;i<iDbArray->Count();i++)
+    	{
+    	CPosLmItemIterator* iter = iLmMultiSearch->MatchIteratorL(i);
+    	CleanupStack::PushL(iter);
+    	AssertTrueSecL(iter->NumOfItemsL() == 0, _L("Iterator should be empty"));
+    	CleanupStack::PopAndDestroy(iter);
+    	}
+	}
+
+// ---------------------------------------------------------
+// CPosTp101::VerifySetOfDatabasesL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp101::VerifySetOfDatabasesL()
+    {
+    // Testing error situations for multi db search
+    _LIT(KEmptyError, "KErrArgument should be returned when no db's are specified.");
+    CDesCArray* emptyArray = new (ELeave) CDesCArrayFlat(5); 
+    CleanupStack::PushL(emptyArray);
+    TRAPD(err, CPosLmMultiDbSearch::NewL(*emptyArray));
+    AssertTrueSecL(err == KErrArgument, KEmptyError);
+
+    CDesCArray* duplicateArray = new (ELeave) CDesCArrayFlat(5); 
+    CleanupStack::PushL(duplicateArray);
+
+    duplicateArray->AppendL(_L("eposlm.ldb"));
+    duplicateArray->AppendL(_L("c:eposlm.ldb"));
+    duplicateArray->AppendL(_L("file://c:eposlm.ldb"));
+
+    VerifyDatabaseL(duplicateArray);
+    
+    duplicateArray->Reset();
+    duplicateArray->AppendL(_L("eposlm.ldb"));
+    duplicateArray->AppendL(_L("eposlm.ldb"));
+    duplicateArray->AppendL(_L("eposlm.ldb"));
+
+    VerifyDatabaseL(duplicateArray);
+
+    CDesCArray* dupArray = new (ELeave) CDesCArrayFlat(5); 
+    CleanupStack::PushL(dupArray);
+    dupArray->AppendL(_L("eposlm.ldb"));
+    dupArray->AppendL(_L("eposlm.ldb"));
+    dupArray->AppendL(_L("eposlm.ldb"));
+    dupArray->AppendL(_L("eposlm.ldb"));
+   
+    VerifyDatabaseL(duplicateArray, dupArray);
+
+    dupArray->Reset();
+    dupArray->AppendL(_L("eposlm.ldb"));
+    dupArray->AppendL(_L("eposlm.ldb"));
+
+    VerifyDatabaseL(duplicateArray, dupArray);
+   
+    CleanupStack::PopAndDestroy(dupArray);
+    CleanupStack::PopAndDestroy(duplicateArray);
+
+    // Check setting of empty databases
+    iLmMultiSearch = CPosLmMultiDbSearch::NewL(*iDbArray);
+ 
+    TRAP(err, iLmMultiSearch->SetDatabasesToSearchL(*emptyArray));
+    AssertTrueSecL(err == KErrArgument, KEmptyError);
+    CleanupStack::PopAndDestroy(emptyArray);
+    delete iLmMultiSearch;
+
+    VerifyDatabaseL(iDbArray);    
+    }
+
+// ---------------------------------------------------------
+// CPosTp101::VerifyDatabaseL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp101::VerifyDatabaseL(
+    CDesCArray* aLmUris, 
+    CDesCArray* aNewLmUris)
+    {
+    iLmMultiSearch = CPosLmMultiDbSearch::NewL(*aLmUris);
+    CheckDatabasesL(aLmUris);
+    
+    if (aNewLmUris)
+        {
+        iLmMultiSearch->SetDatabasesToSearchL(*aNewLmUris);
+        CheckDatabasesL(aNewLmUris);
+        }
+        
+    delete iLmMultiSearch;
+    }
+
+// ---------------------------------------------------------
+// CPosTp101::CheckDatabasesL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp101::CheckDatabasesL(
+    CDesCArray* aExpectedLmUris,
+    TUint aExpectedMaxMatches)
+    {
+    CDesCArray* dbToSearch = iLmMultiSearch->DatabasesToSearchL();
+    CleanupStack::PushL(dbToSearch);
+    
+    _LIT(KWrongNrDatabases, "Wrong number of databases to search!");
+    AssertTrueSecL(aExpectedLmUris != dbToSearch, KWrongNrDatabases);
+    AssertTrueSecL(aExpectedLmUris->Count() == dbToSearch->Count(), KWrongNrDatabases);
+    CleanupStack::PopAndDestroy(dbToSearch);
+    
+    AssertTrueSecL(aExpectedLmUris->Count() == iLmMultiSearch->NumOfDatabasesToSearch(), 
+        KWrongNrDatabases);
+    for (TInt i=0; i<aExpectedLmUris->Count(); i++)
+        {
+        AssertTrueSecL(aExpectedLmUris->MdcaPoint(i) == iLmMultiSearch->DatabaseUriPtr(i), 
+            KWrongNrDatabases);        
+        }
+    
+    _LIT(KWrongNrMatches, "Wrong number of max matches!");
+    AssertTrueSecL(iLmMultiSearch->MaxNumOfMatches() == aExpectedMaxMatches, 
+        KWrongNrMatches);        
+    }
+    
+// ---------------------------------------------------------
+// CPosTp101::SearchL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp101::SearchL(
+    const RPointerArray<CSearchResult>& aSearchResults, 
+    TExecutionMode aExecutionMode)
+    {
+    _LIT(KNumOfMatchesErr, "No. of matches is incorrect when the search is performed");
+    _LIT(KNotFoundErr, "Id %d not found in parsed Lm search results when the search is performed syncronously");
+    _LIT(KSearchNr, "Multi search test #%d executed ok.");
+
+    for(TInt i=0; i<aSearchResults.Count(); i++)
+        {   
+        CPosLmTextCriteria* textCriteria = CPosLmTextCriteria::NewLC();
+        
+        textCriteria->SetTextL(aSearchResults[i]->TextCriteria());
+        textCriteria->SetAttributesToSearch(aSearchResults[i]->Attributes());
+        
+        textCriteria->SetPositionFieldsToSearchL(aSearchResults[i]->PositionFields()); 
+
+        CPosLmOperation* operation = 
+            iLmMultiSearch->StartLandmarkSearchL(*textCriteria, aSearchResults[i]->Redefined());
+        CleanupStack::PushL(operation);
+         switch (aExecutionMode)
+            {
+            case ESynchronous:
+                ExecuteAndDeleteLD(operation);
+                CleanupStack::Pop(operation);
+                break;
+            case EAsynchronous:
+                RunAsyncOperationLD(operation);
+                CleanupStack::Pop(operation);
+                break;
+            case EWaitForRequest:
+                RunAsyncOperationByWaitForReqL(operation);
+                CleanupStack::PopAndDestroy(operation);                
+                break;
+            }
+
+        // Check database array
+        CheckDatabasesL(iDbArray);
+
+        // Check for errors        
+        AssertTrueSecL(iLmMultiSearch->NumOfSearchErrors() == 0, 
+            _L("Error(s) found during multi search."));
+
+        // Check total number of matches       
+        if ((TUint)(aSearchResults[i]->SearchResult()).Count() != 
+            iLmMultiSearch->TotalNumOfMatches())
+            {
+            _LIT(KExpected, "Expected no. of matches: %d");
+            _LIT(KReturned, "Returned no. of matches: %d");
+            TBuf<100> info;
+            info.Format(KExpected, (aSearchResults[i]->SearchResult()).Count());
+            iLog->Log(info);
+            info.Format(KReturned, iLmMultiSearch->TotalNumOfMatches());
+            iLog->Log(info);
+            iLog->Log(_L("Search criteria: "));
+            iLog->Log(textCriteria->Text());
+            iLog->Log(KNumOfMatchesErr);
+            User::Leave(-1);
+            }
+
+        RArray<TPosLmItemId> lmids;
+        CleanupClosePushL(lmids);
+
+        for (TInt j=0; j<iLmMultiSearch->NumOfDatabasesToSearch(); j++) 
+            {
+            CPosLmItemIterator* iter = iLmMultiSearch->MatchIteratorL(j);
+            // Check if there are any matches = iteration exists.
+            if (iter) 
+                {
+                CleanupStack::PushL(iter);
+                TPosLmItemId id = iter->NextL();    
+                while (id != KPosLmNullItemId)
+                    {
+                    // Check that found id is expected
+                    AssertTrueSecL(aSearchResults[i]->FindSearchResult(id), KNotFoundErr);
+                    User::LeaveIfError(lmids.Append(id));                              
+                    id = iter->NextL();
+                    }
+                CleanupStack::PopAndDestroy(iter);                
+                }
+            else 
+                {
+                _LIT(KIterNull, "MatchIterator returned null for a db");
+                iLog->Log(KIterNull);
+                }
+            }
+
+        AssertTrueSecL(aSearchResults[i]->SearchResult().Count() == lmids.Count(), 
+            _L("Expected number of hits and found hits don't match"));
+
+        for (TInt k=0; k<lmids.Count(); k++)
+            {
+            // Check that found id is expected from all ids
+            AssertTrueSecL(aSearchResults[i]->FindSearchResult(lmids[k]), KNotFoundErr);
+            }
+
+        CleanupStack::PopAndDestroy(&lmids); // lmids
+
+        CleanupStack::PopAndDestroy(textCriteria); 
+        
+        TBuf<100> buf;
+        buf.Format(KSearchNr, i);        
+        iLog->Log(buf);            
+        }
+    }
+
+// ---------------------------------------------------------
+// CPosTp101::SearchWithSortOrderL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp101::SearchWithSortOrderL(const RPointerArray<CSearchResult>& aSearchResults)
+    {
+    _LIT(KNumOfMatchesErr, "No. of matches is incorrect when the search is performed syncronously");
+    
+    TPosLmSortPref sortPref(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);  
+    CPosLmTextCriteria* textCriteria = CPosLmTextCriteria::NewLC();
+
+    for(TInt j=0; j<aSearchResults.Count(); j++)
+        {   
+        textCriteria->SetTextL(aSearchResults[j]->TextCriteria());
+        textCriteria->SetAttributesToSearch(aSearchResults[j]->Attributes());
+        textCriteria->SetPositionFieldsToSearchL(aSearchResults[j]->PositionFields()); 
+
+        iLog->Log(aSearchResults[j]->TextCriteria());
+        
+        for (TInt i=0; i<4; i++)
+            {
+            switch (i)
+                {
+                //**** sync
+                case 0:
+                    sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);
+                    ExecuteAndDeleteLD(iLmMultiSearch->StartLandmarkSearchL(
+                        *textCriteria, 
+                        sortPref, 
+                        aSearchResults[j]->Redefined()));
+                    break;
+                case 1:
+                    sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EDescending);
+                    ExecuteAndDeleteLD(iLmMultiSearch->StartLandmarkSearchL(
+                        *textCriteria, 
+                        sortPref, 
+                        aSearchResults[j]->Redefined()));
+                    break;
+                case 2:
+                //**** async
+                    sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EDescending);
+                    RunAsyncOperationLD(iLmMultiSearch->StartLandmarkSearchL(
+                        *textCriteria, 
+                        sortPref, 
+                        aSearchResults[j]->Redefined()));
+                    break;
+                case 3:
+                    sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);
+                    RunAsyncOperationLD(iLmMultiSearch->StartLandmarkSearchL(
+                        *textCriteria, 
+                        sortPref, 
+                        aSearchResults[j]->Redefined()));
+                    break;
+                //**** asych with User::WaitForRequest()
+                case 4:
+                    {
+                    CPosLmOperation* op = iLmMultiSearch->StartLandmarkSearchL(
+                        *textCriteria, 
+                        sortPref, 
+                        aSearchResults[j]->Redefined());
+                    CleanupStack::PushL(op);
+                    RunAsyncOperationByWaitForReqL(op);
+                    CleanupStack::PopAndDestroy(op);
+                    }
+                    break;
+                case 5:
+                    {
+                    sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);
+                    CPosLmOperation* op = iLmMultiSearch->StartLandmarkSearchL(
+                        *textCriteria, 
+                        sortPref, 
+                        aSearchResults[j]->Redefined());
+                    CleanupStack::PushL(op);
+                    RunAsyncOperationByWaitForReqL(op);
+                    CleanupStack::PopAndDestroy(op);
+                    }
+                    break;
+                }
+            }
+            
+        // Check database array
+        CheckDatabasesL(iDbArray);
+
+        // Check for errors        
+        AssertTrueSecL(iLmMultiSearch->NumOfSearchErrors() == 0, 
+            _L("Error(s) found during multi search."));
+
+        // Check total number of matches       
+        if ((TUint)(aSearchResults[j]->SearchResult()).Count() != 
+            iLmMultiSearch->TotalNumOfMatches())
+            {
+            _LIT(KExpected, "Expected no. of matches: %d");
+            _LIT(KReturned, "Returned no. of matches: %d");
+            TBuf<100> info;
+            info.Format(KExpected, (aSearchResults[j]->SearchResult()).Count());
+            iLog->Log(info);
+            info.Format(KReturned, iLmMultiSearch->TotalNumOfMatches());
+            iLog->Log(info);
+            iLog->Log(_L("Search criteria: "));
+            iLog->Log(textCriteria->Text());
+            iLog->Log(KNumOfMatchesErr);
+            User::Leave(-1);
+            }
+        
+        RArray<TPosLmItemId>* searchResults = &aSearchResults[j]->SearchResult();        
+        for (TInt n=0; n<iLmMultiSearch->NumOfDatabasesToSearch(); n++) 
+            {
+            RArray<TPosLmItemId> lmids;
+            CleanupClosePushL(lmids);
+            GetLmIdsL(n, *searchResults, lmids);            
+
+            iDatabase = CPosLandmarkDatabase::OpenL(iLmMultiSearch->DatabaseUriPtr(n));
+            if (iDatabase->IsInitializingNeeded())
+           {
+           ExecuteAndDeleteLD(iDatabase->InitializeL());
+           }
+            LandmarksSortL(lmids, sortPref);
+        
+            CPosLmItemIterator* iter = iLmMultiSearch->MatchIteratorL(n);
+            // Check if there are any matches = iteration exists.
+            if (iter) 
+                {
+                CleanupStack::PushL(iter);
+                TInt lmid = 0;
+                TPosLmItemId id = iter->NextL();
+        
+                while (id != KPosLmNullItemId)
+                    {
+                    CheckEqualsLmsL(id, lmids[lmid]);
+                    
+                    id = iter->NextL();
+                    ++lmid;
+                    }
+                CleanupStack::PopAndDestroy(iter);
+                }
+            else 
+                {
+                _LIT(KIterNull, "MatchIterator returned null for a db");
+                iLog->Log(KIterNull);
+                }
+                
+            delete iDatabase;
+            iDatabase = NULL;
+            
+            CleanupStack::PopAndDestroy(&lmids);
+            }
+
+        }
+        
+    CleanupStack::PopAndDestroy(textCriteria);
+    }
+
+// ---------------------------------------------------------
+// CPosTp101::GetLmIdsL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp101::GetLmIdsL(
+    TInt aDbId, 
+    RArray<TPosLmItemId> aSearchResults,
+    RArray<TPosLmItemId>& aLmIdForADb)
+    {
+    TInt startId = aDbId * KLmPerDb + 1;
+    TInt stopId = 0;
+    
+    if (aDbId == KNrOfDbs - 1)
+        {
+        stopId = KTotLms;            
+        }
+    else 
+        {
+        stopId = (aDbId+1) * KLmPerDb;            
+        }
+    
+    for (TInt i=0; i<aSearchResults.Count(); i++)
+        {
+        if (aSearchResults[i] >= startId && aSearchResults[i] <= stopId)
+            {
+            User::LeaveIfError(aLmIdForADb.Append(aSearchResults[i]));
+            }
+        }
+    }
+    
+// ---------------------------------------------------------
+// CPosTp101::CheckEqualsLmsL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp101::CheckEqualsLmsL(
+    TPosLmItemId aSource, 
+    TPosLmItemId aTarget)
+    {
+    _LIT(KSortorderErr, "The sortorder is incorrect");
+
+    if (aSource != aTarget)
+        {                
+        // Check if same name then don't Leave
+        CPosLandmark* source = iDatabase->ReadLandmarkLC(aSource);
+        CPosLandmark* target = iDatabase->ReadLandmarkLC(aTarget);
+        TPtrC sourceName, targetName;
+        source->GetLandmarkName(sourceName);
+        target->GetLandmarkName(targetName);
+
+        if (EFalse)
+            {
+            // For debugging purposes
+            TBuf<100> buf;
+            buf.Append(_L("Name:"));
+            buf.Append(sourceName);
+            buf.Append(targetName);
+            iLog->Log(buf);
+            }
+
+        AssertTrueSecL(!sourceName.CompareC(targetName), KSortorderErr, aSource);
+        CleanupStack::PopAndDestroy(2, source); // target, source
+        }
+    }
+
+// ---------------------------------------------------------
+// CPosTp101::OnTheFlySearchL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp101::OnTheFlySearchL()
+    {
+    TInt KTestIndex = 4;
+                
+    CPosLmTextCriteria* textCriteria = CPosLmTextCriteria::NewLC();
+    textCriteria->SetTextL(iSearchResults[KTestIndex]->TextCriteria());
+    textCriteria->SetAttributesToSearch(iSearchResults[KTestIndex]->Attributes());
+    textCriteria->SetPositionFieldsToSearchL(iSearchResults[KTestIndex]->PositionFields()); 
+    
+    COnTheFlyTester* onTheFlyTester = COnTheFlyTester::NewLC();
+    onTheFlyTester->StartSearchCampaignL(iLmMultiSearch, 
+        iSearchResults[KTestIndex]->SearchResult(), 
+        textCriteria);
+
+    TInt result = onTheFlyTester->Err();
+    if (result != KErrNone)
+        {
+        TPtrC msg;
+        onTheFlyTester->GetErrMsg(msg);
+        iLog->Log(msg);
+        User::Leave(result);
+        }
+        
+    CleanupStack::PopAndDestroy(2, textCriteria);
+    
+    iLmMultiSearch->UnsetDisplayData();
+    }
+
+// ---------------------------------------------------------
+// CPosTp101::SearchAndDeleteL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp101::SearchAndDeleteL(const RPointerArray<CSearchResult>& aSearchResults)
+    {
+    _LIT(KNumOfMatchesErr, "No. of matches is incorrect when a redefined search is performed"); 
+    const TInt KTestIndex = 11;
+    
+    TPosLmSortPref sortPref(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);
+    
+    CPosLmTextCriteria* textCriteria = CPosLmTextCriteria::NewLC();
+        
+    textCriteria->SetTextL(aSearchResults[KTestIndex]->TextCriteria());
+    textCriteria->SetAttributesToSearch(aSearchResults[KTestIndex]->Attributes());
+    textCriteria->SetPositionFieldsToSearchL(aSearchResults[KTestIndex]->PositionFields()); 
+    
+    ExecuteAndDeleteLD(iLmMultiSearch->StartLandmarkSearchL(*textCriteria, sortPref));
+    
+    RArray<TPosLmItemId>* searchResults = &aSearchResults[KTestIndex]->SearchResult();
+    
+    TPosLmItemId lmid = (*searchResults)[0];
+    iDatabase = CPosLandmarkDatabase::OpenL();  
+    if (iDatabase->IsInitializingNeeded())
+   {
+   ExecuteAndDeleteLD(iDatabase->InitializeL());
+   }
+    iDatabase->RemoveLandmarkL(lmid); 
+    searchResults->Remove(0);
+    searchResults->Compress();
+    delete iDatabase;
+    iDatabase = NULL;
+
+    // Search
+    ExecuteAndDeleteLD(iLmMultiSearch->StartLandmarkSearchL(*textCriteria, sortPref, ETrue));
+
+    // Check result    
+    // Check database array
+    CheckDatabasesL(iDbArray);
+
+    // Check for errors        
+    AssertTrueSecL(iLmMultiSearch->NumOfSearchErrors() == 0, 
+        _L("Error(s) found during multi search."));
+
+    AssertTrueSecL((TUint)searchResults->Count() == iLmMultiSearch->TotalNumOfMatches(), 
+        KNumOfMatchesErr);    
+
+    RArray<TPosLmItemId> lmids;
+    CleanupClosePushL(lmids);
+    _LIT(KNotFoundErr, "Id %d not found in parsed Lm search results");
+
+    for (TInt j=0; j<iLmMultiSearch->NumOfDatabasesToSearch(); j++) 
+        {
+        CPosLmItemIterator* iter = iLmMultiSearch->MatchIteratorL(j);
+        // Check if there are any matches = iteration exists.
+        if (iter) 
+            {
+            CleanupStack::PushL(iter);
+            TPosLmItemId id = iter->NextL();    
+            while (id != KPosLmNullItemId)
+                {
+                // Check that found id is expected
+                AssertTrueSecL(aSearchResults[KTestIndex]->FindSearchResult(id), KNotFoundErr);
+                User::LeaveIfError(lmids.Append(id));                              
+                id = iter->NextL();
+                }
+            CleanupStack::PopAndDestroy(iter);                
+            }
+        else 
+            {
+            _LIT(KIterNull, "MatchIterator returned null for a db");
+            iLog->Log(KIterNull);
+            }
+        }
+
+    AssertTrueSecL(aSearchResults[KTestIndex]->SearchResult().Count() == lmids.Count(), 
+        _L("Expected number of hits and found hits don't match"));
+
+    for (TInt k=0; k<lmids.Count(); k++)
+        {
+        // Check that found id is expected from all ids
+        AssertTrueSecL(aSearchResults[KTestIndex]->FindSearchResult(lmids[k]), KNotFoundErr);
+        }
+
+    CleanupStack::PopAndDestroy(&lmids); // lmids
+       
+    CleanupStack::PopAndDestroy(textCriteria);
+    }
+
+// ---------------------------------------------------------
+// CPosTp101::SearchAndRenameL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp101::SearchAndRenameL(const RPointerArray<CSearchResult>& aSearchResults)
+    {
+    _LIT(KNumOfMatchesErr, "No. of matches is incorrect when a redefined search is performed"); 
+    const TInt KTestIndex=4;
+
+    TPosLmSortPref sortPref(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);
+    
+    CPosLmTextCriteria* textCriteria = CPosLmTextCriteria::NewLC();
+        
+    textCriteria->SetTextL(aSearchResults[KTestIndex]->TextCriteria());
+    textCriteria->SetAttributesToSearch(aSearchResults[KTestIndex]->Attributes());
+    textCriteria->SetPositionFieldsToSearchL(aSearchResults[KTestIndex]->PositionFields()); 
+    
+    iLog->Log(_L("Search criteria: "));
+    iLog->Log(textCriteria->Text());
+    ExecuteAndDeleteLD(iLmMultiSearch->StartLandmarkSearchL(*textCriteria, sortPref));
+    
+    RArray<TPosLmItemId>* searchResults = &aSearchResults[KTestIndex]->SearchResult();
+    
+    // Check database array
+    CheckDatabasesL(iDbArray);
+
+    // Check for errors        
+    AssertTrueSecL(iLmMultiSearch->NumOfSearchErrors() == 0, 
+        _L("Error(s) found during multi search."));
+
+    AssertTrueSecL((TUint) searchResults->Count() == 
+        iLmMultiSearch->TotalNumOfMatches(), KNumOfMatchesErr);    
+
+    _LIT(KNotFoundErr, "Id %d not found in parsed Lm search results");
+    
+    _LIT(KLmName, "l");
+
+    for (TInt j=0; j<iLmMultiSearch->NumOfDatabasesToSearch(); j++) 
+        {
+        CPosLmItemIterator* iter = iLmMultiSearch->MatchIteratorL(j);
+        iDatabase = 
+            CPosLandmarkDatabase::OpenL(iLmMultiSearch->DatabaseUriPtr(j));
+        if (iDatabase->IsInitializingNeeded())
+       {
+       ExecuteAndDeleteLD(iDatabase->InitializeL());
+       }
+            
+        // Check if there are any matches = iteration exists.
+        if (iter)
+            {
+            CleanupStack::PushL(iter);
+            TPosLmItemId id = iter->NextL();    
+            while (id != KPosLmNullItemId)
+                {
+                // Check that found id is expected
+                AssertTrueSecL(aSearchResults[KTestIndex]->FindSearchResult(id), 
+                    KNotFoundErr);
+              
+                CPosLandmark* lm = iDatabase->ReadLandmarkLC(id);
+        
+                TBuf<30> lmName;
+                lmName = KLmName;
+               lm->SetLandmarkNameL(lmName);
+                iDatabase->UpdateLandmarkL(*lm);
+                CleanupStack::PopAndDestroy(lm);   
+                                
+                id = iter->NextL();
+                }
+            CleanupStack::PopAndDestroy(iter);                
+            }
+        else 
+            {
+            _LIT(KIterNull, "MatchIterator returned null for a db");
+            iLog->Log(KIterNull);
+            }
+            
+        delete iDatabase;
+        iDatabase = NULL;
+        }
+    
+    iLog->Log(_L("Search criteria: "));
+    iLog->Log(textCriteria->Text());
+    ExecuteAndDeleteLD(iLmMultiSearch->StartLandmarkSearchL(*textCriteria, sortPref, ETrue));
+    
+    // Check database array
+    CheckDatabasesL(iDbArray);
+
+    // Check for errors        
+    AssertTrueSecL(iLmMultiSearch->NumOfSearchErrors() == 0, 
+        _L("Error(s) found during multi search."));
+
+    AssertTrueSecL((TUint) searchResults->Count() == 
+        iLmMultiSearch->TotalNumOfMatches(), KNumOfMatchesErr);    
+
+    for (TInt j=0; j<iLmMultiSearch->NumOfDatabasesToSearch(); j++) 
+        {
+        iDatabase = 
+            CPosLandmarkDatabase::OpenL(iLmMultiSearch->DatabaseUriPtr(j));
+        if (iDatabase->IsInitializingNeeded())
+       {
+       ExecuteAndDeleteLD(iDatabase->InitializeL());
+       }
+        CPosLmItemIterator* iter = iLmMultiSearch->MatchIteratorL(j);
+            
+        // Check if there are any matches = iteration exists.
+        if (iter)
+            {
+            CleanupStack::PushL(iter);
+            TPosLmItemId id = iter->NextL();    
+            while (id != KPosLmNullItemId)
+                {
+                // Check that found id is expected
+                AssertTrueSecL(aSearchResults[KTestIndex]->FindSearchResult(id), 
+                    KNotFoundErr);
+   
+                CPosLandmark* lm = iDatabase->ReadLandmarkLC(id);
+        
+                TPtrC16 lmName;
+                lm->GetLandmarkName(lmName);
+                AssertTrueSecL(lmName == KLmName, _L("Wrong landmark name"));
+                
+                CleanupStack::PopAndDestroy(lm);   
+                 
+                id = iter->NextL();
+                }
+            CleanupStack::PopAndDestroy(iter);                
+            }
+        else 
+            {
+            _LIT(KIterNull, "MatchIterator returned null for a db");
+            iLog->Log(KIterNull);
+            }   
+            
+        delete iDatabase;
+        iDatabase = NULL;
+        }
+  
+    CleanupStack::PopAndDestroy(textCriteria);
+    }
+
+// ---------------------------------------------------------
+// CPosTp101::SearchAndCancelL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp101::SearchAndCancelL(const TBool& aInCallback)
+    {
+    // Test search with one criteria
+    const TInt KIndex=0;
+
+    CPosLmTextCriteria* textCriteria = CPosLmTextCriteria::NewLC();
+    textCriteria->SetTextL(iSearchResults[KIndex]->TextCriteria());
+    textCriteria->SetAttributesToSearch(iSearchResults[KIndex]->Attributes());
+    textCriteria->SetPositionFieldsToSearchL(iSearchResults[KIndex]->PositionFields()); 
+
+    if (aInCallback)
+        {
+        TReal threshold = 0;
+        for (TReal i=0; i<100; i+=10) 
+            {
+            threshold = i/100;
+            RunAsyncOperationAndCancelInCallbackLD(iLmMultiSearch->StartLandmarkSearchL(
+                    *textCriteria, iSearchResults[KIndex]->Redefined()), threshold);
+                    
+            _LIT(KCancelNr, "Multi search test, cancel after progress %f, canceled ok.");
+            TBuf<100> buf;
+            buf.Format(KCancelNr, threshold);
+            iLog->Log(buf);         
+            }
+        }
+    else
+        {
+        RunAsyncOperationAndCancelLD(iLmMultiSearch->StartLandmarkSearchL(
+                *textCriteria, iSearchResults[KIndex]->Redefined()));
+        }
+        
+    CleanupStack::PopAndDestroy(textCriteria);       
+    }
+     
+// ---------------------------------------------------------
+// CPosTp101::SearchWithMaximumL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp101::SearchWithMaximumL(
+    const RPointerArray<CSearchResult>& aSearchResults)
+    {
+    _LIT(KNumOfMatchesErr, "No. of matches is incorrect when SearchWithMaximumL is performed");
+
+    // Test search with one criteria
+    const TInt KTestIndex = 0;
+
+    CPosLmTextCriteria* textCriteria = CPosLmTextCriteria::NewLC();
+ 
+    textCriteria->SetTextL(iSearchResults[KTestIndex]->TextCriteria());
+    textCriteria->SetAttributesToSearch(iSearchResults[KTestIndex]->Attributes());
+    textCriteria->SetPositionFieldsToSearchL(iSearchResults[KTestIndex]->PositionFields()); 
+
+    TPosLmSortPref sortPref(CPosLandmark::ELandmarkName, TPosLmSortPref::EDescending);
+
+    // First get the maximum number of matches
+    TInt maxMatches = KNrOfDbs;  
+    iLmMultiSearch->SetMaxNumOfMatches(maxMatches);
+    _LIT(KErrNrOfMatches, "Number of matches is incorrect");
+    AssertTrueSecL(iLmMultiSearch->MaxNumOfMatches() == maxMatches, KErrNrOfMatches);
+    
+    ExecuteAndDeleteLD(iLmMultiSearch->StartLandmarkSearchL(*textCriteria, sortPref)); 
+
+    AssertTrueSecL(iLmMultiSearch->MaxNumOfMatches() == maxMatches, KErrNrOfMatches);
+    RArray<TPosLmItemId>* searchResults = &aSearchResults[KTestIndex]->SearchResult();    
+    TInt totalMatches = iLmMultiSearch->TotalNumOfMatches();
+    
+    // Check database array
+    CheckDatabasesL(iDbArray, maxMatches);
+    // Check for errors        
+    AssertTrueSecL(iLmMultiSearch->NumOfSearchErrors() == 0, 
+        _L("Error(s) found during multi search."));
+    // Check that nr is not expected number of results
+    AssertTrueSecL((TUint) searchResults->Count() != 
+        totalMatches, KNumOfMatchesErr);    
+
+    for (TInt n=0; n<iLmMultiSearch->NumOfDatabasesToSearch(); n++) 
+        {
+        RArray<TPosLmItemId> lmids;
+        CleanupClosePushL(lmids);
+        GetLmIdsL(n, *searchResults, lmids);            
+    
+        iDatabase = CPosLandmarkDatabase::OpenL(iLmMultiSearch->DatabaseUriPtr(n));
+        if (iDatabase->IsInitializingNeeded())
+       {
+       ExecuteAndDeleteLD(iDatabase->InitializeL());
+       }
+        LandmarksSortL(lmids, sortPref);
+    
+        CPosLmItemIterator* iter = iLmMultiSearch->MatchIteratorL(n);
+        // Check if there are any matches = iteration exists.
+        if (iter) 
+            {
+            CleanupStack::PushL(iter);
+            AssertTrueSecL(iter->NumOfItemsL() == iLmMultiSearch->NumOfMatches(n), 
+                KNumOfMatchesErr);
+    
+            TInt lmid = 0;
+            TPosLmItemId id = iter->NextL();
+    
+            while (id != KPosLmNullItemId)
+                {
+                CheckEqualsLmsL(id, lmids[lmid]);
+                
+                id = iter->NextL();
+                ++lmid;
+                }
+            CleanupStack::PopAndDestroy(iter);
+            }
+        else 
+            {
+            _LIT(KIterNull, "MatchIterator returned null for a db");
+            iLog->Log(KIterNull);
+            }
+            
+        delete iDatabase;
+        iDatabase = NULL;
+        
+        CleanupStack::PopAndDestroy(&lmids);
+        }
+
+    // Test max matches again
+    TInt incMatches = 2;
+    maxMatches = maxMatches + incMatches;  
+    iLmMultiSearch->SetMaxNumOfMatches(maxMatches);
+    AssertTrueSecL(iLmMultiSearch->MaxNumOfMatches() == maxMatches, KErrNrOfMatches);
+    
+    ExecuteAndDeleteLD(iLmMultiSearch->StartLandmarkSearchL(*textCriteria)); 
+
+    AssertTrueSecL(iLmMultiSearch->MaxNumOfMatches() == maxMatches, KErrNrOfMatches);
+    TInt reTotalMatches = iLmMultiSearch->TotalNumOfMatches();
+    
+    AssertTrueSecL(reTotalMatches != totalMatches, 
+        _L("Total number of matches should not be that same."));
+    
+    // Check database array
+    CheckDatabasesL(iDbArray, maxMatches);
+    // Check for errors        
+    AssertTrueSecL(iLmMultiSearch->NumOfSearchErrors() == 0, 
+        _L("Error(s) found during multi search."));
+    // Check that nr is not expected number of results
+    AssertTrueSecL((TUint) searchResults->Count() != 
+        reTotalMatches, KNumOfMatchesErr); 
+
+    CleanupStack::PopAndDestroy(textCriteria);
+
+    // Unset max number of matches to normal/unlimited again
+    iLmMultiSearch->SetMaxNumOfMatches();
+    }
+
+// ---------------------------------------------------------
+// CPosTp101::CreateDatabasesL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CDesCArray* CPosTp101::CreateDatabasesL(TInt aNrOfLmDbs, TInt aLmPerDb, 
+    TInt aLastId, TBool aDebug)
+    {
+            
+    CDesCArray* iDbArray = new (ELeave) CDesCArrayFlat(aNrOfLmDbs); 
+    CleanupStack::PushL(iDbArray);     
+         
+    RemoveDefaultDbL();
+    
+    // Populate default db
+    iDatabase = UseGeneratedDbFileL();
+    if (iDatabase->IsInitializingNeeded())
+       {
+       ExecuteAndDeleteLD(iDatabase->InitializeL());
+       }
+    ExecuteAndDeleteLD(iDatabase->CompactL());
+    delete iDatabase;
+    iDatabase = NULL;
+        
+    CFileMan* fileMan = CFileMan::NewL(iFileSession);
+    CleanupStack::PushL(fileMan);
+
+    // Create databases
+    TInt i=0;
+    for (i=1; i < aNrOfLmDbs; i++)
+        {
+        TBuf<100> db;
+        db.Format(KDbNamePath, i * aLmPerDb);
+        
+        iFileSession.Delete(db);
+        User::LeaveIfError(fileMan->Copy(KLmFullDefaultDbPath, db, CFileMan::EOverWrite));    
+        }
+    CleanupStack::PopAndDestroy(fileMan);               
+
+    for (TInt db=0; db < aNrOfLmDbs; db++)
+        {
+        TInt dbform = db;
+        if (db == aNrOfLmDbs)
+            {
+            dbform = aNrOfLmDbs - 1;
+            }
+            
+        CPosLandmarkDatabase* lmd = NULL;
+        TBuf<100> name;
+        if (db == 0)
+            {
+            _LIT(KDefLmDb, "eposlm.ldb");
+            name = KDefLmDb;
+            lmd = CPosLandmarkDatabase::OpenL();
+            if (lmd->IsInitializingNeeded())
+           {
+           ExecuteAndDeleteLD(lmd->InitializeL());
+           }
+            }
+        else 
+            {
+            name.Format(KDbName, dbform * aLmPerDb);        
+            lmd = CPosLandmarkDatabase::OpenL(name);
+            if (lmd->IsInitializingNeeded())
+           {
+           ExecuteAndDeleteLD(lmd->InitializeL());
+           }
+            }
+        CleanupStack::PushL(lmd);
+        // Append db name to array
+        iDbArray->AppendL(name);
+
+        if (aDebug)
+            {
+            iLog->Log(name);
+            }
+        
+        TInt startItemid = dbform * aLmPerDb + 1;
+        TInt stopItemid = dbform * aLmPerDb + aLmPerDb;            
+        if (dbform == aNrOfLmDbs - 1)
+            {
+            stopItemid = aLastId;
+            }
+        
+        for (TInt lmid=1; lmid <= aLastId; lmid++) 
+            {
+            TBuf<100> lmidbuf;
+                
+            if (aDebug)
+                {
+                _LIT(KLmId, "Landmark with LmId: %d");
+                lmidbuf.Format(KLmId, lmid);
+                iLog->Log(lmidbuf);                                
+                }
+
+            if (lmid < startItemid || lmid > stopItemid)
+                {
+                if (aDebug)
+                    {
+                    _LIT(KDelLmId, "Removing LmId: %d");
+                    lmidbuf.Format(KDelLmId, lmid);
+                    iLog->Log(lmidbuf);                                
+                    }
+                TInt err = KErrLocked;
+                while (err == KErrLocked)
+                    {
+                    TRAP(err, lmd->RemoveLandmarkL(lmid));
+                    }
+                }
+            }
+
+        // Compact database
+        ExecuteAndDeleteLD(lmd->CompactL());    
+        CleanupStack::PopAndDestroy(lmd);  
+        }
+        
+    // Log/print landmark databases.
+    if (aDebug)
+        {
+        // DEBUG 
+        for (i=0; i < aNrOfLmDbs; i++)
+            {
+            TBuf<100> dbNo;
+            dbNo.Format(_L(" -------- Printing Db %d --------------"), i);
+            iLog->Log(dbNo);
+                
+            CPosLandmarkDatabase* lmd = NULL;
+            if (i == 0) 
+                {
+                _LIT(KDbDefName, "Default Lm DB");
+                iLog->Log(KDbDefName);
+                lmd = CPosLandmarkDatabase::OpenL();
+                if (lmd->IsInitializingNeeded())
+               {
+               ExecuteAndDeleteLD(lmd->InitializeL());
+               }
+
+                }
+            else 
+                {            
+                TInt dbform = i;
+                if (i == 5)
+                    {
+                    dbform = 4;
+                    }
+                    
+                TBuf<100> db;
+                db.Format(KDbName, dbform * aLmPerDb);
+                iLog->Log(db);
+                
+                lmd = CPosLandmarkDatabase::OpenL(db);   
+                if (lmd->IsInitializingNeeded())
+               {
+               ExecuteAndDeleteLD(lmd->InitializeL());
+               }
+
+                }
+            CleanupStack::PushL(lmd);
+            CPosLmCategoryManager* lmcat = CPosLmCategoryManager::NewL(*lmd);
+            CleanupStack::PushL(lmcat);
+            
+            CPosLmItemIterator* iter = lmd->LandmarkIteratorL();
+            CleanupStack::PushL(iter);
+
+            _LIT(KNrLms, "Nr of Lms: %d");
+            TBuf<20> lms;
+            lms.Format(KNrLms, iter->NumOfItemsL());
+            iLog->Log(lms);
+           
+            TPosLmItemId id = iter->NextL(); 
+            while (id != KPosLmNullItemId)
+                {
+                CPosLandmark* lm = lmd->ReadLandmarkLC(id);
+            
+                TBuf<255> info;
+                PrintLandmark(*lm, info);
+                iLog->Log(info);
+                CleanupStack::PopAndDestroy(lm); 
+                
+                id = iter->NextL();
+                }    
+
+            CleanupStack::PopAndDestroy(iter);
+
+            CPosLmItemIterator* catiter = lmcat->CategoryIteratorL();
+            CleanupStack::PushL(catiter);
+
+            _LIT(KNrLmCats, "Nr of Lm Cats: %d");
+            TBuf<20> lmcats;
+            lmcats.Format(KNrLmCats, catiter->NumOfItemsL());
+            iLog->Log(lmcats);
+           
+            id = catiter->NextL(); 
+            while (id != KPosLmNullItemId)
+                {
+                CPosLandmarkCategory* cat = lmcat->ReadCategoryLC(id);
+            
+                TBuf<255> info;
+                // PrintLandmark(*lm, info);
+                _LIT(KCatId, "Category id: %d");
+                _LIT(KCatGlobalId, "Global Category id: %d");
+                _LIT(KCatName, "Category name: %S");
+                
+                info.Format(KCatId, cat->CategoryId());                
+                iLog->Log(info);
+                
+                info.Format(KCatGlobalId, cat->GlobalCategory());                
+                iLog->Log(info);
+                
+                TPtrC catname;
+                TInt err = cat->GetCategoryName(catname);
+                info.Format(KCatName, &catname);                
+                iLog->Log(info);
+                
+                CleanupStack::PopAndDestroy(cat); 
+                
+                id = catiter->NextL();
+                }    
+           
+           
+            CleanupStack::PopAndDestroy(3, lmd); // catiter, lmcat
+            }        
+        }
+        
+    CleanupStack::Pop(iDbArray);
+    return iDbArray;
+    }
+
+//  End of File