diff -r 1fc85118c3ae -r 870918037e16 locationlandmarksrefappfors60/Src/LandmarksPositionRequest.cpp --- /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 +#include +#include + +#include + +#include +#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 (&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)); + } + +