locationmanager/locationtrail/src/cpositioninfo.cpp
branchRCL_3
changeset 19 b73252188534
parent 7 3cebc1a84278
equal deleted inserted replaced
18:63c982fb92f2 19:b73252188534
    41 // CPositionInfo::CPositionInfo
    41 // CPositionInfo::CPositionInfo
    42 // --------------------------------------------------------------------------
    42 // --------------------------------------------------------------------------
    43 //  
    43 //  
    44 CPositionInfo::CPositionInfo( MPositionInfoObserver* aTrail ) 
    44 CPositionInfo::CPositionInfo( MPositionInfoObserver* aTrail ) 
    45     : CActive( CActive::EPriorityStandard ),
    45     : CActive( CActive::EPriorityStandard ),
    46     iFirstInterval( ETrue )
    46     iState( EPositionOptStateNone ),
       
    47     iConnectedPositionServer(EFalse)
    47     {
    48     {
    48     LOG( "CPositionInfo::CPositionInfo()");
    49     LOG( "CPositionInfo::CPositionInfo()");
    49     CActiveScheduler::Add( this );
    50     CActiveScheduler::Add( this );
    50     iTrail = aTrail;
    51     iTrail = aTrail;
    51     iTrailCaptureSetting = RLocationTrail::ECaptureAll;
    52     iTrailCaptureSetting = RLocationTrail::ECaptureAll;
    73 // CPositionInfo::~CPositionInfo
    74 // CPositionInfo::~CPositionInfo
    74 // --------------------------------------------------------------------------
    75 // --------------------------------------------------------------------------
    75 //    
    76 //    
    76 EXPORT_C CPositionInfo::~CPositionInfo()
    77 EXPORT_C CPositionInfo::~CPositionInfo()
    77     {
    78     {
    78     Cancel();
    79     Stop();
    79     iPositioner.Close();
       
    80     iPosServer.Close();
       
    81     }
    80     }
    82 
    81 
    83 // --------------------------------------------------------------------------
    82 // --------------------------------------------------------------------------
    84 // CPositionInfo::RunError
    83 // CPositionInfo::RunError
    85 // --------------------------------------------------------------------------
    84 // --------------------------------------------------------------------------
    94 // --------------------------------------------------------------------------
    93 // --------------------------------------------------------------------------
    95 //
    94 //
    96 void CPositionInfo::StartL( RLocationTrail::TTrailCaptureSetting aCaptureSetting, TInt aUpdateInterval )
    95 void CPositionInfo::StartL( RLocationTrail::TTrailCaptureSetting aCaptureSetting, TInt aUpdateInterval )
    97     {
    96     {
    98     LOG( "CPositionInfo::StartL(), begin" );
    97     LOG( "CPositionInfo::StartL(), begin" );
    99 
    98     if(IsActive()) 
       
    99         {
       
   100         Cancel();
       
   101         }
   100     iTrailCaptureSetting = aCaptureSetting;
   102     iTrailCaptureSetting = aCaptureSetting;
   101     iUpdateInterval = aUpdateInterval;
   103     iUpdateInterval = aUpdateInterval;
   102     iFirstInterval = ETrue;
   104     iState = EPositionOptStateNone;
       
   105     
   103     iPositionInfo = TPositionSatelliteInfo();
   106     iPositionInfo = TPositionSatelliteInfo();
   104     
       
   105     // Set update interval.
       
   106      iUpdateOptions.SetUpdateInterval( TTimeIntervalMicroSeconds(KFirstInterval) );
       
   107      // Set time out level. 
       
   108      iUpdateOptions.SetUpdateTimeOut( TTimeIntervalMicroSeconds( KFirstTimeOut) );
       
   109      // Positions which have time stamp below KMaxAge can be reused
       
   110      iUpdateOptions.SetMaxUpdateAge( TTimeIntervalMicroSeconds(KMaxAge) );
       
   111      // Disables location framework to send partial position data
       
   112      iUpdateOptions.SetAcceptPartialUpdates( EFalse );
       
   113     
   107     
   114     if ( aCaptureSetting == RLocationTrail::ECaptureAll ) 
   108     if ( aCaptureSetting == RLocationTrail::ECaptureAll ) 
   115     	{
   109     	{
   116 	    User::LeaveIfError( iPosServer.Connect() );
   110     	if(!iConnectedPositionServer)
   117 	    User::LeaveIfError( iPositioner.Open( iPosServer ) );
   111             {   
   118 	    User::LeaveIfError( iPositioner.SetRequestor( CRequestor::ERequestorService,
   112              // Positions which have time stamp below KMaxAge can be reused
   119 	                        CRequestor::EFormatApplication, KRequestor ) );
   113              iUpdateOptions.SetMaxUpdateAge( TTimeIntervalMicroSeconds(KMaxAge) );
   120 	    User::LeaveIfError( iPositioner.SetUpdateOptions( iUpdateOptions ) );
   114              // Disables location framework to send partial position data
   121 	    iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus );
   115              iUpdateOptions.SetAcceptPartialUpdates( EFalse );
       
   116     	    User::LeaveIfError( iPosServer.Connect() );
       
   117             CleanupClosePushL(iPosServer);
       
   118     	    User::LeaveIfError( iPositioner.Open( iPosServer ) );
       
   119             CleanupClosePushL(iPositioner);
       
   120     	    User::LeaveIfError( iPositioner.SetRequestor( CRequestor::ERequestorService,
       
   121     	                        CRequestor::EFormatApplication, KRequestor ) );
       
   122             iUpdateOptions.SetUpdateInterval( TTimeIntervalMicroSeconds (iUpdateInterval) );  
       
   123             iUpdateOptions.SetUpdateTimeOut( TTimeIntervalMicroSeconds(KUpdateTimeOut ) );
       
   124             User::LeaveIfError( iPositioner.SetUpdateOptions( iUpdateOptions ) );
       
   125             CleanupStack::Pop(2); // iPositioner, iPosServer
       
   126             iConnectedPositionServer = ETrue;
       
   127            }
       
   128         iState = EPositionOptStateGetLastKnownPosition;
       
   129         iPositioner.GetLastKnownPosition( iPositionInfo, iStatus );
       
   130         SetActive();
   122     	}
   131     	}
   123     
   132     else if ( aCaptureSetting == RLocationTrail::ECaptureNetworkInfo ) 
   124     SetActive();
       
   125     
       
   126     if ( aCaptureSetting == RLocationTrail::ECaptureNetworkInfo ) 
       
   127     	{
   133     	{
   128     	TRequestStatus* status = &iStatus;
   134     	TRequestStatus* status = &iStatus;
   129         User::RequestComplete( status, KErrNone );
   135         User::RequestComplete( status, KErrNone );
   130     	}
   136     	}
   131 
   137 
   136 // CPositionInfo::NextPosition
   142 // CPositionInfo::NextPosition
   137 // --------------------------------------------------------------------------
   143 // --------------------------------------------------------------------------
   138 //
   144 //
   139 void CPositionInfo::NextPosition()
   145 void CPositionInfo::NextPosition()
   140     {
   146     {
   141     iPositionInfo = TPositionSatelliteInfo(); // Clear position info.
   147     LOG( "CPositionInfo::NextPosition(), begin" );
   142     if ( iTrailCaptureSetting == RLocationTrail::ECaptureAll )
   148     if(!IsActive() && iConnectedPositionServer)
   143     	{
   149         {
   144     	iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus );
   150         LOG("Not active");
   145     	}
   151         iPositionInfo = TPositionSatelliteInfo(); // Clear position info.
   146     
   152         if ( iTrailCaptureSetting == RLocationTrail::ECaptureAll )
   147     SetActive();
   153         	{
   148     
   154             iState = EPositionOptStateNotifyUpdate;
   149     if ( iTrailCaptureSetting == RLocationTrail::ECaptureNetworkInfo ) 
   155         	iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus );
   150     	{
   156             SetActive();
   151     	TRequestStatus* status = &iStatus;
   157         	}
   152         User::RequestComplete( status, KErrNone );
   158         else if ( iTrailCaptureSetting == RLocationTrail::ECaptureNetworkInfo ) 
   153     	}
   159         	{
       
   160             SetActive();
       
   161         	TRequestStatus* status = &iStatus;
       
   162             User::RequestComplete( status, KErrNone );
       
   163         	}
       
   164         }
       
   165     LOG( "CPositionInfo::NextPosition(), end" );
   154     }
   166     }
   155     
   167     
   156 // --------------------------------------------------------------------------
   168 // --------------------------------------------------------------------------
   157 // CPositionInfo::Stop
   169 // CPositionInfo::Stop
   158 // --------------------------------------------------------------------------
   170 // --------------------------------------------------------------------------
   159 //
   171 //
   160 void CPositionInfo::Stop()
   172 void CPositionInfo::Stop()
   161     {
   173     {
       
   174     LOG( "CPositionInfo::Stop(), begin" );
   162     Cancel();    
   175     Cancel();    
   163 
   176     if(iConnectedPositionServer)
   164     iPositioner.Close();
   177         {
   165     iPosServer.Close();
   178         iPositioner.Close();
       
   179         iPosServer.Close();
       
   180         iConnectedPositionServer = EFalse;
       
   181         }
       
   182     // reset the state
       
   183     iState = EPositionOptStateNone;
       
   184     LOG( "CPositionInfo::Stop(), end" );
   166     }    
   185     }    
   167         
   186         
   168 // --------------------------------------------------------------------------
   187 // --------------------------------------------------------------------------
   169 // CPositionInfo::RunL
   188 // CPositionInfo::RunL
   170 // --------------------------------------------------------------------------
   189 // --------------------------------------------------------------------------
   171 //
   190 //
   172 void CPositionInfo::RunL()
   191 void CPositionInfo::RunL()
   173     { 
   192     { 
   174     iTrail->Position( iPositionInfo, iStatus.Int() );
   193     LOG( "CPositionInfo::RunL(), begin" );
   175  
   194     if(iState == EPositionOptStateGetLastKnownPosition)
   176     if ( iFirstInterval && IsActive() )
   195         {
       
   196         // get last location.. check the time and if it's within the limit, pass to trail.
       
   197         const TTimeIntervalSeconds KMaxAllowedLastKnownPosition(60*5); // 5 mins
       
   198         TTimeIntervalSeconds interval;
       
   199         TTime now;
       
   200         TPosition lastPosition;
       
   201         iPositionInfo.GetPosition(lastPosition);
       
   202         now.UniversalTime();
       
   203         now.SecondsFrom(lastPosition.Time(), interval);
       
   204         if(iStatus.Int() == KErrNone && interval < KMaxAllowedLastKnownPosition)
       
   205             {
       
   206             LOG("Last know position is recent one");
       
   207             iTrail->Position( iPositionInfo, iStatus.Int() );
       
   208             }
       
   209         else
       
   210             {
       
   211             LOG("Old last know position. Drop it..");
       
   212             }
       
   213         }
       
   214     else
       
   215         {
       
   216         // notify response.. always pass to trail
       
   217         iTrail->Position( iPositionInfo, iStatus.Int() );
       
   218         }
       
   219      
       
   220     if ( iTrailCaptureSetting == RLocationTrail::ECaptureAll &&
       
   221         iState != EPositionOptStateNone) 
   177     	{
   222     	{
   178     	Cancel();
   223     	NextPosition();
   179     	LOG("CPositionInfo::RunL() - First Time");
       
   180     	iUpdateOptions.SetUpdateInterval( TTimeIntervalMicroSeconds (iUpdateInterval) );  
       
   181     	iUpdateOptions.SetUpdateTimeOut( TTimeIntervalMicroSeconds(KUpdateTimeOut ) );
       
   182         if ( iTrailCaptureSetting == RLocationTrail::ECaptureAll ) 
       
   183         	{
       
   184         	User::LeaveIfError( iPositioner.SetUpdateOptions( iUpdateOptions ) );        	
       
   185         	iPositioner.NotifyPositionUpdate( iPositionInfo, iStatus );
       
   186         	}
       
   187     	SetActive();
       
   188     	iFirstInterval = EFalse;
       
   189     	}
   224     	}
       
   225     LOG( "CPositionInfo::RunL(), end" );
   190     }    
   226     }    
   191 
   227 
   192 // --------------------------------------------------------------------------
   228 // --------------------------------------------------------------------------
   193 // CPositionInfo::DoCancel
   229 // CPositionInfo::DoCancel
   194 // --------------------------------------------------------------------------
   230 // --------------------------------------------------------------------------
   195 // 
   231 // 
   196 void CPositionInfo::DoCancel()
   232 void CPositionInfo::DoCancel()
   197     {
   233     {
   198     LOG( "CPositionInfo::DoCancel()" );
   234     LOG( "CPositionInfo::DoCancel(), begin" );
   199     if ( IsActive() )    
   235     switch(iState)
   200         {
   236         {
   201         iPositioner.CancelRequest( EPositionerNotifyPositionUpdate );
   237         case EPositionOptStateGetLastKnownPosition:
   202         }
   238             {
       
   239             iPositioner.CancelRequest( EPositionerGetLastKnownPosition );
       
   240             break;
       
   241             }
       
   242         case EPositionOptStateNotifyUpdate:
       
   243             {
       
   244             iPositioner.CancelRequest( EPositionerNotifyPositionUpdate );
       
   245             break;
       
   246             }
       
   247         default:
       
   248             break;
       
   249         }
       
   250 	iState = EPositionOptStateNone;
       
   251     LOG( "CPositionInfo::DoCancel(), end" );
       
   252     }
       
   253 
       
   254 
       
   255 // --------------------------------------------------------------------------
       
   256 // CPositionInfo::HandleRemapComplete
       
   257 // --------------------------------------------------------------------------
       
   258 // 
       
   259 void CPositionInfo::HandleRemapComplete()
       
   260     {
       
   261     LOG( "CPositionInfo::HandleRemapComplete()" );
       
   262     // Don't call notify update from RunL
       
   263     iState = EPositionOptStateNone;
   203     }
   264     }
   204 
   265 
   205 // End of file
   266 // End of file
       
   267