locationlandmarksrefappfors60/Src/LandmarksPositionRequest.cpp
branchRCL_3
changeset 18 870918037e16
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/locationlandmarksrefappfors60/Src/LandmarksPositionRequest.cpp	Wed Sep 01 12:31:27 2010 +0100
@@ -0,0 +1,287 @@
+/*
+* Copyright (c) 2004-2007 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:  Implements the CLandmarksPositionRequest class
+*
+*/
+
+
+
+#include <AknWaitDialog.h>
+#include <coemain.h>
+#include <aknnotewrappers.h>
+
+#include <lbspositioninfo.h>
+
+#include <lmrefapp.rsg>
+#include "LandmarksUtils.h"
+#include "LandmarksPositionRequest.h"
+#include "LandmarksOperationObserver.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CLandmarksPositionRequest::CLandmarksPositionRequest(
+    MLandmarksOperationObserver* aObserver)
+    : 
+    CActive(CActive::EPriorityStandard), 
+    iObserver(aObserver),
+    iState(EIdle)
+    {
+    CActiveScheduler::Add(this);
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksPositionRequest::ConstructL(const TDesC& aAppName)
+    {
+    iAppName = aAppName.AllocL();
+    InitializeL();
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CLandmarksPositionRequest* CLandmarksPositionRequest::NewL(
+    const TDesC& aAppName,
+    MLandmarksOperationObserver* aObserver)
+    {
+    CLandmarksPositionRequest* self =
+        new (ELeave) CLandmarksPositionRequest(aObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL(aAppName);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+CLandmarksPositionRequest::~CLandmarksPositionRequest()
+    {
+    Cancel();
+    iPositioner.Close();
+    iLocationServer.Close();
+    DismissWaitNote();
+    delete iAppName;
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksPositionRequest::FetchPositionInfoL(
+    const TDesC& aMessage,
+    TPositionInfo& aPositionInfo)
+    {
+    Cancel();
+    iPositionInfo = &aPositionInfo;
+
+    // Initialize wait note
+    CAknWaitDialog* waitNote = new (ELeave) CAknWaitDialog(
+        reinterpret_cast <CEikDialog**> (&iWaitNote), ETrue); // show immedaitely
+    CleanupStack::PushL(waitNote);
+    waitNote->SetCallback(this);
+    waitNote->SetTextL(aMessage);
+    waitNote->PrepareLC(R_LMREFAPP_ACQUIRE_LOCATION_WAIT_NOTE);
+    CleanupStack::Pop(waitNote); // waitNote will delete itself
+    iWaitNote = waitNote;
+
+    // Request location
+    iState = EAcquiringDefaultLocation;
+    ExecuteNextStep();
+
+    // Launch wait note
+    iWaitNote->RunLD();
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksPositionRequest::DismissWaitNote()
+    {
+    if (iWaitNote)
+        {
+        TInt err;
+        TRAP(err, iWaitNote->ProcessFinishedL());
+        iWaitNote = NULL;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksPositionRequest::DoCancel()
+    {
+    // Cancel location request
+    if (iState == EAcquiringDefaultLocation)
+        {
+        iPositioner.CancelRequest(EPositionerNotifyPositionUpdate);
+        }
+    else if (iState == EAcquiringLastKnownLocation)
+        {
+        iPositioner.CancelRequest(EPositionerGetLastKnownPosition);
+        }
+    iState = EIdle;
+    DismissWaitNote();
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksPositionRequest::RunL()
+    {
+    if (iStatus == KErrNone)
+        {
+        // Location retrieved. Operation finished.
+
+        if ( iState == EAcquiringLastKnownLocation )
+            {
+            // inform user that it was last known location
+            HBufC* msg = CCoeEnv::Static()->AllocReadResourceLC( R_LMREFAPP_LAST_LOCATION_USED_INFO );
+            LandmarksUtils::ErrorNoteL( *msg );
+            CleanupStack::PopAndDestroy(msg);
+            }
+
+        NotifyOperationCompleteL(KErrNone);
+        }
+    else // iStatus != KErrNone
+        {
+        if (iState == EAcquiringDefaultLocation)
+            {
+            // Fetching current location failed. Try last known location.
+            iState = EAcquiringLastKnownLocation;
+            ExecuteNextStep();
+            }
+        else if (iState == EAcquiringLastKnownLocation)
+            {
+            // Fetching last known location failed. 
+            NotifyOperationCompleteL(iStatus.Int());
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+TInt CLandmarksPositionRequest::RunError(TInt /*aError*/)
+    {
+    // Ignore possible errors.
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksPositionRequest::DialogDismissedL(TInt aButtonId)
+    {
+    if (aButtonId == EAknSoftkeyCancel)
+        {
+        // Dialog is already dismissed by framework
+        iWaitNote = NULL;
+
+        Cancel();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksPositionRequest::ShowErrorL(TInt aError)
+    {
+    HBufC* format = CCoeEnv::Static()->AllocReadResourceAsDes16LC(
+        R_LMREFAPP_ACQUIRING_LOC_ERROR);
+    
+    // some extra characters needed for error code
+    const TInt KErrorCodeTextLength = 10;
+    HBufC* message = HBufC::NewLC(
+        format->Length() + KErrorCodeTextLength);
+    message->Des().Format(*format, aError);
+
+    CAknInformationNote* informationNote = 
+        new (ELeave) CAknInformationNote(ETrue);
+    informationNote->ExecuteLD(*message);
+    CleanupStack::PopAndDestroy(2, format);
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksPositionRequest::ExecuteNextStep()
+    {
+    iStatus = KRequestPending;
+
+    switch (iState)
+        {
+        case EAcquiringDefaultLocation:
+            iPositioner.NotifyPositionUpdate(*iPositionInfo, iStatus);
+            break;
+        case EAcquiringLastKnownLocation:
+            iPositioner.GetLastKnownPosition(*iPositionInfo, iStatus);
+            break;
+        default:    
+            // this case should never happen, see RunL
+            LandmarksUtils::Panic(KErrGeneral);
+            break;
+        }
+
+    SetActive();
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksPositionRequest::NotifyOperationCompleteL(TInt aError)
+    {
+    DismissWaitNote();
+    iState = EIdle;
+
+    // Notify user if location couldn't be fetched.
+    if (aError) 
+        {
+        ShowErrorL(aError);
+        }
+
+    // Notify Observer
+    iObserver->NotifyOperationProgressL(
+        EAcquiringLocation, KOperationReady, aError);
+    }
+
+// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
+//
+void CLandmarksPositionRequest::InitializeL()
+    {
+    // 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,
+        *iAppName));
+
+    // Set maximum allowed time for a location request
+    const TInt K30Seconds = 30000000;
+    TTimeIntervalMicroSeconds timeOut(K30Seconds);
+    TPositionUpdateOptions updateOptions;
+    updateOptions.SetUpdateTimeOut(timeOut);
+    User::LeaveIfError(iPositioner.SetUpdateOptions(updateOptions));
+    }
+
+