mapnavproviderrefapp/src/mnrppositionrequest.cpp
branchRCL_3
changeset 18 870918037e16
parent 0 522cd55cc3d7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mapnavproviderrefapp/src/mnrppositionrequest.cpp	Wed Sep 01 12:31:27 2010 +0100
@@ -0,0 +1,272 @@
+/*
+* 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;
+    }