diff -r 63c982fb92f2 -r b73252188534 locationmanager/locationtrail/src/cpositioninfo.cpp --- a/locationmanager/locationtrail/src/cpositioninfo.cpp Thu Jul 15 19:07:24 2010 +0300 +++ b/locationmanager/locationtrail/src/cpositioninfo.cpp Thu Aug 19 10:20:41 2010 +0300 @@ -43,7 +43,8 @@ // CPositionInfo::CPositionInfo( MPositionInfoObserver* aTrail ) : CActive( CActive::EPriorityStandard ), - iFirstInterval( ETrue ) + iState( EPositionOptStateNone ), + iConnectedPositionServer(EFalse) { LOG( "CPositionInfo::CPositionInfo()"); CActiveScheduler::Add( this ); @@ -75,9 +76,7 @@ // EXPORT_C CPositionInfo::~CPositionInfo() { - Cancel(); - iPositioner.Close(); - iPosServer.Close(); + Stop(); } // -------------------------------------------------------------------------- @@ -96,34 +95,41 @@ void CPositionInfo::StartL( RLocationTrail::TTrailCaptureSetting aCaptureSetting, TInt aUpdateInterval ) { LOG( "CPositionInfo::StartL(), begin" ); - + if(IsActive()) + { + Cancel(); + } iTrailCaptureSetting = aCaptureSetting; iUpdateInterval = aUpdateInterval; - iFirstInterval = ETrue; - iPositionInfo = TPositionSatelliteInfo(); + iState = EPositionOptStateNone; - // 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 ); + iPositionInfo = TPositionSatelliteInfo(); if ( aCaptureSetting == RLocationTrail::ECaptureAll ) { - User::LeaveIfError( iPosServer.Connect() ); - User::LeaveIfError( iPositioner.Open( iPosServer ) ); - User::LeaveIfError( iPositioner.SetRequestor( CRequestor::ERequestorService, - CRequestor::EFormatApplication, KRequestor ) ); - User::LeaveIfError( iPositioner.SetUpdateOptions( iUpdateOptions ) ); - iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus ); + 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(); } - - SetActive(); - - if ( aCaptureSetting == RLocationTrail::ECaptureNetworkInfo ) + else if ( aCaptureSetting == RLocationTrail::ECaptureNetworkInfo ) { TRequestStatus* status = &iStatus; User::RequestComplete( status, KErrNone ); @@ -138,19 +144,25 @@ // void CPositionInfo::NextPosition() { - iPositionInfo = TPositionSatelliteInfo(); // Clear position info. - if ( iTrailCaptureSetting == RLocationTrail::ECaptureAll ) - { - iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus ); - } - - SetActive(); - - if ( iTrailCaptureSetting == RLocationTrail::ECaptureNetworkInfo ) - { - TRequestStatus* status = &iStatus; - User::RequestComplete( status, KErrNone ); - } + 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" ); } // -------------------------------------------------------------------------- @@ -159,10 +171,17 @@ // void CPositionInfo::Stop() { + LOG( "CPositionInfo::Stop(), begin" ); Cancel(); - - iPositioner.Close(); - iPosServer.Close(); + if(iConnectedPositionServer) + { + iPositioner.Close(); + iPosServer.Close(); + iConnectedPositionServer = EFalse; + } + // reset the state + iState = EPositionOptStateNone; + LOG( "CPositionInfo::Stop(), end" ); } // -------------------------------------------------------------------------- @@ -171,22 +190,39 @@ // void CPositionInfo::RunL() { - iTrail->Position( iPositionInfo, iStatus.Int() ); - - if ( iFirstInterval && IsActive() ) + 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) { - Cancel(); - LOG("CPositionInfo::RunL() - First Time"); - iUpdateOptions.SetUpdateInterval( TTimeIntervalMicroSeconds (iUpdateInterval) ); - iUpdateOptions.SetUpdateTimeOut( TTimeIntervalMicroSeconds(KUpdateTimeOut ) ); - if ( iTrailCaptureSetting == RLocationTrail::ECaptureAll ) - { - User::LeaveIfError( iPositioner.SetUpdateOptions( iUpdateOptions ) ); - iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus ); - } - SetActive(); - iFirstInterval = EFalse; + NextPosition(); } + LOG( "CPositionInfo::RunL(), end" ); } // -------------------------------------------------------------------------- @@ -195,11 +231,37 @@ // void CPositionInfo::DoCancel() { - LOG( "CPositionInfo::DoCancel()" ); - if ( IsActive() ) + LOG( "CPositionInfo::DoCancel(), begin" ); + switch(iState) { - iPositioner.CancelRequest( EPositionerNotifyPositionUpdate ); + 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 +