landmarks/locationlandmarks/multidbsearch/src/EPos_PosLmCriteriaHelper.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:06:48 +0200
changeset 0 667063e416a2
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* 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: Helper class that validates a search criteria and creates a copy.
*
*
*/


// INCLUDE FILES
#include    <EPos_CPosLmSearchCriteria.h>
#include    <EPos_CPosLmAreaCriteria.h>
#include    <EPos_CPosLmTextCriteria.h>
#include    <EPos_CPosLmCompositeCriteria.h>
#include    <EPos_CPosLmCategoryCriteria.h>
#include    <EPos_CPosLmNearestCriteria.h>
#include    <EPos_CPosLmCatNameCriteria.h>
#include    "EPos_PosLmCriteriaHelper.h"

// CONSTANTS

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// PosLmCriteriaHelper::ValidateAndCopyL
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CPosLmSearchCriteria* PosLmCriteriaHelper::ValidateAndCopyL(
    const CPosLmSearchCriteria& aCriteria,
    TBool aIsLm,
    TBool& aUseDistanceSorting,
    TBool aIsTopCriteria)
    {
    CPosLmSearchCriteria* criteria = NULL;
    aUseDistanceSorting = EFalse;

    switch (aCriteria.CriteriaType())
        {
        case CPosLmSearchCriteria::ECriteriaArea:
            __ASSERT_ALWAYS(aIsLm, User::Leave(KErrArgument));

            criteria = ValidateAndCopyLC(
                static_cast<const CPosLmAreaCriteria&>(aCriteria));
            break;

        case CPosLmSearchCriteria::ECriteriaText:
            __ASSERT_ALWAYS(aIsLm, User::Leave(KErrArgument));

            criteria = ValidateAndCopyLC(
                static_cast<const CPosLmTextCriteria&>(aCriteria));
            break;

        case CPosLmSearchCriteria::ECriteriaComposite:
            __ASSERT_ALWAYS(aIsLm, User::Leave(KErrNotSupported));
            __ASSERT_ALWAYS(aIsTopCriteria, User::Leave(KErrArgument));

            criteria = ValidateAndCopyLC(
                static_cast<const CPosLmCompositeCriteria&>(aCriteria),
                aIsLm, aUseDistanceSorting);
            break;

        case CPosLmSearchCriteria::ECriteriaCategory:
            __ASSERT_ALWAYS(aIsLm, User::Leave(KErrArgument));

            criteria = ValidateAndCopyLC(
                static_cast<const CPosLmCategoryCriteria&>(aCriteria));
            break;

        case CPosLmSearchCriteria::ECriteriaFindNearest:
            __ASSERT_ALWAYS(aIsLm, User::Leave(KErrArgument));

            criteria = ValidateAndCopyLC(
                static_cast<const CPosLmNearestCriteria&>(aCriteria));
            aUseDistanceSorting = ETrue;
            break;

        case CPosLmSearchCriteria::ECriteriaCategoryByName:
            __ASSERT_ALWAYS(!aIsLm, User::Leave(KErrArgument));

            criteria = ValidateAndCopyLC(
                static_cast<const CPosLmCatNameCriteria&>(aCriteria));
            break;

        case CPosLmSearchCriteria::ECriteriaIdList:
            User::Leave(KErrArgument);

        default:
            User::Leave(KErrNotSupported);
        }

    CleanupStack::Pop(criteria);
    return criteria;
    }

// -----------------------------------------------------------------------------
// PosLmCriteriaHelper::ValidateAndCopyLC
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CPosLmSearchCriteria* PosLmCriteriaHelper::ValidateAndCopyLC(
    const CPosLmCompositeCriteria& aCriteria,
    TBool aIsLm,
    TBool& aUseDistanceSorting)
    {
    __ASSERT_ALWAYS(aCriteria.NumOfArguments() > 0, User::Leave(KErrArgument));

    CPosLmCompositeCriteria* criteria =
        CPosLmCompositeCriteria::NewLC(aCriteria.CompositionType());

    TBool componentUseDistanceSorting;
    TInt noOfcomponentUseDistanceSorting(0);

    for (TUint i = 0; i < aCriteria.NumOfArguments(); i++)
        {
        CPosLmSearchCriteria* component =
            ValidateAndCopyL(aCriteria.Argument(i), aIsLm,
                             componentUseDistanceSorting, EFalse);

        CleanupStack::PushL(component);
        User::LeaveIfError(criteria->AddArgument(component));
        CleanupStack::Pop(component);

        if (componentUseDistanceSorting)
            {
            noOfcomponentUseDistanceSorting++;
            }

        }

    // Composite with none or more than one distance sorting criteria means
    // no distance sorting.
    aUseDistanceSorting = (noOfcomponentUseDistanceSorting == 1);

    return criteria;
    }

// -----------------------------------------------------------------------------
// PosLmCriteriaHelper::ValidateAndCopyLC
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CPosLmSearchCriteria* PosLmCriteriaHelper::ValidateAndCopyLC(
    const CPosLmAreaCriteria& aCriteria)
    {
    TReal64 southLatitude;
    TReal64 northLatitude;
    TReal64 westLongitude;
    TReal64 eastLongitude;
    aCriteria.GetSearchArea(southLatitude, northLatitude,
        westLongitude, eastLongitude);

    CPosLmAreaCriteria* criteria = CPosLmAreaCriteria::NewLC(
        southLatitude, northLatitude,
        westLongitude, eastLongitude);

    return criteria;
    }

// -----------------------------------------------------------------------------
// PosLmCriteriaHelper::ValidateAndCopyLC
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CPosLmSearchCriteria* PosLmCriteriaHelper::ValidateAndCopyLC(
    const CPosLmTextCriteria& aCriteria)
    {
    __ASSERT_ALWAYS(aCriteria.Text().Length() > 0, User::Leave(KErrArgument));

    CPosLmTextCriteria* criteria = CPosLmTextCriteria::NewLC();

    criteria->SetTextL(aCriteria.Text());
    criteria->SetAttributesToSearch(aCriteria.AttributesToSearch());

    RArray<TUint> positionFields;
    CleanupClosePushL(positionFields);
    aCriteria.GetPositionFieldsToSearchL(positionFields);
    criteria->SetPositionFieldsToSearchL(positionFields);
    CleanupStack::PopAndDestroy(&positionFields);

    return criteria;
    }

// -----------------------------------------------------------------------------
// PosLmCriteriaHelper::ValidateAndCopyLC
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CPosLmSearchCriteria* PosLmCriteriaHelper::ValidateAndCopyLC(
    const CPosLmCategoryCriteria& aCriteria)
    {
    __ASSERT_ALWAYS(aCriteria.CategoryItemId() == KPosLmNullItemId,
        User::Leave(KErrArgument));

    CPosLmCategoryCriteria* criteria = CPosLmCategoryCriteria::NewLC();
    if (aCriteria.CategoryName().Length() > 0)
        {
        criteria->SetCategoryNameL(aCriteria.CategoryName());
        }
    else if (aCriteria.GlobalCategory() != KPosLmNullGlobalCategory)
        {
        criteria->SetGlobalCategory(aCriteria.GlobalCategory());
        }

    return criteria;
    }

// -----------------------------------------------------------------------------
// PosLmCriteriaHelper::ValidateAndCopyLC
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CPosLmSearchCriteria* PosLmCriteriaHelper::ValidateAndCopyLC(
    const CPosLmNearestCriteria& aCriteria)
    {
    TCoordinate coordinate;
    aCriteria.GetCoordinate(coordinate);

    CPosLmNearestCriteria* criteria = CPosLmNearestCriteria::NewLC(
        coordinate,
        aCriteria.UseCoverageRadius());
    criteria->SetMaxDistance(aCriteria.MaxDistance());

    return criteria;
    }

// -----------------------------------------------------------------------------
// PosLmCriteriaHelper::ValidateAndCopyLC
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
CPosLmSearchCriteria* PosLmCriteriaHelper::ValidateAndCopyLC(
    const CPosLmCatNameCriteria& aCriteria)
    {
    __ASSERT_ALWAYS(aCriteria.SearchPattern().Length() > 0,
        User::Leave(KErrArgument));

    CPosLmCatNameCriteria* criteria = CPosLmCatNameCriteria::NewLC();
    criteria->SetSearchPatternL(aCriteria.SearchPattern());

    return criteria;
    }

//  End of File