locationmgmt/agpslocationmgr/inc/lbsmanagermainlogic.h
changeset 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/locationmgmt/agpslocationmgr/inc/lbsmanagermainlogic.h	Tue Feb 02 01:50:39 2010 +0200
@@ -0,0 +1,230 @@
+// 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 "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:
+// Definition of main logoc of agps manager
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#ifndef MAINLOGIC_H
+#define MAINLOGIC_H
+
+#include <e32base.h>
+#include <lbs.h>
+#include <lbs/lbsextendedsatellite.h>
+#include <lbs/lbsassistancedatabase.h>
+#include <lbs/lbslocdatasourcegpsbase.h>
+#include <lbs/epos_intgpshwstatus.h>
+
+#include "LbsInternalInterface.h"
+#include "lbscommoninternaldatatypes.h"
+#include "lbsrootapi.h"
+
+#include "lbsprocesssupervisor.h"
+#include "lbstimer.h"
+#include "lbslocationrequesthandler.h"
+#include "lbsassistancedatacacheapi.h"
+#include "lbsnetworkgatewayhandler.h"
+#include "cquietus.h"
+#include "lbsautoclockadjust.h"
+#include "lbsearlycompletionupdatehandler.h"
+#include "LbsLogger.h"
+#include "lbsnetregstatusint.h"
+#if defined(_DEBUG)
+#include "LbsOomListener.h"
+#endif
+
+class CLbsAdmin;
+
+
+const TPositionModuleId KSirfModuleId= {0x10282249}; // Ecom plugin implementation Id
+
+
+//************************************************************************************************************
+//	CManagerMainLogic
+//************************************************************************************************************
+class CManagerMainLogic :	public CBase,
+							public MLbsLocationSourceGpsObserver,
+							public MLbsCallbackTimerObserver,
+							public MLocationRequestHandlerObserver,
+							public MNetworkGatewayHandlerObserver,
+							public MLbsProcessCloseDown,
+							public MLbsEarlyCompletionUpdateObserver
+	{
+public:
+	static CManagerMainLogic* NewL();
+	~CManagerMainLogic();
+public:
+
+	enum TLocReqStatus
+		{
+		EReqNone 			 = 0,
+		EReqReceived 		 = 1,
+		EReqSessionStarted 	 = 2,
+		EReqReceivedDuringSession = 3,
+		EReqSessionCompleted = 4
+		};
+
+	class TSessionClosureData
+		{
+	public:
+		TInt iLastStatus;
+		TPositionExtendedSatelliteInfo iLastPosInfo;
+		TTime iLastTargetTime;
+		TBool iNotify;
+		};
+
+public:
+	// from MLbsLocationSourceGpsObserver
+	TVersion Version();
+	void UpdateLocation(TInt aStatus, const TPositionInfoBase* aPosition[], TInt aNumItems, const TTime& aTargetTime);
+	void UpdateDeviceStatus(TPositionModuleStatus::TDeviceStatus aDeviceStatus);
+	void UpdateDataQualityStatus(TPositionModuleStatus::TDataQualityStatus aDataQuality);
+	TInt GetAssistanceDataItem(TLbsAssistanceDataItem aItem, RDataReaderRootBase& aDataRoot, TTime& aTimeStamp);
+	TInt GetAssistanceDataItemTimeStamp(TLbsAssistanceDataItem aItem, TTime& aTimeStamp);
+	void RequestAssistanceData(TLbsAsistanceDataGroup aDataItemMask);
+	void Shutdown();
+
+	void NotifyServiceToClose(TRequestStatus* aStatus);
+	
+	// from MLocationRequestHandlerObserver
+	void OnLocationRequestStateChanged(const RLbsPositionUpdateRequests::TChannelIdentifer& aChannel,const TRequestStateChangeReason& aReason);
+	void OnSystemStatusAdvice(const RLbsPositionUpdateRequests::TChannelIdentifer& aChannel, TBool aTracking);
+	void OnPowerModeAdvice(const RLbsPositionUpdateRequests::TChannelIdentifer& aChannel, CLbsLocationSourceGpsBase::TPowerMode& aPowerMode);
+	// from MNetworkGatewayHandlerObserver
+	void OnAssistanceDataResponse(TInt aError, TLbsAsistanceDataGroup aMask);
+    void OnSessionComplete(TInt aReason, const TLbsNetSessionIdInt& aSessionId);
+	// from MLbsCloseDownObserver
+	void OnProcessCloseDown();
+	
+	// from MLbsCallbackTimerObserver
+	virtual void OnTimerEventL(TInt aTimerId);
+	virtual TInt OnTimerError(TInt aTimerId, TInt aError);
+	
+	// from MLbsEarlyCompletionUpdateObserver
+	virtual void EarlyCompletionUpdate(TPositionInfo& aEarlyCompletionUpdate, TTime& aTargetTime, TTime& aActualTime);
+
+
+private:
+
+	CManagerMainLogic();
+	void ConstructL();
+	void CombineLocationRequests(const TUid& aOriginatingChannel, const TRequestStateChangeReason& aOriginatorReason = EReasonNone);
+	void ConfigureGpsMode(const TUid& aChannelId, const TRequestStateChangeReason& aReason);
+
+	void GetTimeAndQuality(const CLocationRequestHandler& aRequestHandler, TTime& aStartTime, TLbsLocRequestQualityInt& aQuality);
+	TPositionModuleInfo::TTechnologyType GetTechnologyTypeFromNrhRequest(const TInt& aIndex);
+	TPositionModuleInfo::TTechnologyType GetTechnologyTypeFromLsRequest(const TInt& aIndex);
+
+	void RestartTimerIfTracking();
+	void SendSystemStatusAdvice(TBool aTracking);
+	void GetFinalNetPositionLagFromAdminProfileL();	
+	void SetGpsOptions(const TPositionModuleInfo::TTechnologyType aNewPositioningMethod);
+	TBool IsUpdateAsExpected(const TPositionInfoBase* aPosInfoArray[],const TInt& aNumItems, TInt& aPositionCalculationIndex, TInt& aMeasurementIndex);
+	void GetGpsUpdateIndexes(const TPositionInfoBase* aPosInfoArray[], const TInt& aNumItems, TInt& aPositionCalculationIndex, TInt& aMeasurementIndex);
+	void PublishDummyPosition(TInt aReason);
+	void PublishDummyAssistDataEvent(TInt aReason);
+	void ConvertToTLbsLocRequestQuality(const TLbsLocRequestQualityInt& aSource, TLbsLocRequestQuality& aDest) const;
+	void GetTaGpsModeFromAdmin(CLbsAdmin::TGpsMode& aGpsMode);
+	TPositionModuleInfo::TTechnologyType CalculatePositioningMethod();
+	TPositionModuleInfo::TTechnologyType LookUpPositioningMethodInCombinationTables();
+
+	void CalculateActiveLSMode(const TUid& aChannelId, const TRequestStateChangeReason& aReason, TBool& aForceSelfLocate);
+	
+private:
+	TBool iClosingDown;
+	CLbsCloseDownRequestDetector*	iCloseDownRequestDetector;
+	CQuietus*					iQuietus;
+
+	CLbsLocationSourceGpsBase*	iLocationSource;
+	CNetworkGatewayHandler*		iNetworkGatewayHandler;
+	CLocationRequestHandler*	iNRHLocationRequestHandler;
+	CLocationRequestHandler*	iLocSvrLocationRequestHandler;
+	CEarlyCompletionUpdateHandler* iEarlyCompletionUpdateHandler;
+	
+	CLbsCallbackTimer*			iTimer;
+
+	
+	CAutoClockAdjust*			iAutoClockAdjust;
+	RLbsPositionUpdates 		iPositionUpdates;// For publishing position updates for Loc Server and NRH.
+	RLbsGpsMeasurementUpdates	iMeasurementUpdates;
+	RLbsModuleStatus			iModuleStatus;
+	
+	TLocReqStatus				iLSReqState;
+	TBool       				iIsNrhCancelDue; // A NRH request must be cancelled even if it has timed out
+	TLbsNetSessionIdInt			iSessionId;
+	TBool						iLastTrackingFlagSentToNG;
+	TBool						iTrackingStateUnknown;
+	// LBSLogging
+	RLbsLogger					iLogger;
+	TLbsAsistanceDataGroup		iLogAssitaceDataGroup;
+
+	
+	// Position update cache (for republishing in some scenarios only)
+	TSessionClosureData         iSessionClosureData;
+	
+	TTimeIntervalMicroSeconds 	iFinalNetPositionLag;	
+	CLbsAdmin*                  iAdmin;
+	
+	//Stores the last power advice recieved
+	CLbsLocationSourceGpsBase::TPowerMode iPowerModeLS;
+	CLbsLocationSourceGpsBase::TPowerMode iPowerModeNRH;
+
+	// the current behaviour mode of Lbs
+	CLbsAdmin::TLbsBehaviourMode iLbsBehaviourMode;
+	
+	// Capabilities of underlying GPS hardware regarding
+	// positioning methods it supports
+	TPositionModuleInfoExtended::TDeviceGpsModeCapabilities iCapabilities;
+	
+	RLbsNetworkRegistrationStatus iNetRegStatus;
+	
+	// Positioning method used last to configure GPS options
+	TPositionModuleInfo::TTechnologyType iCurrentPositioningMethod;
+	
+	// Positioning method last used to configure the GPS module
+	// options due to a Location Request from the Location server.
+	// It is set to KLbsMethodNone when the Location server reques goes inactive.
+	TPositionModuleInfo::TTechnologyType iActiveLSMode;
+	
+	// Positioning method last sent to the Network Gateway in
+	// a SelfLocateRequest. It is set to KLbsMethodNone
+	// when self location session terminates.
+	TPositionModuleInfo::TTechnologyType iCurrentNetworkMode;
+
+    #if defined(_DEBUG)
+		CLbsOomListener*	iOomListener;
+    #endif	
+	
+	// Flag which gets set when in Prefer Terminal Assisted and there is 
+	// an error from the network. This flag is needed because the AGPS manager 
+	// always ensures positions/measurements are returned correctly. So it 
+	// would typically wait for measurements when in PTA. But in the case 
+	// of a fatal network error the module can fall-back to Autonomous. In that 
+	// case the PTA mode is set and positions are returned. So we need this 
+	// flag to know when we can accept positions in PTA.
+	TBool iFallbackFromPTAToAutonomousPossible;
+	// Flag that specifies if currently gps timing of cell frames is requested 
+	TBool iCurrentGpsTimingOfCellFramesRequested;
+	
+	CPosIntGpsHwStatus* 	iPosIntGpsHwStatus;
+
+	};
+
+
+#endif //MAINLOGIC_H
+