diff -r f5050f1da672 -r 04becd199f91 javaextensions/location/landmarks/src/clapilandmarksearchfactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaextensions/location/landmarks/src/clapilandmarksearchfactory.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,192 @@ +/* +* Copyright (c) 2008 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: Landmark search factory + * +*/ + + +// INTERNAL INCLUDES +#include "clapilandmarksearchfactory.h" +#include "tlapisearchcriteria.h" +#include "logger.h" +// EXTERNAL INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include + +// --------------------------------------------------------------------------- +// CLAPILandmarkSearchFactory::NewL +// --------------------------------------------------------------------------- +// +CLAPILandmarkSearchFactory* CLAPILandmarkSearchFactory::NewL( + CPosLandmarkDatabase& aDatabase) +{ + JELOG2(EJavaLocation); + CLAPILandmarkSearchFactory* self = CLAPILandmarkSearchFactory::NewLC( + aDatabase); + CleanupStack::Pop(self); + return self; +} + +// --------------------------------------------------------------------------- +// CLAPILandmarkSearchFactory::NewLC +// --------------------------------------------------------------------------- +// +CLAPILandmarkSearchFactory* CLAPILandmarkSearchFactory::NewLC( + CPosLandmarkDatabase& aDatabase) +{ + JELOG2(EJavaLocation); + CLAPILandmarkSearchFactory* self = + new(ELeave) CLAPILandmarkSearchFactory(aDatabase); + CleanupStack::PushL(self); + self->ConstructL(); + return self; +} + +// --------------------------------------------------------------------------- +// CLAPILandmarkSearchFactory::~CLAPILandmarkSearchFactory +// --------------------------------------------------------------------------- +// +CLAPILandmarkSearchFactory::~CLAPILandmarkSearchFactory() +{ + JELOG2(EJavaLocation); + delete iLmSearch; +} + +// --------------------------------------------------------------------------- +// CLAPILandmarkSearchFactory::CreateIteratorL +// --------------------------------------------------------------------------- +// +CPosLmItemIterator* CLAPILandmarkSearchFactory::CreateIteratorL( + const TLAPISearchCriteria* aCriteria) +{ + JELOG2(EJavaLocation); + CPosLmItemIterator* iterator(NULL); + // Sorting is left for the MIDlet. There is no requirement for this + // as it slows the performance of listing landmarks. Usually there + // is no need to sort the landmarks because those are plotted to a map + + // Match all landmark without using the Landmark Search API if the passed + // search criteria is null or does not have any parameters set + if (!aCriteria || !aCriteria->Text() && !aCriteria->CategoryName() + && !aCriteria->HasValidCoordinates()) + { + iterator = iDatabase.LandmarkIteratorL(); + } + else + { + // Create a composite criteria and add other criterias to it + CPosLmCompositeCriteria* criterias = CPosLmCompositeCriteria::NewLC( + CPosLmCompositeCriteria::ECompositionAND); + + // Currently, category criteria is the first which will be matched + // if the argument has been specified by the client + const TDesC* categoryName = aCriteria->CategoryName(); + if (categoryName) + { + CPosLmCategoryCriteria* criteria = CPosLmCategoryCriteria::NewLC(); + // Empty string must find uncategorized landmarks + if (categoryName->Length() > 0) + { + criteria->SetCategoryNameL(*categoryName); + } + // The ownership of the criteria is transferred to criterias + // and the value is popped from the cleanup stack + AddCriteriaAndPopL(*criterias, criteria); + } + + const TDesC* text = aCriteria->Text(); + // Next search argument will be the text criteria. The search + // criteria must specify at least one attribute which is searched + if (text) + { + CPosLmTextCriteria* criteria = CPosLmTextCriteria::NewLC(); + criteria->SetTextL(*text); + // Currently only name attribute is supported for searching + criteria->SetAttributesToSearch(aCriteria->TextAttributes()); + // The ownership of the criteria is transferred to criterias + // and the value is popped from the cleanup stack + AddCriteriaAndPopL(*criterias, criteria); + } + + // Finally use the match area if specified + if (aCriteria->HasValidCoordinates()) + { + TReal64 southLat; + TReal64 northLat; + TReal64 westLon; + TReal64 eastLon; + + aCriteria->GetArea(southLat, northLat, westLon, eastLon); + // Match all landmarks within the specified area + CPosLmAreaCriteria* criteria = CPosLmAreaCriteria::NewLC(southLat, + northLat, westLon, eastLon); + // The ownership of the criteria is transferred to criterias + // and the value is popped from the cleanup stack + AddCriteriaAndPopL(*criterias, criteria); + } + // Start the search and do not use previous results + CPosLmOperation* op = iLmSearch->StartLandmarkSearchL(*criterias); + // The ownership is transferred to the following function call which + // puts the operation to the clean-up stack so no need to push here + ExecuteAndDeleteLD(op); + CleanupStack::PopAndDestroy(criterias); + // Get the match iterator from the landmark search manager + iterator = iLmSearch->MatchIteratorL(); + } + + // The ownership is transferred to the caller + return iterator; +} + +// --------------------------------------------------------------------------- +// CLAPILandmarkSearchFactory::AddCriteriaAndPopL +// --------------------------------------------------------------------------- +// +void CLAPILandmarkSearchFactory::AddCriteriaAndPopL( + CPosLmCompositeCriteria& aCompositeCriteria, + CPosLmSearchCriteria* aCriteria) const +{ + JELOG2(EJavaLocation); + User::LeaveIfError(aCompositeCriteria.AddArgument(aCriteria)); + CleanupStack::Pop(aCriteria); +} + +// --------------------------------------------------------------------------- +// CLAPILandmarkSearchFactory::CLAPILandmarkSearchFactory +// --------------------------------------------------------------------------- +// +CLAPILandmarkSearchFactory::CLAPILandmarkSearchFactory( + CPosLandmarkDatabase& aDatabase) : + iDatabase(aDatabase) +{ + JELOG2(EJavaLocation); +} + +// --------------------------------------------------------------------------- +// CLAPILandmarkSearchFactory::ConstructL +// --------------------------------------------------------------------------- +// +void CLAPILandmarkSearchFactory::ConstructL() +{ + JELOG2(EJavaLocation); + iLmSearch = CPosLandmarkSearch::NewL(iDatabase); +} + +// End of file