locationmapnavfw/library/src/mnnavigator.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 10:20:18 +0300
branchRCL_3
changeset 19 02ba3f1733c6
parent 0 667063e416a2
permissions -rw-r--r--
Revision: 201030 Kit: 201033

/*
* Copyright (c) 2005-2006 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:  CMnNavigator class implementation
*
*/


#include <e32base.h>
#include <e32math.h>
#include <AknServerApp.h>
#include <apaserverapp.h>

#include <lbsfields.h>
#include <lbsfieldids.h>
#include <EPos_CPosLandmark.h>

#include "mnprovider.h"
#include "mnnavigationserviceclient.h"
#include "mnnavigator.h"

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

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
CMnNavigator::CMnNavigator()
    {
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
EXPORT_C CMnNavigator* CMnNavigator::NewL( CMnProvider& aProvider )
    {
    CMnNavigator* self = new (ELeave) CMnNavigator;
    CleanupStack::PushL( self );
    self->ConstructNewL( aProvider );
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
EXPORT_C CMnNavigator* CMnNavigator::NewChainedL( CMnProvider& aProvider )
    {
    CMnNavigator* self = new (ELeave) CMnNavigator;
    CleanupStack::PushL( self );
    self->ConstructChainedL( aProvider );
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void CMnNavigator::ConstructCommonL( CMnProvider& aProvider )
    {
    if ( !( aProvider.SupportedServices() & CMnProvider::EServiceNavigation ) )
        {
        User::Leave( KErrNotSupported );
        }

    iSession = new (ELeave) RMnNavigationServiceClient;
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void CMnNavigator::ConstructNewL( CMnProvider& aProvider )
    {
    ConstructCommonL( aProvider );
    iSession->ConnectL( aProvider.Uid() );
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void CMnNavigator::ConstructChainedL( CMnProvider& aProvider )
    {
    ConstructCommonL( aProvider );
    iSession->ConnectChainedL( aProvider.Uid() );
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
EXPORT_C CMnNavigator::~CMnNavigator()
    {
    delete iExitMonitor;
    if ( iSession )
        {
        iSession->Close();
        delete iSession;
        }
    }

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
EXPORT_C void CMnNavigator::NavigateToL(const CPosLandmark& aDestination)
    {
    // verify that destination landmark has coordinates
    TLocality loc;
    TBool valid = (KErrNone == aDestination.GetPosition( loc ) );
    valid &= !Math::IsNaN( loc.Latitude() ) && !Math::IsNaN( loc.Longitude() );
    
    if ( !valid )
        {
        // verify that destination landmark has address info
        TPositionFieldId fieldId = aDestination.FirstPositionFieldId();
        while ( fieldId != EPositionFieldNone )
            {
            if ( fieldId > EPositionFieldAddressCapabilitiesBegin &&
                 fieldId < EPositionFieldNMEACapabilitiesBegin)
                {
                TPtrC field;
                aDestination.GetPositionField( fieldId, field );
                if ( field.Length() )
                    {
                    valid = ETrue;
                    break;
                    }
                }
            fieldId = aDestination.NextPositionFieldId( fieldId );            
            }
        }
        
    if ( valid )
        {
        iSession->NavigateToL( aDestination );
        }
    else
        {
        User::Leave( KErrArgument );
        }
    }
        
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
EXPORT_C void CMnNavigator::SetExitObserverL( MAknServerAppExitObserver& aObserver )
	{
	if ( iExitMonitor )
		{
		User::Leave( KErrAlreadyExists );
		}
	else
		{
		iExitMonitor = CApaServerAppExitMonitor::NewL( 
			*iSession, aObserver, CActive::EPriorityStandard );
		}
	}

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
EXPORT_C void CMnNavigator::RemoveExitObserver()
	{
	delete iExitMonitor;
	iExitMonitor = NULL;
	}