datasourcemodules/simulationpositioningmodule/src/EPos_CPosSimulationPositioner.cpp
changeset 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datasourcemodules/simulationpositioningmodule/src/EPos_CPosSimulationPositioner.cpp	Tue Feb 02 01:50:39 2010 +0200
@@ -0,0 +1,271 @@
+// 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 <lbs/epos_mpositionerstatus.h>
+#include <lbssatellite.h>
+#include "EPos_CPosSimulationPositioner.h"
+#include "epossimulationpsy.hrh"
+#include "EPos_CPosControllerManager.h"
+#include "EPos_CPosControllerBase.h"
+#include <e32debug.h>
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CPosSimulationPositioner::CPosSimulationPositioner() 
+    {
+	   
+    }
+
+// EPOC default constructor can leave.
+void CPosSimulationPositioner::ConstructL(
+    TAny* aConstructionParameters)
+    {
+    BaseConstructL(aConstructionParameters);
+    
+    iControllerManager = CPosControllerManager::InstanceL();
+
+	TRAPD( err, iController = &iControllerManager->ControllerL(*this) );
+
+    // Check if configuration file was not found, then report error
+    if (err == KErrPathNotFound || err == KErrNotFound ||
+        err == KErrCorrupt || err == KErrNotSupported)
+        {
+        ReportStatus(TPositionModuleStatus::EDeviceError);
+        }
+    User::LeaveIfError(err);
+
+    // Device ready to retrieve position.
+    ReportStatus(TPositionModuleStatus::EDeviceReady,
+        TPositionModuleStatus::EDataQualityNormal);
+    }
+
+// Two-phased constructor.
+CPosSimulationPositioner* CPosSimulationPositioner::NewL(
+    TAny* aConstructionParameters)
+    {
+    CPosSimulationPositioner* self =
+        new (ELeave) CPosSimulationPositioner();
+    CleanupStack::PushL(self);
+    self->ConstructL(aConstructionParameters);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// Destructor
+CPosSimulationPositioner::~CPosSimulationPositioner()
+    {
+    ReportStatus(TPositionModuleStatus::EDeviceInactive,
+        TPositionModuleStatus::EDataQualityUnknown);
+    iControllerManager->ReleaseInstance(*this);
+    }
+
+// ----------------------------------------------------------------------------
+// CPosSimulationPositioner::CompleteRequest
+//
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CPosSimulationPositioner::CompleteRequest(
+    TRequestStatus& aStatus,
+    TInt aErrorCode)
+    {
+    // If a fix was obtained, save it
+    if (aErrorCode >= 0 && iPosInfo)
+    	{
+    	//ASSERT(iPosInfo);
+	    ASSERT(iPosInfo->PositionClassType() & EPositionInfoClass);
+	    iControllerManager->SetLastFix( *static_cast<TPositionInfo*>(iPosInfo) );
+	    iControllerManager->SetLastFixIsPartial( aErrorCode == KPositionPartialUpdate );
+    	}
+    
+    TRequestStatus* status = &aStatus;
+    User::RequestComplete(status, aErrorCode);
+    }
+
+// ----------------------------------------------------------------------------
+// CPosSimulationPositioner::ReportStatus
+//
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CPosSimulationPositioner::ReportStatus(
+    TInt aDeviceStatus,
+    TInt aDataQualityStatus)
+    {
+    if (aDeviceStatus != KErrNotFound)
+        {
+        SetDeviceStatus(aDeviceStatus);
+        }
+    if (aDataQualityStatus != KErrNotFound)
+        {
+        SetDataQualityStatus(aDataQualityStatus);
+        }
+
+    MPositionerStatus* reportTo = PositionerStatus();
+    if (reportTo)
+        {
+        reportTo->ReportStatus(iModuleStatus);
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CPosSimulationPositioner::PartialUpdateAllowed
+//
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+TBool CPosSimulationPositioner::PartialUpdateAllowed() const
+    {
+    return IsPartialUpdateAllowed();
+    }
+
+// ----------------------------------------------------------------------------
+// CPosSimulationPositioner::ClearAndSetDefaultPositionData
+//
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CPosSimulationPositioner::ClearAndSetDefaultPositionData(
+    TPositionInfoBase& aPosInfo)
+    {
+    if (aPosInfo.PositionClassType() & EPositionGenericInfoClass)
+        {
+        (void) new(&aPosInfo) TPositionInfo;
+        HPositionGenericInfo& genInfo =
+            static_cast<HPositionGenericInfo&> (aPosInfo);
+        genInfo.ClearPositionData();
+        }
+    else if (aPosInfo.PositionClassType() & EPositionSatelliteInfoClass)
+        {
+        (void) new(&aPosInfo) TPositionSatelliteInfo;
+        }
+    else if (aPosInfo.PositionClassType() & EPositionCourseInfoClass)
+        {
+        (void) new(&aPosInfo) TPositionCourseInfo;
+        }
+    else // TPositionInfo
+        {
+        (void) new(&aPosInfo) TPositionInfo;
+        }
+
+    TUid implUid = { KPosSimulationPsyImplUid };
+    aPosInfo.SetModuleId(implUid);
+    aPosInfo.SetUpdateType(EPositionUpdateGeneral);
+    }
+
+// ----------------------------------------------------------------------------
+// CPosSimulationPositioner::CanUseLastFix
+// ----------------------------------------------------------------------------
+//
+TBool CPosSimulationPositioner::CanUseLastFix() const
+	{
+	TBool ret(EFalse);
+    TTime maxAge(0);
+    GetMaxAge(maxAge);
+        
+    // If client has set a maximum update age
+    if (maxAge.Int64() > 0)
+    	{
+	    TPosition pos;
+	    iControllerManager->GetLastFix().GetPosition(pos);
+	    
+	    // The fix is new enough
+	    // and the fix is either complete or the client accepts partial fixes
+	    ret = (pos.Time() >= maxAge
+	    		&& (!iControllerManager->GetLastFixIsPartial() || IsPartialUpdateAllowed()));
+    	}
+    if(ret)
+    	{
+    	RDebug::Print(_L("CanUseLastFix TRUE"));
+    	}
+    return ret;
+	}
+
+// ----------------------------------------------------------------------------
+// CPosSimulationPositioner::NotifyPositionUpdate
+//
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CPosSimulationPositioner::NotifyPositionUpdate(
+    TPositionInfoBase& aPosInfo,
+    TRequestStatus& aStatus)
+    {
+    ClearAndSetDefaultPositionData(aPosInfo);
+    
+    // Use the last fix obtained if possible, otherwise get a new fix
+    if (CanUseLastFix())
+    	{
+    	ASSERT(aPosInfo.PositionClassType() & EPositionInfoClass);
+    	TPositionInfo& pos = *static_cast<TPositionInfo*>(&aPosInfo); 
+    	pos = iControllerManager->GetLastFix();
+	    iPosInfo = NULL;
+	    // Complete the request with the correct status
+	    TInt status(KErrNone);
+	    if (iControllerManager->GetLastFixIsPartial())
+	    	{
+	    	status = KPositionPartialUpdate;
+	    	}
+	    CompleteRequest(aStatus, status);
+    	}
+    else
+    	{
+    	iPosInfo = &aPosInfo;
+	    iController->NotifyPositionUpdate(aPosInfo, aStatus, *this);
+	    }
+    }
+
+// ----------------------------------------------------------------------------
+// CPosSimulationPositioner::CancelNotifyPositionUpdate
+//
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CPosSimulationPositioner::CancelNotifyPositionUpdate()
+    {
+    iController->CancelNotifyPositionUpdate(*this);
+    }
+
+// ----------------------------------------------------------------------------
+// CPosSimulationPositioner::SetDeviceStatus
+//
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CPosSimulationPositioner::SetDeviceStatus(
+    TPositionModuleStatus::TDeviceStatus aStatus)
+    {
+    iModuleStatus.SetDeviceStatus(aStatus);
+    }
+
+// ----------------------------------------------------------------------------
+// CPosSimulationPositioner::SetDataQualityStatus
+//
+// (other items were commented in a header).
+// ----------------------------------------------------------------------------
+//
+void CPosSimulationPositioner::SetDataQualityStatus(
+    TPositionModuleStatus::TDataQualityStatus aStatus)
+    {
+    iModuleStatus.SetDataQualityStatus(aStatus);
+    }
+
+//  End of File