--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/locationlandmarksrefappfors60/Src/LandmarksPositionRequest.cpp Tue Feb 02 00:16:03 2010 +0200
@@ -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));
+ }
+
+