mapnavproviderrefapp/src/mnrppositionrequest.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:31:27 +0100
branchRCL_3
changeset 18 870918037e16
parent 0 522cd55cc3d7
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

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


#include <AknWaitDialog.h>
#include <coemain.h>
#include <aknnotewrappers.h>

#include <lbspositioninfo.h>

#include "mnrppositionrequest.h"

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

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
CMnrpPositionRequest::CMnrpPositionRequest(
    MMnrpPositionObserver& aObserver )
    : 
    CActive( CActive::EPriorityStandard ), 
    iObserver( aObserver ),
    iState( EIdle )
    {
    TRealX nan;
    nan.SetNaN();
    iSpeed = iHeading = iCourse = iMagneticHeading = iMagneticCourse = nan;
    
    CActiveScheduler::Add( this );
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void CMnrpPositionRequest::ConstructL( const TDesC& aRequestorName )
    {
    const TInt KBufSize = 8192;
    iGenericPosition = HPositionGenericInfo::NewL( KBufSize );
    
    // Connect to the location server
    User::LeaveIfError( iLocationServer.Connect() );

    // Open the default positioner
    User::LeaveIfError( iPositioner.Open( iLocationServer ) );

    // Set this application as location requestor
    User::LeaveIfError( iPositioner.SetRequestor(
        CRequestor::ERequestorService,
        CRequestor::EFormatApplication,
        aRequestorName ) );

    // Set default options
    TPositionUpdateOptions updateOptions;

    const TInt K30Seconds = 30000000;
    TTimeIntervalMicroSeconds timeOut( K30Seconds );

    updateOptions.SetUpdateTimeOut( timeOut );
    SetOptionsL( updateOptions );
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
EXPORT_C CMnrpPositionRequest* CMnrpPositionRequest::NewL(
    const TDesC& aAppName, 
    MMnrpPositionObserver& aObserver )
    {
    CMnrpPositionRequest* self =
        new (ELeave) CMnrpPositionRequest( aObserver );
    CleanupStack::PushL( self );
    self->ConstructL( aAppName );
    CleanupStack::Pop( self );
    return self;
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
EXPORT_C CMnrpPositionRequest::~CMnrpPositionRequest()
    {
    Cancel();
    iPositioner.Close();
    iLocationServer.Close();
    delete iGenericPosition;
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
EXPORT_C void CMnrpPositionRequest::FetchNewPosition( TBool aLastKnownLocationAllowed )
    {
    Cancel();
    // Request location
    iState = EAcquiringDefaultLocation;
    iLastKnownLocationAllowed = aLastKnownLocationAllowed;
    ExecuteNextStep();
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
EXPORT_C void CMnrpPositionRequest::GetPosition( TPositionInfo& aPositionInfo )
    {
    aPositionInfo = iPositionInfo;
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
EXPORT_C TReal32 CMnrpPositionRequest::Speed() 
    { 
    return iSpeed;
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
EXPORT_C TReal32 CMnrpPositionRequest::Heading() 
    { 
    return iHeading; 
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
EXPORT_C TReal32 CMnrpPositionRequest::MagneticHeading() 
    { 
    return iMagneticHeading; 
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
EXPORT_C TReal32 CMnrpPositionRequest::Course() 
    {
    return iCourse;
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
EXPORT_C TReal32 CMnrpPositionRequest::MagneticCourse()
    { 
    return iMagneticCourse;
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void CMnrpPositionRequest::DoCancel()
    {
    // Cancel location request
    if (iState == EAcquiringDefaultLocation)
        {
        iPositioner.CancelRequest( EPositionerNotifyPositionUpdate );
        }
    else if (iState == EAcquiringLastKnownLocation)
        {
        iPositioner.CancelRequest( EPositionerGetLastKnownPosition );
        }
    iState = EIdle;
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void CMnrpPositionRequest::RunL()
    {
    if ( iStatus != KErrNone &&
         iState == EAcquiringDefaultLocation && 
         iLastKnownLocationAllowed )
        {
        // Fetching current location failed. Try last known location.
        iState = EAcquiringLastKnownLocation;
        ExecuteNextStep();
        }
    else
        {
        // Operation finished, notify observer
        iState = EIdle;
        SaveContainer( *iGenericPosition );
        iObserver.HandlePositionRequestCompletedL( iStatus.Int() );
        }
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
TInt CMnrpPositionRequest::RunError(TInt /*aError*/)
    {
    // Ignore possible errors.
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void CMnrpPositionRequest::ExecuteNextStep()
    {
    iStatus = KRequestPending;

    switch (iState)
        {
        case EAcquiringDefaultLocation:
            InitContainer( *iGenericPosition );
            iPositioner.NotifyPositionUpdate( *iGenericPosition, iStatus);
            break;
        case EAcquiringLastKnownLocation:
            iPositioner.GetLastKnownPosition( iPositionInfo, iStatus );
            break;
        default:    
            // this case should never happen, see RunL
            return;
        }

    SetActive();
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
EXPORT_C void CMnrpPositionRequest::SetOptionsL( const TPositionUpdateOptionsBase& aOptions )
    {
    User::LeaveIfError( iPositioner.SetUpdateOptions( aOptions ) );
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void CMnrpPositionRequest::InitContainer( HPositionGenericInfo& aGenericInfo )
    {
    aGenericInfo.ClearPositionData();
    
    aGenericInfo.SetRequestedField( EPositionFieldHorizontalSpeed );
    aGenericInfo.SetRequestedField( EPositionFieldTrueCourse );
    aGenericInfo.SetRequestedField( EPositionFieldMagneticCourse );
    aGenericInfo.SetRequestedField( EPositionFieldHeading );
    aGenericInfo.SetRequestedField( EPositionFieldMagneticHeading );
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void CMnrpPositionRequest::SaveContainer( const HPositionGenericInfo& aGenericInfo )
    {
    TRealX nan;
    nan.SetNaN();
    iSpeed = iHeading = iCourse = iMagneticHeading = iMagneticCourse = nan;
    
    aGenericInfo.GetValue( EPositionFieldHorizontalSpeed, iSpeed );
    aGenericInfo.GetValue( EPositionFieldTrueCourse, iCourse );
    aGenericInfo.GetValue( EPositionFieldMagneticCourse, iMagneticCourse );
    aGenericInfo.GetValue( EPositionFieldHeading, iHeading );
    aGenericInfo.GetValue( EPositionFieldMagneticHeading, iMagneticHeading );
    
    iPositionInfo = *iGenericPosition;
    }