diff -r 000000000000 -r 9cfd9a3ee49c datasourcemodules/simulationpositioningmodule/src/EPos_CPosControllerManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datasourcemodules/simulationpositioningmodule/src/EPos_CPosControllerManager.cpp Tue Feb 02 01:50:39 2010 +0200 @@ -0,0 +1,266 @@ +/* +* Copyright (c) 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 "EPos_CPosControllerManager.h" +#include +#include +#include +#include +#include "EPos_CPosSimulationPositioner.h" +#include "EPos_CPosControllerBase.h" +#include "SimulationPSYInternalCRKeys.h" +#include "EPos_CPosNmeaController.h" +#include "EPos_CPosFixedDataController.h" +#include "EPos_CPosDataSimulationController.h" +_LIT(KDefaultNmeFileName, "\\resource\\default.nme"); + +// The unit tests (te_lbssimulationsuite.exe) are built as an EXE and cannot +// use TLS. The macro below redefines Dll to a new class TestDll that provides +// an EXE equivalent. +#ifdef SIMPSYTEST +#define Dll TestDll +class TestDll + { +public: + static TAny* Tls() { return reinterpret_cast(iInternal); }; + static TInt SetTls(const TAny* aAny) + { + iInternal = reinterpret_cast(aAny); + return KErrNone; + }; + static void FreeTls() { iInternal = 0; }; +private: + static TUint32 iInternal; + }; +TUint32 TestDll::iInternal = 0; +#endif + +TUint32 HashFunc(const CPosSimulationPositioner& aSimPos) + { + return DefaultHash::Integer(reinterpret_cast(&aSimPos)); + } + +TBool IdentityFunc(const CPosSimulationPositioner& aSimPos1, const CPosSimulationPositioner& aSimPos2) + { + return &aSimPos1 == &aSimPos2; + } + +// --------------------------------------------------------------------------- +// Returns the singleton instance. +// --------------------------------------------------------------------------- +// +CPosControllerManager* CPosControllerManager::InstanceL() + { + CPosControllerManager* self = NULL; + + TAny* tlsPtr = Dll::Tls(); + if (!tlsPtr) + { + self = new (ELeave) CPosControllerManager; + CleanupStack::PushL(self); + self->ConstructL(); + User::LeaveIfError(Dll::SetTls(self)); + CleanupStack::Pop(self); + } + else + { + self = static_cast (tlsPtr); + ++self->iReferenceCount; + } + + return self; + } + +// --------------------------------------------------------------------------- +// Releases the singleton instance. +// --------------------------------------------------------------------------- +// +void CPosControllerManager::ReleaseInstance(const CPosSimulationPositioner& aSimPos) + { + //Delete controller only in Independent Data Set mode. + //when there is more then one controller + //In TRP mode the only existing controller is deleted in destructor + if (!iTrp) + { + CPosControllerBase* p = iPositionerControllerMap.Find(aSimPos); + delete p; + iPositionerControllerMap.Remove(&aSimPos); + } + + + TAny* tlsPtr = Dll::Tls(); + __ASSERT_DEBUG( tlsPtr, User::Panic( + _L( "CPosControllerManager" ), KErrNotFound ) ); + + CPosControllerManager* self = static_cast (tlsPtr); + if (--self->iReferenceCount == 0) + { + Dll::FreeTls(); + delete self; + } + } + +CPosControllerManager::CPosControllerManager() : + iReferenceCount(1), + iPositionerControllerMap(THashFunction32(&HashFunc), TIdentityRelation(&IdentityFunc)) + { + iLastFixIsPartial = EFalse; + } + +void CPosControllerManager::ConstructL() + { + iTrp = RepositoryTrpValueL(); + } + +/** + * Private destructor so users cannot directly delete this instance. + * They must call ReleaseInstance() + */ +CPosControllerManager::~CPosControllerManager() + { + iPositionerControllerMap.Close(); + if (iTrpController && iTrp) + { + delete iTrpController; + } + } + +/** + * Check in central repository if time relative playback (TRP) in on. + * @return ETrue if TRP is on, EFalse if it's off. + */ +TBool CPosControllerManager::RepositoryTrpValueL() + { + TInt val = 0; + CRepository* repository = CRepository::NewLC(KCRUidSimulationPSY); + User::LeaveIfError( repository->Get(KCRKeySimPSYCommonDataSet, val) ); + CleanupStack::PopAndDestroy(repository); + return static_cast(val); + } + +CPosControllerBase& CPosControllerManager::ControllerL( + const CPosSimulationPositioner& aSimPos) + { + CPosControllerBase* p = NULL; + if(!iTrp) + { + p = iPositionerControllerMap.Find(aSimPos); + } + else + { + p = iTrpController; + } + //if there is no controller associated with give positioner + //just create new one + if(!p) + { + p = CreateControllerL(aSimPos); + //in Time Relative Playback we should have only one controller + //in old mode we need to create each time new one. + if (iTrp) + { + iTrpController = p; + } + } + return *p; + } + +/** + * Create controller and pairs it with given CPosSimulationPositioner + * Controller type is determined by filename given in central repository. + * @param aSimPos Pointer to positioner that will be connecter with new controller + */ +CPosControllerBase* CPosControllerManager::CreateControllerL(const CPosSimulationPositioner& aSimPos) + { + CPosControllerBase* retController = NULL; + //getting file name from repository + TFileName fileName; + CRepository* repository = CRepository::NewLC(KCRUidSimulationPSY); + User::LeaveIfError(repository->Get(KCRKeySimPSYSimulationFile, fileName)); + CleanupStack::PopAndDestroy(repository); + + fileName.LowerCase(); + TParsePtrC fileNamePtr(fileName); + + //based on file extension creating correct type controller + TInt err = KErrNone; + if (fileNamePtr.Ext().Compare(KPosNMEAFileExtension) == 0) + { + TRAP(err, retController = + CPosNmeaController::NewL(fileName, iTrp)); + } + else if (fileNamePtr.Ext().Compare(KPosSimulationFileExtension) == 0) + { + TRAP(err, retController = + CPosDataSimController::NewL(fileName, iTrp)); + } + else if (fileName.Length() == 0) + { + // No file selected so use the default.nme file from + // \resource directory + TFileName DllName; + TParse nmeFileName; +#ifndef SIMPSYTEST + Dll::FileName(DllName); +#else + _LIT(KTestPathTxt, "Z:\\resource\\"); + DllName.Copy(KTestPathTxt); +#endif + + nmeFileName.Set(KDefaultNmeFileName, &DllName, NULL); + + TRAP(err, retController = + CPosNmeaController::NewL(nmeFileName.FullName(), iTrp)); + if (err == KErrPathNotFound || err == KErrNotFound + || err == KErrCorrupt) + { + TRAP(err, retController = CPosFixedDataController::NewL()); + } + } + else + { + err = KErrNotSupported; + } + User::LeaveIfError(err); + //after valid controller creation adding it to map of positioners + //and controllers to be able then properly delete it when it will be unneeded + if(!iTrp) + { + iPositionerControllerMap.InsertL(&aSimPos, retController); + } + return retController; + } + +TPositionInfo& CPosControllerManager::GetLastFix() + { + return iLastFix; + } + +void CPosControllerManager::SetLastFix(TPositionInfo& aPosInfo) + { + iLastFix = aPosInfo; + } + +TBool CPosControllerManager::GetLastFixIsPartial() + { + return iLastFixIsPartial; + } + +void CPosControllerManager::SetLastFixIsPartial(TBool aPartial) + { + iLastFixIsPartial = aPartial; + }