diff -r 000000000000 -r 9cfd9a3ee49c datasourcemodules/simulationpositioningmodule/src/EPos_CPosControllerBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datasourcemodules/simulationpositioningmodule/src/EPos_CPosControllerBase.cpp Tue Feb 02 01:50:39 2010 +0200 @@ -0,0 +1,155 @@ +// Copyright (c) 2005-2009 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: +// + + + +// INCLUDE FILES +#include "EPos_CPosControllerBase.h" +#include "EPos_CPosSimulationPositioner.h" +#include + +//consts + +const TInt KDefaultReadInterval(1000000); //1 second + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CPosControllerBase::CPosControllerBase(TBool aTimeRelativePlayback) +: CActive(EPriorityStandard), iTimeRelativePlayback(aTimeRelativePlayback), +iTimeBetweenReads(KDefaultReadInterval) + { + } + +// Destructor +CPosControllerBase::~CPosControllerBase() + { + CancelAllNotifyPositionUpdate(); + iSimulationPositioners.Close(); + } + +void CPosControllerBase::CompleteRequest(const TInt aIndex, TInt aErrorCode) + { + if (aIndex > KErrNotFound && aIndex < iSimulationPositioners.Count()) + { + TRequestStatus& status = iSimulationPositioners[aIndex].iReqStatus; + iSimulationPositioners[aIndex].iSimPos.CompleteRequest(status, aErrorCode); + iSimulationPositioners.Remove(aIndex); + } + else + { + User::Panic(_L("iSimulationPositioners corrupted"), KErrCorrupt); + } + } + +// ---------------------------------------------------------------------------- +// CPosNmeaController::CancelNotifyPositionUpdate +// +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CPosControllerBase::CancelNotifyPositionUpdate(const CPosSimulationPositioner& aSimPos) + { + TInt index = FindPositioner(aSimPos); + if (index > KErrNotFound) + { + TRequestStatus& rs = iSimulationPositioners[index].iReqStatus; + CompleteRequest(index, KErrCancel); + } + } + +void CPosControllerBase::CancelAllNotifyPositionUpdate() + { + while ( iSimulationPositioners.Count() > 0 ) + { + //complete always first of iSimulationPositioner + //because CompleteRequest deletes completed positioner + CompleteRequest(0, KErrCancel); + } +// for(TInt index=0; index < iSimulationPositioners.Count(); index++) +// { +// CompleteRequest(index, KErrCancel); +// index--; +// } + } + +void CPosControllerBase::NotifyPositionUpdateBase(TPositionInfoBase& aPosInfo, TRequestStatus& aStatus, CPosSimulationPositioner& aSimPos) + { + aStatus = KRequestPending; + CPosSimulationPositioner::ClearAndSetDefaultPositionData(aPosInfo); + TPositionerReference ref(aSimPos,aStatus, static_cast(aPosInfo)); + TInt err = iSimulationPositioners.Append(ref); + if (err != KErrNone) + { + //not using CopleteRequest(const CPosSimulationPositioner&, TRequestStatus&, TInt) + //because adding positioner to array was unsuccessful then we can't remove it + //from it. It could cause PANIC + aSimPos.CompleteRequest(aStatus, err); + } + } + +void CPosControllerBase::CompleteRequestBase(TInt aErrorCode) + { + TPosition pos; + iPosition.GetPosition(pos); + TInt i = 0; + while (i < iSimulationPositioners.Count()) + { + if (aErrorCode != KPositionPartialUpdate + || iSimulationPositioners[i].iSimPos.PartialUpdateAllowed()) + { + iSimulationPositioners[i].iPosition.SetPosition(pos); + CompleteRequest(i, aErrorCode); + //complete request removes current position from iSimulationPositioners + //then wee need to not modify iterator + } + else + { + i++; + } + } +// for(TInt i=0; i < iSimulationPositioners.Count(); i++) +// { +// if(aErrorCode!=KPositionPartialUpdate || +// iSimulationPositioners[i].iSimPos.PartialUpdateAllowed() ) +// { +// iSimulationPositioners[i].iPosition.SetPosition(pos); +// CompleteRequest(i, aErrorCode); +// //complete request removes current position from iSimulationPositioners +// //then wee need to modify iterator +// i--; +// } +// } + + CPosSimulationPositioner::ClearAndSetDefaultPositionData(iPosition); + } + +TInt CPosControllerBase::FindPositioner(const CPosSimulationPositioner& aSimPos) + { + TInt ret = KErrNotFound; + for(TInt i = 0; i < iSimulationPositioners.Count(); i++) + { + if( &iSimulationPositioners[i].iSimPos == &aSimPos) + { + ret = i; + break; + } + } + return ret; + } + +// End of File