locationmgmt/agpslocationmgr/inc/lbsmanagermainlogic.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:50:39 +0200
changeset 0 9cfd9a3ee49c
permissions -rw-r--r--
Revision: 201002 Kit: 201005

// 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