diff -r b73a2e62868f -r 6752808b2036 locationmanager/server/src/clocationmanagerserver.cpp --- a/locationmanager/server/src/clocationmanagerserver.cpp Tue Feb 02 00:24:33 2010 +0200 +++ b/locationmanager/server/src/clocationmanagerserver.cpp Fri Feb 19 23:14:48 2010 +0200 @@ -98,6 +98,7 @@ iSessionReady( EFalse ), iTagId( 0 ), iLocManStopDelay( 0 ), + iLocManStopRemapDelay( 0 ), iCaptureSetting( RLocationTrail::EOff ), iRemoveLocation( EFalse ) { @@ -133,7 +134,6 @@ CRepository* repository = CRepository::NewLC( KRepositoryUid ); TInt err = repository->Get( KLocationTrailShutdownTimer, iLocManStopDelay ); - CleanupStack::PopAndDestroy( repository ); LOG1("CLocationManagerServer::ConstructL, iLocManStopDelay:%d", iLocManStopDelay); @@ -142,6 +142,17 @@ LOG1("CLocationManagerServer::ConstructL, iLocManStopDelay err:%d", err); iLocManStopDelay = KLocationTrailShutdownDelay; } + + err = repository->Get( KLocationTrailRemapShutdownTimer, iLocManStopRemapDelay ); + CleanupStack::PopAndDestroy( repository ); + + LOG1("CLocationManagerServer::ConstructL, iLocManStopRemapDelay:%d", iLocManStopRemapDelay); + + if ( err != KErrNone ) + { + LOG1("CLocationManagerServer::ConstructL, iLocManStopRemapDelay err:%d", err); + iLocManStopRemapDelay = KLocationTrailRemapShutdownDelay; + } LOG ("CLocationManagerServer::ConstructL() end"); } @@ -308,6 +319,7 @@ { User::Leave( KErrAlreadyExists ); } + if ( iTimer ) { delete iTimer; @@ -329,27 +341,35 @@ GetLocationTrailState( state ); if( state == RLocationTrail::ETrailStarted || state == RLocationTrail::ETrailStarting ) { - iLocationRecord->Stop(); + TRAPD( error, iTimer = CPeriodic::NewL( CActive::EPriorityStandard ) ); + if ( error != KErrNone ) + { + // If timer can't be created we stop the location trail immediately. + iLocationRecord->Stop(); + StopTrackLogL(); + return; + } + iLocationRecord->SetStateToStopping(); + iTimer->Start( KLocationTrailRemappingCheckDelay * 1000000, 0, TCallBack( CheckForRemappingCallback, this ) ); } else if ( state != RLocationTrail::ETrailStopped && state != RLocationTrail::ETrailStopping ) { + TInt delay( iLocManStopDelay ); if ( iLocationRecord->RemappingNeeded() ) { - TRAPD( error, iTimer = CPeriodic::NewL( CActive::EPriorityStandard ) ); - if ( error != KErrNone ) - { - // If timer can't be created we stop the location trail immediately. - iLocationRecord->Stop(); - StopTrackLogL(); - return; - } - iLocationRecord->SetStateToStopping(); - iTimer->Start( iLocManStopDelay * 1000000, 0, TCallBack( PositioningStopTimeout, this ) ); + delay = iLocManStopRemapDelay; } - else + + TRAPD( error, iTimer = CPeriodic::NewL( CActive::EPriorityStandard ) ); + if ( error != KErrNone ) { + // If timer can't be created we stop the location trail immediately. iLocationRecord->Stop(); + StopTrackLogL(); + return; } + iLocationRecord->SetStateToStopping(); + iTimer->Start( delay * 1000000, 0, TCallBack( PositioningStopTimeout, this ) ); } // Always stop tracklog. @@ -380,6 +400,32 @@ } // -------------------------------------------------------------------------- +// CLocationUtilityServer::PositioningStopTimeout +// -------------------------------------------------------------------------- +// +TInt CLocationManagerServer::CheckForRemappingCallback( TAny* aAny ) + { + CLocationManagerServer* self = STATIC_CAST( CLocationManagerServer*, aAny ); + + self->iTimer->Cancel(); + + TInt delay( self->iLocManStopDelay ); + if ( self->iLocationRecord->RemappingNeeded() ) + { + delay = self->iLocManStopRemapDelay; + self->iTimer->Start( delay * 1000000, 0, TCallBack( PositioningStopTimeout, self ) ); + } + else + { + delete self->iTimer; + self->iTimer = NULL; + self->iLocationRecord->Stop(); + } + + return KErrNone; + } + +// -------------------------------------------------------------------------- // CLocationManagerServer::GetLocationTrailState // -------------------------------------------------------------------------- //