locationmanager/locationtrail/src/cpositioninfo.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 10:20:41 +0300
branchRCL_3
changeset 19 b73252188534
parent 7 3cebc1a84278
permissions -rw-r--r--
Revision: 201031 Kit: 201033

/*
* Copyright (c) 2006-2009 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:  A class for getting network cell id.
*
*/

#include <etel3rdparty.h>

#include "rlocationtrail.h"
#include "cpositioninfo.h"
#include "locationtraildefs.h"
#include "locationmanagerdebug.h"

// --------------------------------------------------------------------------
// CPositionInfo::NewL
// --------------------------------------------------------------------------
//
EXPORT_C CPositionInfo* CPositionInfo::NewL( MPositionInfoObserver* aTrail )
    {
    LOG( "CPositionInfo::NewL(), begin" );
    CPositionInfo* self = new (ELeave) CPositionInfo( aTrail );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    LOG( "CPositionInfo::NewL(), end" );
    return self;
    }
        
// --------------------------------------------------------------------------
// CPositionInfo::CPositionInfo
// --------------------------------------------------------------------------
//  
CPositionInfo::CPositionInfo( MPositionInfoObserver* aTrail ) 
    : CActive( CActive::EPriorityStandard ),
    iState( EPositionOptStateNone ),
    iConnectedPositionServer(EFalse)
    {
    LOG( "CPositionInfo::CPositionInfo()");
    CActiveScheduler::Add( this );
    iTrail = aTrail;
    iTrailCaptureSetting = RLocationTrail::ECaptureAll;
    
    // Set update interval.
    iUpdateOptions.SetUpdateInterval( TTimeIntervalMicroSeconds(KFirstInterval) );
    // Set time out level. 
    iUpdateOptions.SetUpdateTimeOut( TTimeIntervalMicroSeconds(KFirstTimeOut) );
    // Positions which have time stamp below KMaxAge can be reused
    iUpdateOptions.SetMaxUpdateAge( TTimeIntervalMicroSeconds(KMaxAge) );
    // Disables location framework to send partial position data
    iUpdateOptions.SetAcceptPartialUpdates( EFalse );    
    }

// --------------------------------------------------------------------------
// CPositionInfo::ConstructL
// --------------------------------------------------------------------------
//    
void CPositionInfo::ConstructL()
    {
    
    }
    
// --------------------------------------------------------------------------
// CPositionInfo::~CPositionInfo
// --------------------------------------------------------------------------
//    
EXPORT_C CPositionInfo::~CPositionInfo()
    {
    Stop();
    }

// --------------------------------------------------------------------------
// CPositionInfo::RunError
// --------------------------------------------------------------------------
//
TInt CPositionInfo::RunError( TInt /*aError*/ )
    {
    return KErrNone;
    }

// --------------------------------------------------------------------------
// CPositionInfo::GetCellId
// --------------------------------------------------------------------------
//
void CPositionInfo::StartL( RLocationTrail::TTrailCaptureSetting aCaptureSetting, TInt aUpdateInterval )
    {
    LOG( "CPositionInfo::StartL(), begin" );
    if(IsActive()) 
        {
        Cancel();
        }
    iTrailCaptureSetting = aCaptureSetting;
    iUpdateInterval = aUpdateInterval;
    iState = EPositionOptStateNone;
    
    iPositionInfo = TPositionSatelliteInfo();
    
    if ( aCaptureSetting == RLocationTrail::ECaptureAll ) 
    	{
    	if(!iConnectedPositionServer)
            {   
             // Positions which have time stamp below KMaxAge can be reused
             iUpdateOptions.SetMaxUpdateAge( TTimeIntervalMicroSeconds(KMaxAge) );
             // Disables location framework to send partial position data
             iUpdateOptions.SetAcceptPartialUpdates( EFalse );
    	    User::LeaveIfError( iPosServer.Connect() );
            CleanupClosePushL(iPosServer);
    	    User::LeaveIfError( iPositioner.Open( iPosServer ) );
            CleanupClosePushL(iPositioner);
    	    User::LeaveIfError( iPositioner.SetRequestor( CRequestor::ERequestorService,
    	                        CRequestor::EFormatApplication, KRequestor ) );
            iUpdateOptions.SetUpdateInterval( TTimeIntervalMicroSeconds (iUpdateInterval) );  
            iUpdateOptions.SetUpdateTimeOut( TTimeIntervalMicroSeconds(KUpdateTimeOut ) );
            User::LeaveIfError( iPositioner.SetUpdateOptions( iUpdateOptions ) );
            CleanupStack::Pop(2); // iPositioner, iPosServer
            iConnectedPositionServer = ETrue;
           }
        iState = EPositionOptStateGetLastKnownPosition;
        iPositioner.GetLastKnownPosition( iPositionInfo, iStatus );
        SetActive();
    	}
    else if ( aCaptureSetting == RLocationTrail::ECaptureNetworkInfo ) 
    	{
    	TRequestStatus* status = &iStatus;
        User::RequestComplete( status, KErrNone );
    	}

    LOG( "CPositionInfo::StartL(), end" );
    }

// --------------------------------------------------------------------------
// CPositionInfo::NextPosition
// --------------------------------------------------------------------------
//
void CPositionInfo::NextPosition()
    {
    LOG( "CPositionInfo::NextPosition(), begin" );
    if(!IsActive() && iConnectedPositionServer)
        {
        LOG("Not active");
        iPositionInfo = TPositionSatelliteInfo(); // Clear position info.
        if ( iTrailCaptureSetting == RLocationTrail::ECaptureAll )
        	{
            iState = EPositionOptStateNotifyUpdate;
        	iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus );
            SetActive();
        	}
        else if ( iTrailCaptureSetting == RLocationTrail::ECaptureNetworkInfo ) 
        	{
            SetActive();
        	TRequestStatus* status = &iStatus;
            User::RequestComplete( status, KErrNone );
        	}
        }
    LOG( "CPositionInfo::NextPosition(), end" );
    }
    
// --------------------------------------------------------------------------
// CPositionInfo::Stop
// --------------------------------------------------------------------------
//
void CPositionInfo::Stop()
    {
    LOG( "CPositionInfo::Stop(), begin" );
    Cancel();    
    if(iConnectedPositionServer)
        {
        iPositioner.Close();
        iPosServer.Close();
        iConnectedPositionServer = EFalse;
        }
    // reset the state
    iState = EPositionOptStateNone;
    LOG( "CPositionInfo::Stop(), end" );
    }    
        
// --------------------------------------------------------------------------
// CPositionInfo::RunL
// --------------------------------------------------------------------------
//
void CPositionInfo::RunL()
    { 
    LOG( "CPositionInfo::RunL(), begin" );
    if(iState == EPositionOptStateGetLastKnownPosition)
        {
        // get last location.. check the time and if it's within the limit, pass to trail.
        const TTimeIntervalSeconds KMaxAllowedLastKnownPosition(60*5); // 5 mins
        TTimeIntervalSeconds interval;
        TTime now;
        TPosition lastPosition;
        iPositionInfo.GetPosition(lastPosition);
        now.UniversalTime();
        now.SecondsFrom(lastPosition.Time(), interval);
        if(iStatus.Int() == KErrNone && interval < KMaxAllowedLastKnownPosition)
            {
            LOG("Last know position is recent one");
            iTrail->Position( iPositionInfo, iStatus.Int() );
            }
        else
            {
            LOG("Old last know position. Drop it..");
            }
        }
    else
        {
        // notify response.. always pass to trail
        iTrail->Position( iPositionInfo, iStatus.Int() );
        }
     
    if ( iTrailCaptureSetting == RLocationTrail::ECaptureAll &&
        iState != EPositionOptStateNone) 
    	{
    	NextPosition();
    	}
    LOG( "CPositionInfo::RunL(), end" );
    }    

// --------------------------------------------------------------------------
// CPositionInfo::DoCancel
// --------------------------------------------------------------------------
// 
void CPositionInfo::DoCancel()
    {
    LOG( "CPositionInfo::DoCancel(), begin" );
    switch(iState)
        {
        case EPositionOptStateGetLastKnownPosition:
            {
            iPositioner.CancelRequest( EPositionerGetLastKnownPosition );
            break;
            }
        case EPositionOptStateNotifyUpdate:
            {
            iPositioner.CancelRequest( EPositionerNotifyPositionUpdate );
            break;
            }
        default:
            break;
        }
	iState = EPositionOptStateNone;
    LOG( "CPositionInfo::DoCancel(), end" );
    }


// --------------------------------------------------------------------------
// CPositionInfo::HandleRemapComplete
// --------------------------------------------------------------------------
// 
void CPositionInfo::HandleRemapComplete()
    {
    LOG( "CPositionInfo::HandleRemapComplete()" );
    // Don't call notify update from RunL
    iState = EPositionOptStateNone;
    }

// End of file