landmarks/locationlandmarks/tsrc/LandmarkTestModule/src/FT_CPosTp131.cpp
branchRCL_3
changeset 44 2b4ea9893b66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarks/locationlandmarks/tsrc/LandmarkTestModule/src/FT_CPosTp131.cpp	Tue Aug 31 15:37:04 2010 +0300
@@ -0,0 +1,979 @@
+/*
+* 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_CPosTp131.h"
+#include <EPos_CPosLandmarkDatabase.h>
+#include <EPos_CPosLandmarkSearch.h>
+#include <EPos_CPosLmTextCriteria.h>
+#include <EPos_CPosLMItemIterator.h>
+#include <EPos_CPosLmDisplayData.h>
+#include <EPos_CPosLmDisplayItem.h>
+#include <EPos_TPosLMSortPref.h>
+#include "FT_CSearchResult.h"
+#include <LbsPosition.h>
+#include "FT_LandmarkConstants.h"
+     
+// CONSTANTS
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CPosTp131::CloseTest
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp131::CloseTest()
+    {
+    iLog->Log(_L("CloseTest"));
+    iSearchResults.ResetAndDestroy();
+        
+    //CHECK TR   Delete of landmarks search - ESLI-5WNG9N
+    delete iDatabase;
+    iDatabase = NULL;
+    
+    iLandmarkSearch->UnsetDisplayData();
+    delete iDisplayData;
+    iDisplayData = NULL;
+
+    delete iLandmarkSearch;
+    iLandmarkSearch = NULL;
+    
+    }
+
+// ---------------------------------------------------------
+// CPosTp131::StartL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp131::StartL()
+    {
+    iErrorsFound = KErrNone;
+    // copy test db to the private path
+    _LIT(KTestPath, "c:\\system\\test\\testdata\\");
+
+    CFileMan* fileMan = CFileMan::NewL(iFileSession);
+    CleanupStack::PushL(fileMan);
+
+    TBuf<150> srcPath;
+
+    srcPath.Append(KTestPath);
+    srcPath.Append(KTp131TestDb);
+
+    TInt er = fileMan->Copy(srcPath, KLmTp131DefaultDbPath,
+            CFileMan::EOverWrite);
+    if (er != KErrNone)
+        iLog->Log(_L("Error when copying file"));
+
+    CleanupStack::PopAndDestroy(fileMan);
+    
+    CPosLmDatabaseManager* manager = CPosLmDatabaseManager::NewL();
+    CleanupStack::PushL(manager);
+
+    // This db must exist
+    manager->SetDefaultDatabaseUriL(KTp131TestDb);
+    CleanupStack::PopAndDestroy(manager);
+
+    iDatabase = CPosLandmarkDatabase::OpenL(KTp131TestDb);
+    if (iDatabase->IsInitializingNeeded())
+        {
+        TRAPD( err, ExecuteAndDeleteLD( iDatabase->InitializeL() ) );
+        AssertTrueSecL(err == KErrNone, _L("Init db failed"));
+        }
+
+    iLandmarkSearch = CPosLandmarkSearch::NewL(*iDatabase);
+    AppendSearchResultsL();
+
+    iLog->Log(_L("Testing search with a defined sortorder"));
+    SearchWithSortOrderL(iSearchResults);
+
+    // Test Partial landmarks
+    iLog->Log(_L("Testing search with a defined sortorder for partial landmarks"));
+	SearchPartialLandmarksL(iSearchResults);
+           
+    iLog->Log(_L("Testing reset of DisplayData"));
+    CheckResetL(iSearchResults);
+
+    iLog->Log(_L("Testing cancel and displaydata"));
+    CancelTestL(iSearchResults);
+    
+    // Test DisplayDataItem, create Landmark type
+    TUint dbIndex = 0;
+    CPosLandmark* lm = CPosLandmark::NewLC();
+    lm->SetLandmarkNameL(_L("Tp131Landmarkname"));
+    CPosLmDisplayItem* item = CPosLmDisplayItem::NewL(lm, dbIndex);
+    CleanupStack::PushL(item);
+    
+    CPosLmDisplayItem::TDisplayItemType type = item->DisplayItemType();
+    AssertTrueSecL(type == CPosLmDisplayItem::ELandmarkItem, _L("Wrong TDisplayItemType"));
+    CleanupStack::PopAndDestroy(item);
+    CleanupStack::Pop(lm); // lm deleted when deleting displaydata
+        
+    // Test DisplayDataItem, create Category type
+    CPosLandmarkCategory* category = CPosLandmarkCategory::NewLC();
+    category->SetCategoryNameL(_L("Tp131CategoryName"));
+    item = CPosLmDisplayItem::NewL(category, dbIndex);
+    CleanupStack::PushL(item);
+    type = item->DisplayItemType();
+    
+    AssertTrueSecL(type == CPosLmDisplayItem::ECategoryItem, _L("Wrong TDisplayItemType"));
+    CleanupStack::PopAndDestroy(item);
+    CleanupStack::Pop(category); // category deleted when deleting displaydata
+    
+    if (iErrorsFound != KErrNone) 
+    	{
+    	iLog->Log(_L("Errors were found in TP131"));
+    	User::Leave(-1);
+    	}
+
+    }
+    	
+// ---------------------------------------------------------
+// CPosTp131::ChechPartialLandmarkL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp131::CheckPartialLandmarkL(const CPosLandmark& aLandmark, 
+                                     const CPosLandmark::TAttributes& aAttr, const RArray<TUint>& aReqFields)
+    {
+    _LIT(KPartialIdErr, "Incorrect Id when reading from a Partial landmark");
+    _LIT(KPartialCategoryInfoErr, "Incorrect Category info when reading from a Partial landmark");
+
+    TPosLmItemId id = aLandmark.LandmarkId();
+    AssertTrueSecL(id != 0, KPartialIdErr); 
+    
+    AssertTrueSecL(aLandmark.IsPartial(), _L("Landmark is not partial"));
+    
+    TInt err;
+    TPtrC name;
+    err = aLandmark.GetLandmarkName(name);
+    // Name is always included
+    CheckPartialErrorCodeL(aAttr & CPosLandmark::ELandmarkName, err); 
+    
+    TReal32 coverageR;     
+    err = aLandmark.GetCoverageRadius(coverageR);
+    CheckPartialErrorCodeL(aAttr & CPosLandmark::ECoverageRadius, err);
+    
+    TPtrC desc;
+    err = aLandmark.GetLandmarkDescription(desc); 
+    CheckPartialErrorCodeL(aAttr & CPosLandmark::EDescription, err);
+    
+    TPtrC iconName;
+    TInt iconIndex;
+    TInt iconMaskIndex;
+    err = aLandmark.GetIcon(iconName, iconIndex, iconMaskIndex); 
+    CheckPartialErrorCodeL(aAttr & CPosLandmark::EIcon, err);
+    
+    RArray<TPosLmItemId> categories;
+    CleanupClosePushL(categories);
+
+    aLandmark.GetCategoriesL(categories);
+    if (aAttr & CPosLandmark::ECategoryInfo)
+        {
+        AssertTrueSecL(categories.Count() != 0, KPartialCategoryInfoErr);
+        }
+    else
+        {
+        AssertTrueSecL(categories.Count() == 0, KPartialCategoryInfoErr);
+        }
+    CleanupStack::PopAndDestroy(&categories);
+
+    TLocality loc;
+    err = aLandmark.GetPosition(loc); 
+    CheckPartialErrorCodeL(aAttr & CPosLandmark::EPosition, err);
+    
+    // Check PositionFields    
+    // Check fields from EPositionFieldCompassCapabilitiesBegin up to EPositionFieldMediaCapabilitiesBegin+100 
+    // should be enough to also cover URL
+    for (TInt i=EPositionFieldCompassCapabilitiesBegin; i<EPositionFieldMediaCapabilitiesBegin+100; i++) 
+     	{
+     	TBool avail = aLandmark.IsPositionFieldAvailable((TUint16)i);
+     	TInt found = aReqFields.Find(i);
+     	if (avail && found != KErrNotFound)
+     		{
+     		TPtrC value;
+     		err = aLandmark.GetPositionField((TUint16)aReqFields[found], value);
+     		AssertTrueSecL(err == KErrNone, _L("Could not retrieve positionfield value"), err);
+     		iLog->Log(value);
+     		}
+     	else if (!avail && found != KErrNotFound || avail && found == KErrNotFound)
+     		{
+			// Fields 405 and 802 are not always set     		
+     		if (i!=405 && i!=802)
+     			{
+		 		TBuf<100> buf;
+		 		buf.Format(_L("ERROR: Mismatch in positionfields, id %d were not found"), i);
+		 		iLog->Log(buf);
+		 		iErrorsFound++;
+		 		}
+     		}
+     	}
+    }
+
+// ---------------------------------------------------------
+// CPosTp131::ChechPartialErrorCodeL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp131::CheckPartialErrorCodeL(const TBool aPartial, const TInt aErr)
+    {
+    _LIT(KPartialLmErr, "Incorrect error code returned when reading from a Partial landmark");
+
+    if (aPartial)
+        {
+        AssertTrueSecL(aErr == KErrNone, KPartialLmErr); 
+        }
+    else
+        {
+        AssertTrueSecL(aErr == KErrNotFound, KPartialLmErr);
+        }
+    }
+
+// ---------------------------------------------------------
+// CPosTp131::SearchPartialLandmarksL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp131::SearchPartialLandmarksL(const RPointerArray<CSearchResult>& aSearchResults)
+    {
+    _LIT(KNumOfMatchesErr, "No. of matches is incorrect");
+    _LIT(KNumOfMatchesErr2, "No. of display data matches is incorrect");
+    _LIT(KSortorderErr, "The sortorder is incorrect");
+   
+    TPosLmSortPref sortPref(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);  
+    CPosLmTextCriteria* textCriteria = CPosLmTextCriteria::NewLC();
+    
+    // Set DisplayData
+	iDisplayData = CPosLmDisplayData::NewL();
+    iLandmarkSearch->SetDisplayData(*iDisplayData);
+        
+	// Only do search for index KWhatToSearchFor in lmDbSearchResult.txt
+	// index 11 is MLFW
+	TInt KWhatToSearchFor = 11;
+    textCriteria->SetTextL(aSearchResults[KWhatToSearchFor]->TextCriteria());
+    textCriteria->SetAttributesToSearch(aSearchResults[KWhatToSearchFor]->Attributes());
+    textCriteria->SetPositionFieldsToSearchL(aSearchResults[KWhatToSearchFor]->PositionFields()); 
+
+    RArray<TUint> reqFields;
+    CleanupClosePushL(reqFields);
+    
+    iLog->Log(aSearchResults[KWhatToSearchFor]->TextCriteria());
+    CPosLmPartialReadParameters* partialParam = CPosLmPartialReadParameters::NewLC();
+    
+    CPosLmPartialReadParameters* fakePartialParam = CPosLmPartialReadParameters::NewLC();
+    reqFields.Append(EPositionFieldStreet);
+    fakePartialParam->SetRequestedPositionFields(reqFields);
+    reqFields.Reset();
+
+	// Dont search for all search criteras 
+	// takes just too long time on target (approx 1 hour for this test on target)
+	        	
+	// Search for all combinations from 0 - CPosLandmark::EDescription
+	// Ex attr=0, attr=1, attr=2, attr=3, .....attr=63,
+#ifdef __WINS__	
+    TUint max = CPosLandmark::EDescription;
+    max <<= 1;
+    max -= 1;
+#else
+    TUint max = CPosLandmark::ECategoryInfo;
+    max <<= 1;
+    max -= 1;
+#endif
+    
+    TUint attr=0;
+    for (attr=0; attr<=max; attr++)
+        {
+        partialParam->SetRequestedAttributes(attr);
+        reqFields.Reset();
+        
+        if (attr == 5)
+        	{
+        	// Add EPositionFieldCountry
+        	iLog->Log(_L("Also cover EPositionFieldCountry"));
+        	reqFields.Append(EPositionFieldCountry);
+        	}
+        else if (attr == 12)
+        	{
+        	// Add EPositionFieldCity, EPositionFieldStreet, EPositionFieldCountry
+        	iLog->Log(_L("Also cover EPositionFieldCity, EPositionFieldStreet, EPositionFieldCountry"));
+        	reqFields.Append(EPositionFieldCity);
+        	reqFields.Append(EPositionFieldStreet);
+        	reqFields.Append(EPositionFieldCountry);
+        	
+        	}
+        else if (attr == 32)
+        	{
+        	// Add EPositionFieldMediaLinksStart, EPositionFieldDistrict
+        	iLog->Log(_L("Also cover EPositionFieldMediaLinksStart, EPositionFieldDistrict"));
+        	reqFields.Append(EPositionFieldMediaLinksStart);
+        	reqFields.Append(EPositionFieldDistrict);
+        	}
+        	
+		iDisplayData->UnsetPartialReadParameters();
+        partialParam->SetRequestedPositionFields(reqFields);
+    	iDisplayData->SetPartialReadParametersL(*partialParam);
+    	
+        for (TInt i=0; i<2; i++)
+            {
+            switch (i)
+                {
+                case 0:
+                	{
+                	//**** async
+                	//iLog->Log(_L("*****Async, EDescending"));
+                	sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EDescending);
+                    iAscendedSorted = EFalse;
+                    iOperation = iLandmarkSearch->StartLandmarkSearchL(*textCriteria, sortPref, aSearchResults[KWhatToSearchFor]->Redefined());
+                    // Test that if SetPartialReadParametersL is called after search has started it has no affect
+                    iDisplayData->SetPartialReadParametersL(*fakePartialParam);
+                    ExecuteLmOpL();
+                    }
+                    break;
+                case 1:
+                	{
+                	partialParam->SetRequestedPositionFields(reqFields);
+    				iDisplayData->SetPartialReadParametersL(*partialParam);
+    	
+                    sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);
+                    //iLog->Log(_L("*****Async EAscending"));
+                    iAscendedSorted = ETrue;
+                    iOperation = iLandmarkSearch->StartLandmarkSearchL(*textCriteria, sortPref, aSearchResults[KWhatToSearchFor]->Redefined());
+                    ExecuteLmOpL();
+                    }
+                    break;
+                }
+            
+            CPosLmItemIterator* iter = iLandmarkSearch->MatchIteratorL();
+            CleanupStack::PushL(iter);
+            
+            RArray<TPosLmItemId>* searchResults = &aSearchResults[KWhatToSearchFor]->SearchResult();
+            if ((TUint)searchResults->Count() != iLandmarkSearch->NumOfMatches())
+                {
+                TBuf<50> buf;
+                buf.Append(_L("KNumOfMatchesError when searching for "));
+                buf.Append(aSearchResults[KWhatToSearchFor]->TextCriteria());
+                iLog->Log(buf);
+               
+               iLog->Log(KNumOfMatchesErr);
+               User::Leave(-1);
+               
+                }
+                
+            // Check correct displayData
+            AssertTrueSecL(iter->NumOfItemsL() == iDisplayData->Count(), KNumOfMatchesErr2);
+            LandmarksSortL(*searchResults, sortPref);
+            
+            TInt ii=0;
+            TPosLmItemId id = iter->NextL();
+                   
+            for (TInt i=0;i<iDisplayData->Count();i++)
+                {
+                CPosLmDisplayItem& item = iDisplayData->DisplayItem(i);
+                TInt lmId = item.Landmark().LandmarkId();
+
+                CPosLandmark* target = iDatabase->ReadLandmarkLC((*searchResults)[ii]);
+                TPtrC sourceName, targetName;
+                item.Landmark().GetLandmarkName(sourceName);
+                target->GetLandmarkName(targetName);
+                
+                if (lmId != (*searchResults)[ii])
+                    {
+                    // If found multiple match -> "Mölndal" etc
+                    //Check if same name then don't Leave
+                    AssertTrueSecL(sourceName.CompareC(targetName) == 0,KSortorderErr, lmId);
+                    }
+                else
+                    {
+                    //CompareLandmarksL(item.Landmark(), *target);
+                    // Add some check of partial landmarks here
+                    AssertTrueSecL(sourceName.CompareC(targetName) == 0,KSortorderErr, lmId);
+                    
+                    // Landmarkname is always included when sorting
+                    CheckPartialLandmarkL(item.Landmark() , attr | CPosLandmark::ELandmarkName, reqFields);
+                    }
+
+                    CleanupStack::PopAndDestroy(target);
+                id = iter->NextL();
+
+                ++ii;
+                }
+            CleanupStack::PopAndDestroy(iter);
+            iDisplayData->Reset();
+            } 
+        } 
+        
+    iLandmarkSearch->UnsetDisplayData();
+    CleanupStack::PopAndDestroy(fakePartialParam);
+    CleanupStack::PopAndDestroy(partialParam);
+    CleanupStack::PopAndDestroy(&reqFields);
+    CleanupStack::PopAndDestroy(textCriteria);
+    delete iDisplayData;
+    iDisplayData = NULL;
+    }
+
+// ---------------------------------------------------------
+// CPosTp131::SearchWithSortOrderL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp131::SearchWithSortOrderL(const RPointerArray<CSearchResult>& aSearchResults)
+    {
+    _LIT(KNumOfMatchesErr, "No. of matches is incorrect");
+    _LIT(KNumOfMatchesErr2, "No. of display data matches is incorrect");
+    _LIT(KSortorderErr, "The sortorder is incorrect");
+   
+    TPosLmSortPref sortPref(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);  
+    CPosLmTextCriteria* textCriteria = CPosLmTextCriteria::NewLC();
+    
+    // Set DisplayData
+	iDisplayData = CPosLmDisplayData::NewL();
+    iLandmarkSearch->SetDisplayData(*iDisplayData);
+
+	CPosLmPartialReadParameters* partialParam = CPosLmPartialReadParameters::NewLC();
+	
+	RArray<TUint> reqFields;
+    CleanupClosePushL(reqFields);
+
+	// Test that UnsetPartialReadParameters works	
+	reqFields.Append(EPositionFieldCountry);
+	partialParam->SetRequestedPositionFields(reqFields);
+    iDisplayData->SetPartialReadParametersL(*partialParam);
+    CleanupStack::PopAndDestroy(&reqFields);
+    CleanupStack::PopAndDestroy(partialParam);
+    iDisplayData->UnsetPartialReadParameters();
+    
+	// Dont search for all search criteras (see excel file)
+	// takes just too long time on target (approx 1 hour for this test on target)
+	// therefore start at j=7
+#ifdef __WINS__	
+    for(TInt j=2; j<aSearchResults.Count(); j++)
+#else
+    for(TInt j=7; j<aSearchResults.Count(); j++)
+#endif
+        {   
+        textCriteria->SetTextL(aSearchResults[j]->TextCriteria());
+        textCriteria->SetAttributesToSearch(aSearchResults[j]->Attributes());
+        textCriteria->SetPositionFieldsToSearchL(aSearchResults[j]->PositionFields()); 
+
+        iLog->Log(aSearchResults[j]->TextCriteria());
+        
+        // Dont test sync search
+        for (TInt i=2; i<6; i++)
+            {
+            switch (i)
+                {
+                //**** sync
+                case 0:
+                	{
+                	sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);
+                    ExecuteAndDeleteLD(iLandmarkSearch->StartLandmarkSearchL(
+                        *textCriteria, 
+                        sortPref, 
+                        aSearchResults[j]->Redefined()));
+                    }
+                    break;
+                case 1:
+                	{
+                    sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EDescending);
+                    ExecuteAndDeleteLD(iLandmarkSearch->StartLandmarkSearchL(
+                        *textCriteria, 
+                        sortPref, 
+                        aSearchResults[j]->Redefined()));
+                    }
+                    break;
+                case 2:
+                	{
+                	//**** async
+                	//iLog->Log(_L("*****Async, EDescending"));
+                	sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EDescending);
+                    iAscendedSorted = EFalse;
+                    //iLog->Log(_L("Start"));
+                    iOperation = iLandmarkSearch->StartLandmarkSearchL(*textCriteria, sortPref, aSearchResults[j]->Redefined());
+                    ExecuteLmOpL();
+                    //iLog->Log(_L("Done"));
+                    }
+                    break;
+                case 3:
+                	{
+                    sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);
+                    //iLog->Log(_L("*****Async EAscending"));
+                    iAscendedSorted = ETrue;
+                    iOperation = iLandmarkSearch->StartLandmarkSearchL(*textCriteria, sortPref, aSearchResults[j]->Redefined());
+                    ExecuteLmOpL();
+                    }
+                    break;
+                //**** asych with User::WaitForRequest()
+                case 4:
+                    {
+                    //iLog->Log(_L("*****User::WaitForRequest() EDescending"));
+                    sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EDescending);
+                    CPosLmOperation* op = iLandmarkSearch->StartLandmarkSearchL(
+                        *textCriteria, 
+                        sortPref, 
+                        aSearchResults[j]->Redefined());
+                    CleanupStack::PushL(op);
+                    RunAsyncOperationByWaitForReqL(op);
+                    CleanupStack::PopAndDestroy(op);
+                    }
+                    break;
+                case 5:
+                    {
+                    //iLog->Log(_L("*****User::WaitForRequest() EAscending"));
+                    sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);
+                    CPosLmOperation* op = iLandmarkSearch->StartLandmarkSearchL(
+                        *textCriteria, 
+                        sortPref, 
+                        aSearchResults[j]->Redefined());
+                    CleanupStack::PushL(op);
+                    RunAsyncOperationByWaitForReqL(op);
+                    CleanupStack::PopAndDestroy(op);
+                    }
+                    break;
+                }
+            
+        CPosLmItemIterator* iter = iLandmarkSearch->MatchIteratorL();
+        CleanupStack::PushL(iter);
+        
+        RArray<TPosLmItemId>* searchResults = &aSearchResults[j]->SearchResult();
+        if ((TUint)searchResults->Count() != iLandmarkSearch->NumOfMatches())
+            {
+            TBuf<50> buf;
+            buf.Append(_L("KNumOfMatchesError when searching for "));
+            buf.Append(aSearchResults[j]->TextCriteria());
+            iLog->Log(buf);
+            
+            iLog->Log(KNumOfMatchesErr);
+            User::Leave(-1);
+            }
+            
+        // Check correct displayData
+        AssertTrueSecL(iter->NumOfItemsL() == iDisplayData->Count(), KNumOfMatchesErr2);
+        LandmarksSortL(*searchResults, sortPref);
+        
+        TInt ii=0;
+        TPosLmItemId id = iter->NextL();
+               
+        for (TInt i=0;i<iDisplayData->Count();i++)
+            {
+            CPosLmDisplayItem& item = iDisplayData->DisplayItem(i);
+            TInt lmId = item.Landmark().LandmarkId();
+
+            CPosLandmark* target = iDatabase->ReadLandmarkLC((*searchResults)[ii]);
+            TPtrC sourceName, targetName;
+            item.Landmark().GetLandmarkName(sourceName);
+            target->GetLandmarkName(targetName);
+            
+            if (lmId != (*searchResults)[ii])
+                {
+                // If found multiple match -> "Mölndal" etc
+                //Check if same name then don't Leave
+                AssertTrueSecL(sourceName.CompareC(targetName) == 0,KSortorderErr, lmId);
+                }
+            else
+                {
+                CompareLandmarksL(item.Landmark(), *target);
+                }
+
+            CleanupStack::PopAndDestroy(target);
+            id = iter->NextL();
+
+            ++ii;
+            }
+        CleanupStack::PopAndDestroy(iter);
+        iDisplayData->Reset();
+        }
+        }
+    iLandmarkSearch->UnsetDisplayData();
+    CleanupStack::PopAndDestroy(textCriteria);
+    delete iDisplayData;
+    iDisplayData = NULL;
+    }
+
+// ---------------------------------------------------------
+// CPosTp131::CheckResetL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp131::CheckResetL(const RPointerArray<CSearchResult>& aSearchResults)
+    {
+    iLog->Log(_L("CheckResetL"));
+    CPosLmTextCriteria* textCriteria = CPosLmTextCriteria::NewLC();
+    
+    // Set DisplayData
+    CPosLmDisplayData* displayData = CPosLmDisplayData::NewL();
+	CleanupStack::PushL(displayData);
+    iLandmarkSearch->SetDisplayData(*displayData);
+        
+    for(TInt j=0; j<aSearchResults.Count(); j++)
+        {
+		textCriteria->SetTextL(aSearchResults[j]->TextCriteria());
+		textCriteria->SetAttributesToSearch(aSearchResults[j]->Attributes());
+		textCriteria->SetPositionFieldsToSearchL(aSearchResults[j]->PositionFields());
+
+		// Sync
+		ExecuteAndDeleteLD(iLandmarkSearch->StartLandmarkSearchL(*textCriteria, aSearchResults[j]->Redefined()));
+		AssertTrueSecL(iLandmarkSearch->NumOfMatches() == displayData->Count(),_L("Wrong number of matches1"),j);
+		displayData->Reset();
+		AssertTrueSecL(displayData->Count() == 0,_L("DisplayData should have been resetted"));
+		
+		// Async
+		RunAsyncOperationLD(iLandmarkSearch->StartLandmarkSearchL(*textCriteria, aSearchResults[j]->Redefined()));
+		AssertTrueSecL(iLandmarkSearch->NumOfMatches() == displayData->Count(),_L("Wrong number of matches2"),j);
+    
+    	RArray<TPosLmItemId>* searchResults = &aSearchResults[j]->SearchResult();
+        //AssertTrueSecL(iLandmarkSearch->NumOfMatches() == searchResults->Count(),_L("Wrong number of matches3"),j);
+        if (iLandmarkSearch->NumOfMatches() != searchResults->Count())
+        	{
+	        TBuf<150> buf;
+	        buf.Format(_L("Exp %d nr of matches, got %d, searching for: "), searchResults->Count(), iLandmarkSearch->NumOfMatches());
+	        buf.Append(aSearchResults[j]->TextCriteria());
+	        iLog->Log(buf);
+        	}
+        
+        AssertTrueSecL(displayData->Count() == iLandmarkSearch->NumOfMatches(),_L("DisplayData matches is not correct"));
+        
+    }
+
+	// Test unset of displaydata
+	iLandmarkSearch->UnsetDisplayData();
+    CleanupStack::PopAndDestroy(displayData);
+    
+    displayData = CPosLmDisplayData::NewL();
+	CleanupStack::PushL(displayData);
+    iLandmarkSearch->SetDisplayData(*displayData);
+    iLandmarkSearch->UnsetDisplayData();
+    
+    textCriteria->SetTextL(aSearchResults[0]->TextCriteria());
+	textCriteria->SetAttributesToSearch(aSearchResults[0]->Attributes());
+	textCriteria->SetPositionFieldsToSearchL(aSearchResults[0]->PositionFields());
+	ExecuteAndDeleteLD(iLandmarkSearch->StartLandmarkSearchL(*textCriteria));
+	AssertTrueSecL(displayData->Count() == 0,_L("No matches should be found in DisplayData"));
+        
+    iLandmarkSearch->SetDisplayData(*displayData);
+    
+    textCriteria->SetTextL(aSearchResults[0]->TextCriteria());
+	textCriteria->SetAttributesToSearch(aSearchResults[0]->Attributes());
+	textCriteria->SetPositionFieldsToSearchL(aSearchResults[0]->PositionFields());
+	ExecuteAndDeleteLD(iLandmarkSearch->StartLandmarkSearchL(*textCriteria));
+	RArray<TPosLmItemId>* searchResults = &aSearchResults[0]->SearchResult();
+   	AssertTrueSecL(iLandmarkSearch->NumOfMatches() == displayData->Count(),_L("Wrong number of matches4"));
+    AssertTrueSecL(iLandmarkSearch->NumOfMatches() == searchResults->Count(),_L("Wrong number of matches5"));
+    
+    iLandmarkSearch->UnsetDisplayData();
+    CleanupStack::PopAndDestroy(displayData);
+	CleanupStack::PopAndDestroy(textCriteria);
+    }
+
+// ---------------------------------------------------------
+// CPosTp131::CancelTestL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp131::CancelTestL(const RPointerArray<CSearchResult>& aSearchResults)
+    {
+    iLog->Log(_L("CancelTestL"));
+	CPosLmTextCriteria* textCriteria = CPosLmTextCriteria::NewLC();
+	
+	// Cancel search operation and verify that the displayData result is sorted correctly
+	TPosLmSortPref sortPref(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);
+	
+    for (TInt pp=0;pp<2;pp++)
+    	{
+    	if (pp == 0) 
+    		{
+    		//iLog->Log(_L("Sorting Descending"));
+    		sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EDescending);
+    		}
+    	else {
+    		sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);
+    		//iLog->Log(_L("Sorting Ascending"));
+    		}
+    		
+	    // Set DisplayData
+	    iLandmarkSearch->UnsetDisplayData();
+	    delete iDisplayData;
+	    iDisplayData = NULL;
+	    CPosLmDisplayData* displayData = CPosLmDisplayData::NewL();
+		CleanupStack::PushL(displayData);
+	    iLandmarkSearch->SetDisplayData(*displayData);
+	        
+	    for(TInt j=0; j<aSearchResults.Count(); j++)
+	        {
+			textCriteria->SetTextL(aSearchResults[j]->TextCriteria());
+			textCriteria->SetAttributesToSearch(aSearchResults[j]->Attributes());
+			textCriteria->SetPositionFieldsToSearchL(aSearchResults[j]->PositionFields());
+
+			TBuf<150> buf;
+		    buf.Append(aSearchResults[j]->TextCriteria());
+		    //iLog->Log(buf);
+		        
+			// Cancel operation in callback
+			RunAsyncOperationAndCancelInCallbackLD(iLandmarkSearch->StartLandmarkSearchL(*textCriteria, sortPref, EFalse));
+			AssertTrueSecL(iLandmarkSearch->NumOfMatches() == displayData->Count(),_L("Wrong number of matches after cancel"),j);
+			
+			buf.Zero();
+			buf.Format(_L("Search returned %d nr of matches, displayData %d nr of matches"),iLandmarkSearch->NumOfMatches(), displayData->Count());
+			//iLog->Log(buf);
+			
+			// Check sort order below
+			CPosLmItemIterator* iter = iLandmarkSearch->MatchIteratorL();
+	        CleanupStack::PushL(iter);
+	        
+	        if (iter->NumOfItemsL()>0)
+	        	{
+	        	RArray<TPosLmItemId> arr;
+	        	CleanupClosePushL(arr);
+	        	iter->GetItemIdsL(arr, 0, iter->NumOfItemsL());
+	        
+	        	// Sort matchiterator
+	        	LandmarksSortL(arr, sortPref);
+			    
+			    TInt index=0;
+				TInt itemId = displayData->NewItemIndex();
+			    while (itemId != KPosLmNoNewItems)
+			        {
+			        CPosLmDisplayItem& item = displayData->DisplayItem(itemId);
+			        
+			        AssertTrueSecL(item.DisplayItemType() == CPosLmDisplayItem::ELandmarkItem, 
+			        	_L("Wrong item returned, only ELandmarkItem should be returned"));
+			        
+			        AssertTrueSecL(item.DatabaseIndex() == 0, _L("Wrong DatabaseIndex, should be 0"));
+			    	
+				    TInt lmId = item.Landmark().LandmarkId();
+				    
+				    
+	//		    	AssertTrueSecL(arr[index] == lmId , _L("Incorrect sortorder"));
+			    	CPosLandmark* lm = iDatabase->ReadLandmarkLC(arr[index]);
+			    	
+				    if ( arr[index] != lmId )
+				        {
+			    	TPtrC sourceName;
+				    item.Landmark().GetLandmarkName(sourceName);
+					TPtrC name2;
+					lm->GetLandmarkName(name2);
+                        iLog->Log( _L("CancelTestL: #%02d, exp %d, act %d, '%S', '%S'"), 
+                            index, arr[index], lmId, &name2, &sourceName );
+					
+                        if ( sourceName.CompareC( name2 ) != 0 )
+                            {
+                            AssertTrueSecL( arr[index] == lmId, _L("Incorrect sort order") );
+                            }
+				        }
+				    else
+				        {
+					CompareLandmarksL(*lm, item.Landmark());
+				        }
+					
+			        itemId = displayData->NewItemIndex();
+			        index++;
+			        CleanupStack::PopAndDestroy(lm);
+			        }
+			    CleanupStack::PopAndDestroy(&arr);       
+	        	}
+	        CleanupStack::PopAndDestroy(iter);
+			}
+			iLandmarkSearch->UnsetDisplayData();
+	    	CleanupStack::PopAndDestroy(displayData);
+	    }
+		CleanupStack::PopAndDestroy(textCriteria);
+	}
+
+// ---------------------------------------------------------
+// Tp131InternalLandmarksSortL
+// 
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//	
+TInt Tp131InternalLandmarksSortL(const CPosLandmark& aSource, const CPosLandmark& aTarget)
+    {
+    TPtrC sourceName, targetName;
+    
+    User::LeaveIfError(aSource.GetLandmarkName(sourceName));  
+    User::LeaveIfError(aTarget.GetLandmarkName(targetName));
+    
+    return sourceName.CompareC(targetName);
+    }
+    	
+// ---------------------------------------------------------
+// CPosTp131::LandmarksSortL
+// 
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp131::LandmarksSortL(RArray<TPosLmItemId>& aArray, const TPosLmSortPref& aSortPref)
+    {
+    
+    RPointerArray<CPosLandmark> landmarks;
+    CleanupClosePushL(landmarks);
+    
+    for (TInt i=0; i<aArray.Count(); i++)
+        {
+        CPosLandmark* lm = iDatabase->ReadLandmarkLC(aArray[i]);
+        landmarks.Append(lm);
+        CleanupStack::Pop(lm);
+        }
+    
+    TLinearOrder<CPosLandmark> order(Tp131InternalLandmarksSortL);
+    landmarks.Sort(order);
+  
+    aArray.Reset();
+
+    if (aSortPref.SortOrder() == TPosLmSortPref::EAscending)
+        {
+        for (TInt j=0; j<landmarks.Count(); j++)
+            {
+            aArray.Append(landmarks[j]->LandmarkId());
+            }
+        }
+    else
+        {
+        for (TInt k=landmarks.Count()-1; k>=0; k--)
+            {
+            aArray.Append(landmarks[k]->LandmarkId());
+            }
+        }
+    landmarks.ResetAndDestroy();
+    CleanupStack::PopAndDestroy(&landmarks);
+    
+    }
+
+// ---------------------------------------------------------
+// CPosTp131::ExecuteLmOpL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp131::ExecuteLmOpL()
+    {
+    CActiveLmOperation* operationWrapper = new (ELeave) CActiveLmOperation(iLog);
+    CleanupStack::PushL(operationWrapper);
+        
+	operationWrapper->Start(iOperation, this);        
+    CActiveScheduler::Start();
+    
+    operationWrapper->CheckOperationL();
+    operationWrapper->DeleteOperationD();
+
+    CleanupStack::PopAndDestroy(operationWrapper);
+    
+    }
+    
+// ---------------------------------------------------------
+// CPosTp131::NotifyProgress
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp131::NotifyProgress(TReal aProgress)
+    {
+
+    TBuf<100> buf;
+
+    TInt progress = (TInt) (aProgress * 100);
+    buf.Format(_L("Progress: %d"), progress);
+    
+    
+    if (iDisplayData)
+    	{
+    
+		
+		if (iDisplayData->Count()>0)
+			{
+			CPosLmItemIterator* iter = iLandmarkSearch->MatchIteratorL();
+        	CleanupStack::PushL(iter);
+        	
+        	RArray<TPosLmItemId> arr;
+        	CleanupClosePushL(arr);
+        	iter->GetItemIdsL(arr, 0, iter->NumOfItemsL());
+        	TPosLmSortPref sortPref(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);  
+        	
+        	if (iAscendedSorted) sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);
+        	else sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EDescending);
+        	// Sort matchiterator
+        	LandmarksSortL(arr, sortPref);
+        	
+        	if (iter->NumOfItemsL() != iDisplayData->Count())
+		    	{
+		    	iLog->Log(_L("Error: Wrong number of items"));
+		    	iErrorsFound++;
+		    	}		    
+
+			TInt itemId = iDisplayData->NewItemIndex();
+		    while (itemId != KPosLmNoNewItems)
+		        {
+		        CPosLmDisplayItem& item = iDisplayData->DisplayItem(itemId);
+		        
+		        if (item.DisplayItemType() != CPosLmDisplayItem::ELandmarkItem)
+            	{
+            	iLog->Log(_L("Error: TDisplayItemType should be ELandmarkItem"));
+            	iErrorsFound++;
+            	}
+            
+            if (item.DatabaseIndex() != 0)
+            	{
+            	// When single search, index should always be 0
+            	iLog->Log(_L("Error: Wrong DatabaseIndex, should be 0"));
+            	iErrorsFound++;
+            	}
+
+				TPtrC lmName;
+				item.Landmark().GetLandmarkName(lmName);
+				TInt lmId = item.Landmark().LandmarkId();
+				
+				// Compare all landmarks from CPosLmDisplayItem and landmarks from MatchIteratorL
+		        for (TInt i=0;i<iDisplayData->Count();i++)
+			            {
+			            CPosLmDisplayItem& item = iDisplayData->DisplayItem(i);
+			            TPtrC sourceName;
+			            item.Landmark().GetLandmarkName(sourceName);
+						
+						
+						CPosLandmark* lm2 = iDatabase->ReadLandmarkLC(arr[i]);
+						TPtrC name;
+						lm2->GetLandmarkName(name);
+					
+						
+						// Only compare names
+						if (name.Compare(sourceName) != 0) 
+							{
+							iLog->Log(_L("ERROR: No match, name %S, sourceName %S"), &name, &sourceName);
+							iErrorsFound++;
+							}
+						
+						CleanupStack::PopAndDestroy(lm2);							
+						}
+				
+		        itemId = iDisplayData->NewItemIndex();		        
+		        }
+
+		    CleanupStack::PopAndDestroy(&arr);
+        	CleanupStack::PopAndDestroy(iter);
+        	}
+        }
+	}
+        
+//  End of File