diff -r e8c1ea2c6496 -r 8758140453c0 lbs/common/src/ctlbsdoposupdate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lbs/common/src/ctlbsdoposupdate.cpp Thu Jan 21 12:53:44 2010 +0000 @@ -0,0 +1,197 @@ +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Symbian Foundation License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// ao wrapper around the a-gps mgr function NotifyPositionUpdate +// +// + + + +/** + @file ctlbsdoposupd.cpp +*/ + +#include "ctlbsdoposupdate.h" +#include "tlbsutils.h" + + +CT_LbsDoPosUpdate* CT_LbsDoPosUpdate::NewL(MT_LbsDoPosUpdateObserver* aObserver, TPositionModuleInfo::TTechnologyType aTechnologyType) +/** + * 'public constructor' may leave + */ + { + TPositionCriteria dummyCritera; + CT_LbsDoPosUpdate* doPosUpdate = new(ELeave)CT_LbsDoPosUpdate(aObserver); + CleanupStack::PushL(doPosUpdate); + doPosUpdate->ConstructL(EOpenSubSessionByModuleId,aTechnologyType,dummyCritera); + CleanupStack::Pop(doPosUpdate); + + return doPosUpdate; + } + + +CT_LbsDoPosUpdate* CT_LbsDoPosUpdate::NewL(MT_LbsDoPosUpdateObserver* aObserver, const TPositionCriteriaBase& aCriteria) +/** + * 'public constructor' may leave + */ + { + TUint dummyTechnologyType = TPositionModuleInfo::ETechnologyUnknown; + CT_LbsDoPosUpdate* doPosUpdate = new(ELeave)CT_LbsDoPosUpdate(aObserver); + CleanupStack::PushL(doPosUpdate); + doPosUpdate->ConstructL(EOpenSubSessionByCriteria,dummyTechnologyType,aCriteria); + CleanupStack::Pop(doPosUpdate); + + return doPosUpdate; + } + + +CT_LbsDoPosUpdate::CT_LbsDoPosUpdate(MT_LbsDoPosUpdateObserver* aObserver) : CActive(EPriorityStandard), iObserver(aObserver) +/** + * Constructor - will not leave + */ + { + CActiveScheduler::Add(this); + } + + +void CT_LbsDoPosUpdate::OpenPositioner(TPositionModuleInfo::TTechnologyType aTechnologyType) + { + // Open the positioner. + if(TPositionModuleInfo::ETechnologyUnknown == aTechnologyType) // use default + { + User::LeaveIfError(iPositioner.Open(iServer)); + } + else if(TPositionModuleInfo::ETechnologyTerminal == aTechnologyType) + { + T_LbsUtils utils; + // Get position using Agps module + TPositionModuleId moduleId; + moduleId = utils.GetAGpsModuleIdL(iServer); + User::LeaveIfError(iPositioner.Open(iServer, moduleId)); + } + else if(TPositionModuleInfo::ETechnologyNetwork == aTechnologyType) + { + T_LbsUtils utils; + // Get position using network module + TPositionModuleId moduleId; + moduleId = utils.GetNetworkModuleIdL(iServer); + User::LeaveIfError(iPositioner.Open(iServer, moduleId)); + } + else + { + __ASSERT_ALWAYS(EFalse, User::Panic(KCT_LbsDoPosUpdate, KErrNotSupported)); // not supported yet + } + } + +void CT_LbsDoPosUpdate::ClosePositioner(void) + { + iPositioner.Close(); + } + +void CT_LbsDoPosUpdate::ConnectServer() + { + User::LeaveIfError(iServer.Connect()); + } + +void CT_LbsDoPosUpdate::CloseServer() + { + iServer.Close(); + } + +void CT_LbsDoPosUpdate::ConstructL(TOpenSubSessionType aOpenSubSessionType,TPositionModuleInfo::TTechnologyType aTechnologyType, const TPositionCriteriaBase& aCriteria) + { + // Connect to the LBS self locate server. + User::LeaveIfError(iServer.Connect()); + + if(aOpenSubSessionType == EOpenSubSessionByModuleId) + { + OpenPositioner(aTechnologyType); + } + + else if(aOpenSubSessionType == EOpenSubSessionByCriteria) + { + User::LeaveIfError(iPositioner.Open(iServer, aCriteria)); + } + + // set requester will be removed, don't forget the pushl above + User::LeaveIfError(iPositioner.SetRequestor( CRequestor::ERequestorService, + CRequestor::EFormatApplication, + _L("Tom Tom"))); + + } + + +CT_LbsDoPosUpdate::~CT_LbsDoPosUpdate() +/** + * Destructor + */ + { + Cancel(); + + iPositioner.Close(); + iServer.Close(); + } + + +TInt CT_LbsDoPosUpdate::SetOptions(const TPositionUpdateOptionsBase& aPosOption) + { + return iPositioner.SetUpdateOptions(aPosOption); + } + + +void CT_LbsDoPosUpdate::StartL(TPositionInfo& aPosInfo) +/** + * wrapper for async function RLbsPositionUpdates::NotifyPositionUpdate(). + * Will panic if there's another outstanding request. + */ + { + __ASSERT_ALWAYS(!IsActive(), User::Panic(KCT_LbsDoPosUpdate, KErrInUse)); + + // Invoke the position update. + iPositioner.NotifyPositionUpdate(aPosInfo, iStatus); + SetActive(); + } + +void CT_LbsDoPosUpdate::CancelRequest() + { + // To allow us to cancel the request but not the active object, normally Cancel() would be used. + DoCancel(); + } + +void CT_LbsDoPosUpdate::DoCancel() + { + iPositioner.CancelRequest(EPositionerNotifyPositionUpdate); + } + + +void CT_LbsDoPosUpdate::RunL() + { + TInt err = iStatus.Int(); + + // iStatus will contain error code + // async request completed. Notify caller via callback: + if (iObserver) + { + iObserver->MT_LbsDoPosUpdateCallback(iStatus); + } + } + +TInt CT_LbsDoPosUpdate::RunError(TInt aError) + { + return aError; + } + +TInt CT_LbsDoPosUpdate::CompleteRequest(TInt aRequestId) + { + return iPositioner.CompleteRequest(aRequestId); + }