landmarks/locationlandmarks/tsrc/LandmarkTestModule/src/FT_CPosTp35.cpp
branchRCL_3
changeset 44 2b4ea9893b66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarks/locationlandmarks/tsrc/LandmarkTestModule/src/FT_CPosTp35.cpp	Tue Aug 31 15:37:04 2010 +0300
@@ -0,0 +1,903 @@
+/*
+* 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_CPosTp35.h"
+#include <f32file.h>
+#include <e32math.h>
+#include <e32math.h>
+
+#include <EPos_CPosLandmarkDatabase.h>
+#include <EPos_CPosLandmarkSearch.h>
+#include <EPos_CPosLMItemIterator.h>
+#include <EPos_CPosLmDatabaseManager.h>
+#include "FT_LandmarkConstants.h" 
+
+// CONSTANTS
+const TInt KMaxFieldLength = 80;
+const TInt KDistanceFieldLength = 24;
+const TInt KMaxNearestLineLength = 1024;
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CPosTp35::CloseTest
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp35::CloseTest()
+    {
+    iLog->Log(_L("CloseTest"));
+    delete iDatabase;
+    iDatabase = NULL;
+    delete iLandmarkSearch;
+    iLandmarkSearch = NULL;
+
+    iNearestSearchResults.ResetAndDestroy();
+    }
+
+// ---------------------------------------------------------
+// CPosTp35::StartL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp35::StartL()
+    {
+    RemoveDefaultDbL();
+    RemoveAllLmDatabasesL();
+    iDatabase = UseNearestSearchGeneratedDbFileL();
+    
+    if (iDatabase->IsInitializingNeeded())
+       {
+       ExecuteAndDeleteLD(iDatabase->InitializeL());
+       }
+    
+    AppendNearestSearchResultsL();
+    iLandmarkSearch = CPosLandmarkSearch::NewL(*iDatabase);
+    
+    iLog->Log(_L("Testing search with criterias read from LmDbNearestResult.txt syncronously"));
+    SearchL();
+
+    iLog->Log(_L("Testing search with criterias read from LmDbNearestResult.txt asyncronously"));
+    SearchL(ETrue);
+
+    iLog->Log(_L("Testing search and cancel"));
+    SearchAndCancelL();
+
+    iLog->Log(_L("Testing search and cancel in callback"));
+    SearchAndCancelL(ETrue);
+
+    iLog->Log(_L("Testing search with a sortorder"));
+    SearchWithSortOrderL();
+
+    iLog->Log(_L("Testing error codes"));
+    _LIT(KStartCatErr, "StartCategorySearch should leave with KErrArgument with nearest criteria");
+    _LIT(KNaNErr, "Max distance should be NaN by default");
+
+    TCoordinate coord(12, 13);
+    CPosLmNearestCriteria* nearestCriteria = CPosLmNearestCriteria::NewLC(coord);
+    AssertTrueSecL(Math::IsNaN(nearestCriteria->MaxDistance()), KNaNErr);
+
+    TRAPD(err, iLandmarkSearch->StartCategorySearchL(*nearestCriteria, CPosLmCategoryManager::ECategorySortOrderNone));
+    AssertTrueSecL(err == KErrArgument, KStartCatErr);
+    
+    CleanupStack::PopAndDestroy(nearestCriteria);
+        
+    TCoordinate pos(55, 18);    
+    nearestCriteria = CPosLmNearestCriteria::NewLC(pos, ETrue);
+    nearestCriteria->SetMaxDistance(1);
+    RunAsyncOperationLD(iLandmarkSearch->StartLandmarkSearchL(*nearestCriteria, EFalse));
+    
+    _LIT(KReturned, "Returned no. of matches: %d");
+    TBuf<100> info;
+    info.Format(KReturned, iLandmarkSearch->NumOfMatches());
+    iLog->Log(info);
+        
+    CleanupStack::PopAndDestroy(nearestCriteria);
+    
+    nearestCriteria = CPosLmNearestCriteria::NewLC(pos, ETrue);
+    nearestCriteria->SetMaxDistance(300);
+    RunAsyncOperationLD(iLandmarkSearch->StartLandmarkSearchL(*nearestCriteria, EFalse));
+    
+    info.Format(KReturned, iLandmarkSearch->NumOfMatches());
+    iLog->Log(info);
+    CleanupStack::PopAndDestroy(nearestCriteria);
+
+    }
+
+// ---------------------------------------------------------
+// CPosTp35::UseNearestSearchGeneratedDbFileL
+// 
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CPosLandmarkDatabase* CPosTp35::UseNearestSearchGeneratedDbFileL()
+    {    
+    _LIT(KDbFile, "eposlmnearestsearch.ldb");
+    CopyTestDbFileL(KDbFile);
+    
+    CPosLmDatabaseManager* manager = CPosLmDatabaseManager::NewL();
+    CleanupStack::PushL(manager);
+    // This db must exist
+    manager->SetDefaultDatabaseUriL(KDbFile);
+    CleanupStack::PopAndDestroy(manager);
+    
+    return CPosLandmarkDatabase::OpenL(KDbFile);
+    }
+
+// ---------------------------------------------------------
+// CPosTp35::SearchL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp35::SearchL(const TBool& aSync)
+    {
+   
+    for(TInt i=0; i<iNearestSearchResults.Count(); i++)
+        {
+        TCoordinate coord(iNearestSearchResults[i]->iLatitude, iNearestSearchResults[i]->iLongitude);
+        iLog->Log(_L("SearchL"));
+        CPosLmNearestCriteria* nearestCriteria = CPosLmNearestCriteria::NewLC(coord, iNearestSearchResults[i]->iUseCoverageRadius);
+        nearestCriteria->SetMaxDistance(iNearestSearchResults[i]->iMaxDistance);
+        
+        TBuf<100> pelle;
+        pelle.Format(_L("StartSearchOperationL: Searching for Lat %f Long %f"), iNearestSearchResults[i]->iLatitude, iNearestSearchResults[i]->iLongitude);
+		iLog->Log(pelle);
+
+        if (iNearestSearchResults[i]->iMaxSearchResult > 0)
+            {
+            iLandmarkSearch->SetMaxNumOfMatches(iNearestSearchResults[i]->iMaxSearchResult);
+            }
+        else
+            {
+            iLandmarkSearch->SetMaxNumOfMatches(KPosLmMaxNumOfMatchesUnlimited);
+            }
+
+        if (aSync)
+            {
+            RunAsyncOperationLD(iLandmarkSearch->StartLandmarkSearchL(*nearestCriteria, iNearestSearchResults[i]->Redefined()));
+            }
+        else
+            {
+            ExecuteAndDeleteLD(iLandmarkSearch->StartLandmarkSearchL(*nearestCriteria, iNearestSearchResults[i]->Redefined()));
+            }
+        
+        if (iNearestSearchResults[i]->Redefined() && i > 0)
+            {
+            iLog->Log(_L("Redefined"));
+            
+            for (TInt j=0; j<iNearestSearchResults[i]->iDistances.Count(); j++)
+                {
+                TBool found = EFalse;
+                TInt id = 0;
+                TPosLmItemId idde;
+                
+                id = j;
+                idde = iNearestSearchResults[i]->iDistances[j].Id();
+                    
+                TBuf<100> debug;
+                debug.Format(_L("Looking for id %d or id: %d "), idde, id);
+                //iLog->Log(debug);
+                        
+                for (TInt p=0;p<iNearestSearchResults[i-1]->iDistances.Count();p++)
+                    {
+
+                    if (iNearestSearchResults[i]->iDistances[j].Id() == iNearestSearchResults[i-1]->iDistances[p].Id())
+                        {
+                        found = ETrue;
+                        TBuf<100> buf;
+                        buf.Format(_L("Found id %d or id: %d "), idde, id);
+                        //iLog->Log(buf);
+                        }
+                    }
+                if (!found)
+                    {
+                    // Remove since not found, only keep ids that was found in previous search
+                    TBuf<100> buf;
+                    buf.Format(_L("Removing lm Id %d from index %d"), idde, id);
+                    //iLog->Log(buf);
+                    iNearestSearchResults[i]->iDistances.Remove(id);
+                    //iLog->Log(_L("Removing Done"));
+                    j--;
+                    }
+                //iLog->Log(_L("***********"));
+                }
+
+                        
+            }
+        
+        CheckSearchResultL(*iNearestSearchResults[i]); 
+    
+        CleanupStack::PopAndDestroy(nearestCriteria);   
+        }
+    }
+
+// ---------------------------------------------------------
+// CPosTp35::CheckSearchResultL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+
+//void CPosTp35::CheckSearchResultL(CNearestSearchResult& aSearchResult)
+void CPosTp35::CheckSearchResultL(CNearestSearchResultTp35& aSearchResult)
+    {    
+    _LIT(KNumOfMatchesErr, "No. of matches is incorrect when the search is performed");
+    
+    TUint expectedNoMatches = aSearchResult.iDistances.Count();
+    if (aSearchResult.iMaxSearchResult != 0 && aSearchResult.iMaxSearchResult < aSearchResult.iDistances.Count())
+        {
+        expectedNoMatches = aSearchResult.iMaxSearchResult;
+        }
+    
+    if (expectedNoMatches != iLandmarkSearch->NumOfMatches())
+        {
+        _LIT(KExpected, "Expected no. of matches: %d");
+        _LIT(KReturned, "Returned no. of matches: %d");
+        TBuf<100> info;
+        info.Format(KExpected, expectedNoMatches);
+        iLog->Log(info);
+        info.Format(KReturned, iLandmarkSearch->NumOfMatches());
+        iLog->Log(info);
+       
+        
+        iLog->Log(KNumOfMatchesErr);
+        User::Leave(-1);
+        }
+
+    CPosLmItemIterator* iter = iLandmarkSearch->MatchIteratorL();
+    CleanupStack::PushL(iter);
+    
+    TInt index=0;
+    TPosLmItemId id = iter->NextL();
+    while (id != KPosLmNullItemId)
+        {
+        if (aSearchResult.iDistances[index].iId != id)
+            {
+            // if the distance is equal to the distance to the landmark  
+            // before or after then no error. 
+            // This to be able to use a databse with landmarks with the same position.
+            
+            TBool noError=EFalse;
+            if (index > 0)
+                {
+                noError = (aSearchResult.iDistances[index-1].iDistance == aSearchResult.iDistances[index].iDistance);   
+                }
+            if (index < aSearchResult.iDistances.Count() && !noError)
+                {
+                noError = (aSearchResult.iDistances[index+1].iDistance == aSearchResult.iDistances[index].iDistance);
+                }
+            if (!noError)
+                {
+                _LIT(KUnexpectedItemId, "Unexpected item id");    
+                _LIT(KExpected, "Expected item id: %d");
+                _LIT(KReturned, "Returned item id: %d");
+                TBuf<100> info;
+                info.Format(KExpected, aSearchResult.iDistances[index].iId);
+                iLog->Log(info);
+                info.Format(KReturned, id);
+                iLog->Log(info);
+
+                TBuf<800> info2;
+                aSearchResult.Print(info2);
+                iLog->Log(info2);
+
+                
+                iLog->Log(KUnexpectedItemId);
+        		User::Leave(-1);
+        
+                }
+            }
+        _LIT(KReturned, "Returned id: %d or id: %d");
+        TBuf<100> info;
+        info.Format(KReturned, aSearchResult.iDistances[index].iId, id);
+        //iLog->Log(info);
+                
+        id = iter->NextL();
+        index++;
+        }
+    
+    CleanupStack::PopAndDestroy(iter);
+  
+    }
+
+// ---------------------------------------------------------
+// CPosTp35::SearchAndCancelL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp35::SearchAndCancelL(const TBool& aInCallback)
+    {
+    _LIT(KNumOfMatchesErr, "No. of matches is incorrect when the search is performed");
+
+    // Test search with one criteria
+    const TInt KIndex=0;
+
+    TCoordinate coord(iNearestSearchResults[KIndex]->iLatitude, iNearestSearchResults[KIndex]->iLongitude);
+        
+    CPosLmNearestCriteria* nearestCriteria = CPosLmNearestCriteria::NewLC(coord, iNearestSearchResults[KIndex]->iUseCoverageRadius);
+    
+    iLandmarkSearch->SetMaxNumOfMatches(KPosLmMaxNumOfMatchesUnlimited);
+    if (aInCallback)
+        {
+        RunAsyncOperationAndCancelInCallbackLD(iLandmarkSearch->StartLandmarkSearchL(
+                        *nearestCriteria, 
+                        iNearestSearchResults[KIndex]->Redefined()));
+        }
+    else
+        {
+        RunAsyncOperationAndCancelLD(iLandmarkSearch->StartLandmarkSearchL(
+                        *nearestCriteria, 
+                        iNearestSearchResults[KIndex]->Redefined()));
+        }
+
+    CPosLmItemIterator* iter = iLandmarkSearch->MatchIteratorL();
+    CleanupStack::PushL(iter);
+ 
+    if (aInCallback)
+        {
+        if (iter->NumOfItemsL() != iLandmarkSearch->NumOfMatches())
+            {
+            iLog->Log(_L("Iterators no. of items is not equal to LandmarksSearch no. matches"));
+            _LIT(KExpected, "Iter. of matches: %d");
+            _LIT(KReturned, "LandmarksSearch no. of matches: %d");
+            TBuf<100> info;
+            info.Format(KExpected, iter->NumOfItemsL());
+            iLog->Log(info);
+            info.Format(KReturned, iLandmarkSearch->NumOfMatches());
+            iLog->Log(info);
+            
+            iLog->Log(KNumOfMatchesErr);
+        	User::Leave(-1);
+        
+            }
+        
+        TBuf<100> info2;
+        _LIT(KNof, "No. of matches found before cancelled the operation = %d");
+        info2.Format(KNof, iter->NumOfItemsL());
+        iLog->Log(info2);
+
+        // FrBo: No longer sure that result is returned when cancelling
+        //AssertTrueSecL(iter->NumOfItemsL() != 0, KCancelErr);
+        }
+        
+    CleanupStack::PopAndDestroy(2, nearestCriteria);
+    
+    }
+
+// ---------------------------------------------------------
+// CPosTp35::SearchWithSortOrderL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp35::SearchWithSortOrderL()
+    {
+    // Only verifies that search does not fail when only landmarks with no name in the db
+
+    _LIT(KNumOfMatchesErr, "No. of matches is incorrect when the search is performed with a sortorder");
+   
+    // Test search with one criteria which return all landmarks in db
+    const TInt KIndex=0;
+
+    TCoordinate coord(iNearestSearchResults[KIndex]->iLatitude, iNearestSearchResults[KIndex]->iLongitude);
+        
+    CPosLmNearestCriteria* nearestCriteria = CPosLmNearestCriteria::NewLC(coord, iNearestSearchResults[KIndex]->iUseCoverageRadius);
+    TPosLmSortPref sortPref(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);
+   
+    iLandmarkSearch->SetMaxNumOfMatches(KPosLmMaxNumOfMatchesUnlimited);
+   
+    for (TInt i=0; i<4; i++)
+        {
+        if(i==0)
+            {
+            ExecuteAndDeleteLD(iLandmarkSearch->StartLandmarkSearchL(
+                        *nearestCriteria,
+                        sortPref,
+                        iNearestSearchResults[KIndex]->Redefined()));
+            }
+        else if (i==1)
+            {
+            sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EDescending);
+            ExecuteAndDeleteLD(iLandmarkSearch->StartLandmarkSearchL(
+                        *nearestCriteria, 
+                        sortPref,
+                        iNearestSearchResults[KIndex]->Redefined()));
+            }
+        //**** async
+        else if (i==2)
+            {
+            RunAsyncOperationLD(iLandmarkSearch->StartLandmarkSearchL(
+                        *nearestCriteria, 
+                        sortPref,
+                        iNearestSearchResults[KIndex]->Redefined()));
+            }
+        else if (i==3)
+            {
+            sortPref.SetSortByLandmarkAttribute(CPosLandmark::ELandmarkName, TPosLmSortPref::EAscending);
+            
+            RunAsyncOperationLD(iLandmarkSearch->StartLandmarkSearchL(
+                        *nearestCriteria,
+                        sortPref,
+                        iNearestSearchResults[KIndex]->Redefined()));
+            }
+        AssertTrueSecL((TUint)iNearestSearchResults[KIndex]->iDistances.Count()== iLandmarkSearch->NumOfMatches(), KNumOfMatchesErr);    
+        }
+
+    CleanupStack::PopAndDestroy(nearestCriteria);
+    }
+
+// ---------------------------------------------------------
+// CPosTp35::AppendAreaSearchResultsL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+void CPosTp35::AppendNearestSearchResultsL()
+    {    
+    iNearestSearchResults.ResetAndDestroy();
+    
+     _LIT(KFileTestValues, "c:\\system\\test\\testdata\\lmDbNearestSearchResult.txt");
+
+    RFile file;
+    CleanupClosePushL(file);
+    User::LeaveIfError(file.Open(iFileSession, KFileTestValues,  EFileRead));
+       
+    TInt row=0;
+    TBuf<KMaxNearestLineLength> line;    
+    while (ReadLn(file, line) != KErrEof)
+        {
+        TLex lex(line);
+        if (lex.Peek() != '#' && lex.Peek() != '\t')
+            {
+            ++row;
+            //CNearestSearchResult* searchResult = CNearestSearchResult::NewL(line, row);
+            CNearestSearchResultTp35* searchResult = CNearestSearchResultTp35::NewL(line, row, iFileSession);
+            CleanupStack::PushL(searchResult);
+       
+            User::LeaveIfError(iNearestSearchResults.Append(searchResult));
+            CleanupStack::Pop(searchResult);
+                   
+            }
+        }
+    CleanupStack::PopAndDestroy(&file);    
+    }
+
+// ---------------------------------------------------------
+// CNearestSearchResult::NewL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//CNearestSearchResult* CNearestSearchResult::NewL(const TDesC& aDes, const TInt& aIndex) 
+CNearestSearchResultTp35* CNearestSearchResultTp35::NewL(
+    const TDesC& aDes, 
+    const TInt& aIndex,
+    RFs& aFileSession) 
+    {
+    CNearestSearchResultTp35* self = new(ELeave) CNearestSearchResultTp35( aFileSession );
+    CleanupStack::PushL(self);
+    self->ConstructL(aDes, aIndex);
+    CleanupStack::Pop();
+    return self;
+    }
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+
+CNearestSearchResultTp35::CNearestSearchResultTp35(RFs& aFileSession)
+: iFileSession( aFileSession ) 
+    {
+    TRealX nan; 
+    nan.SetNaN();
+    iMaxDistance = nan;
+    }
+
+// ---------------------------------------------------------
+// CNearestSearchResult::CounstructL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+void CNearestSearchResultTp35::ConstructL(const TDesC& aDes, const TInt& aIndex) 
+    {
+    iDatabase = CPosLandmarkDatabase::OpenL();
+
+    TLex line(aDes);
+    line.Mark();
+    TInt redefined=0, useCoverageRadius;
+
+    if (line.Peek() != '#' && line.Peek() != '\t')
+        { 
+        TInt index=0;
+        while (line.Peek() != '\n' && !(line.Peek()).Eos())
+            {
+            line.Inc();
+            if (line.Peek() == '\t')
+                {
+                TPtrC token = line.MarkedToken();
+                TLex val(token);              
+                switch(index)
+                    {
+                    case ELatitude:
+                        val.Val(iLatitude, TChar(','));   
+                        break;
+                    case ELongitude:
+                        val.Val(iLongitude, TChar(','));   
+                        break;
+                    case EUseCoverageRadius:  
+                        val.Val(useCoverageRadius);
+                        if (useCoverageRadius == 1)
+                            {
+                            iUseCoverageRadius = ETrue;
+                            }
+                        break;
+                    case EMaxDistance:
+                        val.Val(iMaxDistance);   
+                        break;
+                    case EErrorCode:
+                        val.Val(iErrorCode);   
+                        break;
+                    case ESearchResult:
+                        ParseSearchResult(token);
+                        break;
+                    case ERedefined:
+                        val.Val(redefined);
+                        if (redefined == 1)
+                            {
+                            iRedefined = ETrue;
+                            }
+                        break;
+                    case EMaxSearchResult:
+                        val.Val(iMaxSearchResult);
+                        break;
+                    }    
+                line.Inc();
+                while (line.Peek() == '\t') // Empty value
+                    {
+                    line.Inc();
+                    ++index;
+                    }
+                line.Mark();
+                ++index;
+                }
+            }
+        AppendDistancesL(aIndex);
+        
+        }
+    }
+
+
+// Destructor       
+
+CNearestSearchResultTp35::~CNearestSearchResultTp35()
+    {   
+    iDistances.Close();
+    delete iDatabase;
+    iDatabase = NULL;
+    }
+
+// ---------------------------------------------------------
+// CNearestSearchResult::AppendDistancesL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+void CNearestSearchResultTp35::AppendDistancesL(const TInt& aIndex)
+    {    
+    iDistances.Reset();
+    
+     _LIT(KFileTestValues, "c:\\system\\test\\testdata\\lmDbNearestSearch.txt");
+
+    RFile file;
+    CleanupClosePushL(file);
+    User::LeaveIfError(file.Open(iFileSession, KFileTestValues,  EFileRead));
+        
+    TInt row=0;
+    TBuf<KMaxNearestLineLength> line;    
+    while (CLandmarkTestProcedureBase::ReadLn(file, line) != KErrEof)
+        {
+        ParseDistanceL(line, aIndex, row);
+        ++row;
+        }
+
+    SortDistances();
+
+    CleanupStack::PopAndDestroy(&file);    
+    }
+
+// ---------------------------------------------------------
+// CNearestSearchResult::ParseDistancesL()
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+void CNearestSearchResultTp35::ParseDistanceL(const TDesC& aDes, 
+                                          const TInt& aIndex,
+                                          const TPosLmItemId& aId)
+    {
+    
+    const TInt KStartIndex = 5;
+
+    TLex line(aDes);
+    line.Mark();
+    TInt index = 0;
+    TReal64 dist=0;
+        
+    if (line.Peek() != '#' && line.Peek() != '\t')
+        {
+        while (line.Peek() != '\n' && !(line.Peek()).Eos())
+            {
+            line.Inc();
+            if (line.Peek() == '\t' || line.Peek() == '\n' || (line.Peek()).Eos())
+                {
+                TPtrC token = line.MarkedToken();
+                
+                if (index == (KStartIndex + aIndex))
+                    {
+                    TLex val(token);
+                    val.Val(dist, TChar(','));  
+                        
+                    if (iUseCoverageRadius)
+                        {
+                        CPosLandmark* lm = iDatabase->ReadLandmarkLC(aId);
+                            
+                        TReal32 aCoverageRadius;  
+                        if (lm->GetCoverageRadius(aCoverageRadius) == KErrNone)
+                            {
+                            dist -= aCoverageRadius;
+                            if (dist < 0)
+                                {
+                                dist = 0;
+                                }
+                            }
+                        CleanupStack::PopAndDestroy(lm);
+                        }
+
+                    if (Math::IsNaN(iMaxDistance) || dist <= iMaxDistance)
+                        {
+                        if (dist != -1)
+                            {
+                            TSearchResultTp35 searchResult(aId, TReal32(dist));
+                            iDistances.Append(searchResult);
+                            }
+                        }
+
+                    break;
+                    }
+                line.Inc();
+                while (line.Peek() == '\t') // Empty value
+                    {
+                    line.Inc();
+                    ++index;
+                    }
+                line.Mark();
+                ++index;
+                }
+            }  
+        }     
+    }
+// ---------------------------------------------------------
+// CNearestSearchResult::Latitude 
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//        
+//TReal64 CNearestSearchResult::Latitude() const
+TReal64 CNearestSearchResultTp35::Latitude() const
+    {
+    return iLatitude;
+    }
+
+// ---------------------------------------------------------
+// CNearestSearchResult::Latitude 
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//   
+//TReal64 CNearestSearchResult::Longitude() const
+TReal64 CNearestSearchResultTp35::Longitude() const
+    {
+    return iLongitude;
+    }
+
+// ---------------------------------------------------------
+// CNearestSearchResult::UseCoverageRadius 
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//           
+//TBool CNearestSearchResult::UseCoverageRadius() const
+TBool CNearestSearchResultTp35::UseCoverageRadius() const
+    {
+    return iUseCoverageRadius;
+    }
+
+// ---------------------------------------------------------
+// CNearestSearchResult::MaxDistance
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//           
+
+TReal32 CNearestSearchResultTp35::MaxDistance() const
+    {   
+    return iMaxDistance;
+    }
+
+// ---------------------------------------------------------
+// CNearestSearchResult::ErrorCode 
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//   
+//TInt CNearestSearchResult::ErrorCode() const
+TInt CNearestSearchResultTp35::ErrorCode() const
+    {   
+    return iErrorCode;
+    }
+
+// ---------------------------------------------------------
+// InternalLandmarksSortL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//   
+TInt InternalSort(const TSearchResultTp35& aSource, const TSearchResultTp35& aTarget)
+    {
+    // zero, if the two objects are equal
+    // a negative value, if the first object is less than the second.
+    // a positive value, if the first object is greater than the second.
+
+    if ( aSource.Distance() == aTarget.Distance())
+        {
+        return 0;
+        }
+    else if (aSource.Distance() < aTarget.Distance())
+        {
+        return -1;
+        }
+    
+    return 1;
+    }
+
+// ---------------------------------------------------------
+// CNearestSearchResult::ErrorCode 
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//   
+void CNearestSearchResultTp35::SortDistances() 
+    {   
+    TLinearOrder<TSearchResultTp35> order(InternalSort);
+    iDistances.Sort(order);
+    }
+
+// ---------------------------------------------------------
+// CNearestSearchResult::Print
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//   
+void CNearestSearchResultTp35::Print(TDes& aPrint)
+    {    
+    _LIT(KPosInfo, "Latitude=%g, Longitude=%g");
+    TChar del(',');
+    
+    TBuf<KMaxFieldLength> info;
+    info.Format(KPosInfo, iLatitude, iLongitude);
+    aPrint.Append(info);
+    aPrint.Append(del);
+    
+    _LIT(KUseCoverageRadius, "UseCoverageRadius=%d");
+    info.Format(KUseCoverageRadius, iUseCoverageRadius);
+    aPrint.Append(info);
+    aPrint.Append(del);
+    
+    if (!Math::IsNaN(iMaxDistance))
+        {
+        _LIT(KMaxDistance, "MaxDistance=%g");
+        info.Format(KMaxDistance, iMaxDistance);
+        aPrint.Append(info);
+        aPrint.Append(del);
+        }
+
+    _LIT(KErrorCode, "ErrorCode = %d");
+    info.Format(KErrorCode, iErrorCode);
+    aPrint.Append(info);
+    aPrint.Append(del);
+
+    _LIT(KRedefined, "Redefined=%d");
+    info.Format(KRedefined, iRedefined);
+    aPrint.Append(info);
+    aPrint.Append(del);
+
+     _LIT(KMaxSearchResult, "MaxSearchResult=%d");
+    info.Format(KMaxSearchResult, iMaxSearchResult);
+    aPrint.Append(info);
+    aPrint.Append(del);
+
+    PrintDistances(aPrint);
+    }
+
+// ---------------------------------------------------------
+// CNearestSearchResult::PrintDistances
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//  
+void CNearestSearchResultTp35::PrintDistances(TDes& aPrint)
+    {   
+    TBuf<KDistanceFieldLength> info2;
+    TChar del(':');
+    aPrint.Append(_L("Distances: "));
+
+    for (TInt j=0; j<iDistances.Count(); j++)
+        {
+        _LIT(KDistance, "%g,%d");
+        info2.Format(KDistance, iDistances[j].Distance(), iDistances[j].Id());
+        aPrint.Append(info2);
+        aPrint.Append(del);
+        }
+    }
+
+// ---------------------------------------------------------
+// TSearchResult::TSearchResult
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//  
+TSearchResultTp35::TSearchResultTp35()
+    {
+    TRealX nan;
+    nan.SetNaN();
+    iDistance=nan;
+    iId=0;
+    } 
+
+TSearchResultTp35::TSearchResultTp35(const TPosLmItemId& aId, const TReal32& aDistance) : 
+    iDistance(aDistance),
+    iId(aId)
+    {   
+    }
+
+// ---------------------------------------------------------
+// TSearchResult::Distance
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//  
+TReal64 TSearchResultTp35::Distance() const
+    {
+    return iDistance;     
+    }
+
+// ---------------------------------------------------------
+// TSearchResult::Id
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//  
+TPosLmItemId TSearchResultTp35::Id() const
+    {
+    return iId;
+    }
+
+//  End of File