locationrequestmgmt/networkrequesthandler/inc/privacyandlocationrequesthandler.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:38:06 +0300
branchRCL_3
changeset 54 0c2046328c85
parent 0 9cfd9a3ee49c
child 49 5f20f71a57a3
child 55 c92d4f3c47c5
permissions -rw-r--r--
Revision: 201027 Kit: 201035

// 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:
// CPrivacyAndLocationHandler.h
// 
//

/**
 @file
 @internalComponent
 @released
*/

#ifndef PRIVACYANDLOCATIONHANDLER_H 
#define PRIVACYANDLOCATIONHANDLER_H

#include <e32property.h>
#include "nrhpanic.h"
#include "ngmessageswitch.h"
#include "agpsinterfacehandler.h"

// Forward declarations
class TPrivLocCommonParams;
class CLbsPrivLocStateBase;
class CLbsPrivLocFsm;

// Panic Category
_LIT(KPrivLocFault,"Lbs-Nrh PrivLoc");

/**
 * 
 * Creates each of the states and sets the curent state to be idle.
 * Passes on any event to the current state, and handles requests
 * from states to change the current state.
 */	
class CPrivacyAndLocationHandler : public CBase, 
								   public MNGMessageSwitchObserver,
								   public MPrivacyHandlerObserver,
								   public MAgpsInterfaceHandlerObserver
	{
public:
	static CPrivacyAndLocationHandler* NewL(CNGMessageSwitch& aMessageSwitch,
											CLbsAdmin& aLbsAdmin,
											RLbsNetworkRegistrationStatus& aNetRegStatus);
	~CPrivacyAndLocationHandler();
	
protected:
	void ConstructL(CLbsAdmin* aLbsAdmin);
	CPrivacyAndLocationHandler(CNGMessageSwitch& aMessageSwitch, RLbsNetworkRegistrationStatus& aNetRegStatus);
	
	void ReadProtocolModuleAdminSetting();
	
	CLbsPrivLocFsm* LookupFsm(const TLbsNetSessionIdInt& aSessionId);
	CLbsPrivLocFsm* GetNewFsm(const TLbsNetSessionIdInt& aSessionId,
			TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType,
			TBool aEmergency);

protected: // From MNGMessageSwitchObserver. Delegated to current state
	void OnMTLRRequest(const TLbsNetSessionIdInt& aSessionId,
					   TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType, 
					   TBool aIsEmergency,
					   const TLbsExternalRequestInfo& aExternalRequestInfo,
					   const TLbsNetPosRequestPrivacyInt& aNetPosRequestPrivacy);
	
	void OnSessionComplete(const TLbsNetSessionIdInt& aSessionId, TInt aReason);

	void OnNetLocRequest(const TLbsNetSessionIdInt& aSessionId, 
						 const TLbsNetPosRequestMethodInt& aPosRequestMethod,
						 TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType, 
						 TBool aIsEmergency,
						 const TLbsNetPosRequestQualityInt& aQuality);

	void OnNetLocResponse(const TLbsNetSessionIdInt&,
							 const TLbsNetPosRequestQualityInt&){}
	
	void OnNetLocReferenceUpdate(const TLbsNetSessionIdInt& aSessionId, 
								 const TPositionInfoBase& aPosInfo);
	
	void OnNetLocFinalUpdate(const TLbsNetSessionIdInt& aSessionId, 
									 const TPositionInfoBase& aPosInfo);

public: // From MPrivacyHandlerObserver
	void SetServerObserver(MLbsSessionObserver* aNrhPrivacyServer);
    void OnRespondNetworkLocationRequest(const TLbsNetSessionIdInt& aRequestId, 
                            TLbsNetworkEnumInt::TLbsPrivacyResponseInt aRequestResult,
                            TInt aResponseReason);
    void OnCancelNetworkLocationRequest(const TLbsNetSessionIdInt& aRequestId);

public:
	void OnAgpsPositionUpdate(
		TInt aReason,
		const TPositionExtendedSatelliteInfo& aPosInfo,
		const TTime& aTimeStamp);

	void OnAgpsMeasurementUpdate(
		TInt aReason,
		const TPositionGpsMeasurementInfo& aPosInfo,
		const TTime& aTimeStamp);

public:
	CAgpsInterfaceHandler* AgpsHandler();
	MX3pStatusHandler& X3pStatusHandler();

private: // Allow access for friend classes (the states, the NRH, and the FSMs) 
friend class CLbsPrivLocStateBase;
friend class CLbsNetworkRequestHandler;
friend class CLbsPrivLocFsm;
	CPrivacyHandler* PrivacyHandler();
	CLbsAdmin* LbsAdmin();	
	CNGMessageSwitch* MessageSwitch();
	TPositionModuleInfoExtended::TDeviceGpsModeCapabilities DeviceGpsModeCaps();
	CLbsAdmin::TLbsBehaviourMode BehaviourMode();
	RLbsNetworkRegistrationStatus& NetworkRegistrationStatus();
	void IncrementPositioningStatus();
	void DecrementPositioningStatus();

private:
	static TBool IsSessionIdEqual(
			const TLbsNetSessionIdInt* aSessionId,
			const CLbsPrivLocFsm& aFsm);
	static TBool IsSessionTypeEqual(
			const TLbsNetworkEnumInt::TLbsNetProtocolServiceInt* aSessionType,
			const CLbsPrivLocFsm& aFsm);
	TBool IsSpecialFeatureIntermediateFutileUpdateOn();
private:
	CPrivacyHandler* iPrivacyHandler;
	CLbsAdmin* iLbsAdmin;
	RLbsNetworkRegistrationStatus& iNetRegStatus;
	CNGMessageSwitch* iMessageSwitch;

	CAgpsInterfaceHandler* iAgpsInterface;
	
	
	TUid iProtocolModuleUid;
	
	// state machine used for progessing a emergency (MTLR or NI) - so as to avoid OOM
	CLbsPrivLocFsm* iEmergencyFsm;
	
	// Array of state machines used for progressing sessions of all types (MTLR,MOLR and NI, including emergencies)
	RPointerArray<CLbsPrivLocFsm> iFsmArray;
	
	CLbsAdmin::TLbsBehaviourMode iLbsBehaviourMode;	
	TPositionModuleInfoExtended::TDeviceGpsModeCapabilities iDeviceGpsModeCaps;	

	// Is the intermediate futile update feature switched on?
	TBool iSpecialFeatureIntermediateFutileUpdate;
	
	// this is the maximum number of non-emergency sessions allowed
	// at any one time
	TUint iMaxNumSessions;
	
	// this is the current number of active non-emergency sessions 
	TUint iNumActiveSessions;

	CLbsPrivLocFsm* iMolRFsm;
	CLbsPrivLocFsm* iX3pFsm;

	// ETrue if location management is supported
	TBool iLocationManagementSupported;
	
    // Category of the Positioning Status P&S Keys
	TUid iPosStatusCategory;
	};


//------------------------------------------------------------------------------
//
// Transport classes used to pass data across state changes
//
//------------------------------------------------------------------------------
/**
 * TPrivLocCommonParams defines the base class for the data passed between
 * states
 */
class TPrivLocCommonParams
	{
protected:
enum TType
    {
    ECommon,
    EPrivacyResponse,
    ELocationRequest,
    ELocationUpdate
    };

public:
	TPrivLocCommonParams();
	TPrivLocCommonParams(TLbsNetSessionIdInt aSessionId);

public:
	static const TPrivLocCommonParams& Cast(const TPrivLocCommonParams& aParamsBase)
		{
		if(aParamsBase.Type() != ECommon)
			{
			__ASSERT_DEBUG(EFalse, Panic(ENrhPanicBadParamType));
			}
		return static_cast<const TPrivLocCommonParams&>(aParamsBase);
		}

public:
	virtual TType Type() const
		{
		return(ECommon);
		};
		
public:
	TLbsNetSessionIdInt 			iSessionId;
	};

/*
 * TPrivLocWaitPrivResponseParams contains the data required on entry
 * to state EStateWaitPrivacyResponse
 */
class TPrivLocWaitPrivResponseParams : public TPrivLocCommonParams
	{
public:
	TPrivLocWaitPrivResponseParams();
	TPrivLocWaitPrivResponseParams(const TLbsNetSessionIdInt& aSessionId,
								   const TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType,
								   const TLbsExternalRequestInfo& aExternalRequestInfo,
								   const TLbsNetPosRequestPrivacyInt& aNetPosRequestPrivacy,
								   TBool aIsEmergency);

	static const TPrivLocWaitPrivResponseParams& Cast(const TPrivLocCommonParams& aParamsBase)
		{
		if(aParamsBase.Type() != EPrivacyResponse)
			{
			__ASSERT_DEBUG(EFalse, Panic(ENrhPanicBadParamType));
						
			}
		return static_cast<const TPrivLocWaitPrivResponseParams&>(aParamsBase);
		}
public: // From TPrivLocCommonParams.
	TType Type() const
		{
		return EPrivacyResponse; 
		}

public:
	TLbsExternalRequestInfo2	iExternalRequestInfo;
	TLbsNetPosRequestPrivacyInt	iNetPosRequestPrivacy;
	TBool						iIsEmergency;
	TLbsNetworkEnumInt::TLbsNetProtocolServiceInt iSessionType;
	};

class TPrivLocWaitLocationRequestParams : public TPrivLocCommonParams
	{
public:
	TPrivLocWaitLocationRequestParams();
	TPrivLocWaitLocationRequestParams(const TLbsNetSessionIdInt& aSessionId, 
									  TBool aIsEmergency, 
									  TBool aReqCancelled, 
									  TInt aPreviousStateExitInfo = KErrNone);

	static const TPrivLocWaitLocationRequestParams& Cast(const TPrivLocCommonParams& aParamsBase)
		{
		if(aParamsBase.Type() != ELocationRequest)
			{
			__ASSERT_DEBUG(EFalse, Panic(ENrhPanicBadParamType));
						
			}
		return static_cast<const TPrivLocWaitLocationRequestParams&>(aParamsBase);
		}
public: // From TPrivLocCommonParams.
	TType Type() const
		{
		return ELocationRequest; 
		}

public:
	TBool	iIsEmergency;
	TBool   iReqCancelled;
	TInt    iPreviousStateExitInfo; // e. g. KPositionQualityLoss
	};

class TPrivLocWaitLocationUpdateParams : public TPrivLocCommonParams
	{
public:
	TPrivLocWaitLocationUpdateParams();
	TPrivLocWaitLocationUpdateParams(const TLbsNetSessionIdInt& aSessionId,
									 const TLbsNetPosRequestMethodInt& aPosRequestMethod,
									 TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType,
									 TBool aIsEmergency,
									 const TLbsNetPosRequestQualityInt& aQuality);

	static const TPrivLocWaitLocationUpdateParams& Cast(const TPrivLocCommonParams& aParamsBase)
		{
		if(aParamsBase.Type() != ELocationUpdate)
			{
			__ASSERT_DEBUG(EFalse, Panic(ENrhPanicBadParamType));
						
			}
		return static_cast<const TPrivLocWaitLocationUpdateParams&>(aParamsBase);
		}
public: // From TPrivLocCommonParams.
	TType Type() const
		{
		return ELocationUpdate; 
		}

public:
	TLbsNetworkEnumInt::TLbsNetProtocolServiceInt iSessionType;
	TBool						iIsEmergency;
	TLbsNetPosRequestQualityInt	iQuality;
	TLbsNetPosRequestMethodInt	iPosRequestMethod;
	};

//------------------------------------------------------------------------------
//
// End transport classes
//
//------------------------------------------------------------------------------


class TPrivLocStateExitData
	{
public:
enum TPrivLocStateExitReason
	{
	EExitReasonNone,
	// Normal exit from Idle state when MTLR session is started
	EExitPrivacyRequestReceived,
	// normal exit from wait for location request or Idle (for non-MTLR)
	EExitLocReqReceived, 
	// exit from wait for location update when position reeceived
	EExitLocFixReceived, 
	// exit from wait for location update when measurement data received
	EExitLocMeasurementResultsReceived, 
	// normal exit from wait for privacy response
	EExitPrivacyResponseReceived, 
	// session could be completed, cancelled or overridden by a new one	
	EExitSessionComplete, 
	// Privacy Controller cancelled a session
	EExitCancelledByPrivacyController, 
	// Can't action a position update request
	EExitBadQualityProfile, 
	// Update not received 
	EExitTimedOut,
	// The location request was 'bad', for various reasons.
	EExitBadLocationRequest
	};
public:
	TPrivLocStateExitData(){}
	TPrivLocStateExitData(TPrivLocStateExitReason aExitReason, TInt aExitInfo)
		{
		SetExitData(aExitReason, aExitInfo);
		}
public:
	void SetExitData(TPrivLocStateExitReason aExitReason, TInt aExitInfo) 	
		{
		iExitReason = aExitReason;
		iExitInfo = aExitInfo;
		}
public:
	TPrivLocStateExitReason	iExitReason;
	TInt					iExitInfo; // e.g. KErrCancel
	};


/**
 * 
 * Base class for states, not intended for instantiation.
 * Defines functions common to all states
 */
 class CLbsPrivLocStateBase	:	public CBase 
	{

public:
	virtual void OnEntry(const TPrivLocCommonParams&);
	virtual TBool OnExit();

public:
	virtual void OnMTLRRequest(
		const TLbsNetSessionIdInt&,
		TLbsNetworkEnumInt::TLbsNetProtocolServiceInt,
		TBool,
		const TLbsExternalRequestInfo&,
		const TLbsNetPosRequestPrivacyInt&) {}
	
	virtual void OnSessionComplete(
		const TLbsNetSessionIdInt&, 
		TInt );

	virtual void OnNetLocRequest(
		const TLbsNetSessionIdInt&, 
		const TLbsNetPosRequestMethodInt&,
		TLbsNetworkEnumInt::TLbsNetProtocolServiceInt,
		TBool,
		const TLbsNetPosRequestQualityInt&) {}
		
	virtual void OnNetLocResponse(
		const TLbsNetSessionIdInt&,
		const TLbsNetPosRequestQualityInt&) {}
	
    virtual void OnRespondNetworkLocationRequest(
    	const TLbsNetSessionIdInt&, 
        TLbsNetworkEnumInt::TLbsPrivacyResponseInt,
        TInt /*aResponseReason*/) {}

    virtual void OnCancelNetworkLocationRequest(
    	const TLbsNetSessionIdInt&);
	
	virtual void OnNetLocReferenceUpdate(
		const TLbsNetSessionIdInt& aSessionId, 
		const TPositionInfoBase& aPosInfo);

	virtual void OnAgpsPositionUpdate(
		TInt /*aReason*/,
		const TPositionExtendedSatelliteInfo& /*aPosInfo*/,
		const TTime& /*aTimeStamp*/) {}

	virtual void OnAgpsMeasurementUpdate(
		TInt /*aReason*/,
		const TPositionGpsMeasurementInfo& /*aPosInfo*/,
		const TTime& /*aTimeStamp*/) {}

public:
	virtual void OnTimerEventL(TInt aTimerId);
    
protected:
	CLbsPrivLocStateBase(CLbsPrivLocFsm* aFsm);
	
protected: 
	void HandleLocRequest(const TLbsNetSessionIdInt& aSessionId, 
					const TLbsNetPosRequestMethodInt& aPosRequestMethod,
			 TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType,
							TBool aIsEmergency,
				const TLbsNetPosRequestQualityInt& aQuality);
	void HandleSessionCancel(const TLbsNetSessionIdInt& aSessionId,TInt aReason);
	void ReadNetworkInducedAdminSetting(CLbsAdmin::TExternalLocateService& aExternalLocateService);
	CPrivacyHandler* PrivacyHandler();
	CNGMessageSwitch* MessageSwitch();
	CLbsAdmin* LbsAdmin();
	CAgpsInterfaceHandler* AgpsInterface();
	RLbsNetworkRegistrationStatus& LbsNetworkRegistrationStatus();
	TPositionModuleInfoExtended::TDeviceGpsModeCapabilities DeviceGpsModeCaps();
	CLbsAdmin::TLbsBehaviourMode BehaviourMode();	
	void IncrementPositioningStatus();

protected:	
	CLbsPrivLocFsm*			iFsm;
	};

/**
 * Idle state.
 * Handles all events originating from the Network Gateway, but 
 * does nothing with any apart from MTLR (i.e. privacy) Request 
 * and Location Request
 * Exits to states:
 *		EStateWaitPrivacyResponse
 */
class CLbsPrivLocIdleState	:	public CLbsPrivLocStateBase

	{
public:
	static CLbsPrivLocIdleState* NewL(CLbsPrivLocFsm* aFsm);
	
public:
	void OnEntry(const TPrivLocCommonParams& aStateParams);
	TBool OnExit();

	void OnMTLRRequest(const TLbsNetSessionIdInt& aSessionId,
					   TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType, 
					   TBool aIsEmergency,
					   const TLbsExternalRequestInfo& aExternalRequestInfo,
					   const TLbsNetPosRequestPrivacyInt& aNetPosRequestPrivacy);
	
	void OnNetLocRequest(const TLbsNetSessionIdInt& aSessionId, 
						 const TLbsNetPosRequestMethodInt& aPosRequestMethod,
						 TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType, 
						 TBool aIsEmergency,
						 const TLbsNetPosRequestQualityInt& aQuality);
	
	void OnNetLocReferenceUpdate(
		const TLbsNetSessionIdInt& aSessionId, 
		const TPositionInfoBase& aPosInfo);

	
protected:
	CLbsPrivLocIdleState(CLbsPrivLocFsm* aFsm);
	};	

/**
 * Wait for Privacy Response state.
 * Expects an accept/reject response from the privacy handler which 
 * it passes on to the network gateway.
 * Also handles all events originating from the Network Gateway, which may 
 * teminate the current session.
 * Exits to states:
 */
class CLbsPrivLocWaitPrivRespState	:	public CLbsPrivLocStateBase 
	{
public:
	static CLbsPrivLocWaitPrivRespState* NewL(CLbsPrivLocFsm* aFsm);
	
public:
	void OnEntry(const TPrivLocCommonParams& aStateParams);
	TBool OnExit();

	void OnMTLRRequest(const TLbsNetSessionIdInt& aSessionId,
					   TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType, 
					   TBool aIsEmergency,
					   const TLbsExternalRequestInfo& aExternalRequestInfo,
					   const TLbsNetPosRequestPrivacyInt& aNetPosRequestPrivacy);
	
	void OnNetLocRequest(const TLbsNetSessionIdInt& aSessionId, 
						 const TLbsNetPosRequestMethodInt& aPosRequestMethod,
						 TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType, 
						 TBool aIsEmergency,
						 const TLbsNetPosRequestQualityInt& aQuality);

    void OnRespondNetworkLocationRequest(const TLbsNetSessionIdInt& aRequestId, 
                            TLbsNetworkEnumInt::TLbsPrivacyResponseInt aRequestResult,
                            TInt aResponseReason);

	void OnNetLocReferenceUpdate(
		const TLbsNetSessionIdInt& aSessionId, 
		const TPositionInfoBase& aPosInfo);
							                             
protected:
	CLbsPrivLocWaitPrivRespState(CLbsPrivLocFsm* aFsm);
	};	


/**
 * Wait for Location Request state.
 * Following a response from the privacy handler to accept a request, expects
 * a request for a position update.
 * Also handles all other events originating from the Network Gateway, 
 * which may terminate the current session.
 * Exits to states:
 */
class CLbsPrivLocWaitLocReqState	:	public CLbsPrivLocStateBase 
	{
public:
	static CLbsPrivLocWaitLocReqState* NewL(CLbsPrivLocFsm* aFsm);

protected:
	CLbsPrivLocWaitLocReqState(CLbsPrivLocFsm* aFsm);

public:
	void OnEntry(const TPrivLocCommonParams& aStateParams);
	TBool OnExit();

	void OnMTLRRequest(const TLbsNetSessionIdInt& aSessionId,
					   TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType, 
					   TBool aIsEmergency,
					   const TLbsExternalRequestInfo& aExternalRequestInfo,
					   const TLbsNetPosRequestPrivacyInt& aNetPosRequestPrivacy);
	
	void OnNetLocRequest(const TLbsNetSessionIdInt& aSessionId, 
						 const TLbsNetPosRequestMethodInt& aPosRequestMethod,
						 TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType, 
						 TBool aIsEmergency,
						 const TLbsNetPosRequestQualityInt& aQuality);
						 
	void OnCancelNetworkLocationRequest(const TLbsNetSessionIdInt& aSessionId);
	
	void OnSessionComplete(const TLbsNetSessionIdInt&, TInt );

	void OnNetLocReferenceUpdate(
		const TLbsNetSessionIdInt& aSessionId, 
		const TPositionInfoBase& aPosInfo);
	};	

/**
 * Wait for location update state.
 * Handles all events originating from the Network Gwateway, and also 
 * the update response timer and location updates received from the AGPS manager
 * Exits to states:
 */
class CLbsPrivLocWaitLocUpdateState	:	public CLbsPrivLocStateBase
	{
public:
	static CLbsPrivLocWaitLocUpdateState* NewL(CLbsPrivLocFsm* aFsm);
	~CLbsPrivLocWaitLocUpdateState();

protected:
	CLbsPrivLocWaitLocUpdateState(CLbsPrivLocFsm* aFsm);
	void ConstructL();

protected: // From MLbsPrivLocStateTransition
	void OnEntry(const TPrivLocCommonParams& aStateParams); // Need to request the update and start the timer
	TBool OnExit(); // Cancel any outstanding request and its timer

public:
	void OnMTLRRequest(const TLbsNetSessionIdInt& aSessionId,
					   TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType, 
					   TBool aIsEmergency,
					   const TLbsExternalRequestInfo& aExternalRequestInfo,
					   const TLbsNetPosRequestPrivacyInt& aNetPosRequestPrivacy);
					   
	void OnNetLocRequest(const TLbsNetSessionIdInt& aSessionId, 
						 const TLbsNetPosRequestMethodInt& aPosRequestMethod,
						 TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType, 
						 TBool aIsEmergency,
						 const TLbsNetPosRequestQualityInt& aQuality);

	void OnTimerEventL(TInt aTimerId);

	void OnAgpsPositionUpdate(
			TInt aReason,
			const TPositionExtendedSatelliteInfo& aPosInfo,
			const TTime& aTimeStamp);

	void OnAgpsMeasurementUpdate(
			TInt aReason,
			const TPositionGpsMeasurementInfo& aPosInfo,
			const TTime& aTimeStamp);
	
	void OnNetLocReferenceUpdate(
			const TLbsNetSessionIdInt& aSessionId, 
			const TPositionInfoBase& aPosInfo);

private:
	void SetExitState();
	TBool ReceivedFixIsAccurate();
	};	
	
	
/**
 * State machine
 */
class CLbsPrivLocFsm :	public CBase,
						public MNGMessageSwitchObserver,
						public MPrivacyHandlerObserver,
						public MLbsCallbackTimerObserver,
						public MAgpsInterfaceHandlerObserver
	{
public:

	enum TLocPrivacyHandlerState 
		{
		EStateIdle,
		EStateWaitPrivacyResponse,
		EStateWaitLocationRequest,
		EStateWaitLocationUpdate,
		ETotalStates,
		ENoState = ETotalStates
		};

	static CLbsPrivLocFsm* NewL(CPrivacyAndLocationHandler& aPrivLocHandler,
								const TLbsNetSessionIdInt& aSessionId);
	~CLbsPrivLocFsm();

	const TLbsNetSessionIdInt& SessionId() const;	
										
	TBool IsSpecialFeatureIntermediateFutileUpdateOn();
	
public: // From MLbsFsmObserver
	void ChangeState(TLocPrivacyHandlerState aNewStateId, 
						const TPrivLocCommonParams& aStateParams);		
	void ChangeState(TLocPrivacyHandlerState aNewStateId,
						const TLbsNetSessionIdInt& aSessionId);

protected:
	void ConstructL();
	CLbsPrivLocFsm(CPrivacyAndLocationHandler& aPrivLocHandler,
				   const TLbsNetSessionIdInt& aSessionId);

public: // From MNGMessageSwitchObserver. Delegated to current state
	void OnMTLRRequest(const TLbsNetSessionIdInt& aSessionId,
				   TLbsNetworkEnumInt::TLbsNetProtocolServiceInt  aSessionType, 
				   TBool aIsEmergency,
				   const TLbsExternalRequestInfo& aExternalRequestInfo,
				   const TLbsNetPosRequestPrivacyInt& aNetPosRequestPrivacy);

	void OnSessionComplete(const TLbsNetSessionIdInt& aSessionId, TInt aReason);

	void OnNetLocRequest(const TLbsNetSessionIdInt& aSessionId, 
					 const TLbsNetPosRequestMethodInt& aPosRequestMethod,
					 TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType, 
					 TBool aIsEmergency,
					 const TLbsNetPosRequestQualityInt& aQuality);
	void OnNetLocResponse(const TLbsNetSessionIdInt&,
						 const TLbsNetPosRequestQualityInt&){}
	
	void OnNetLocReferenceUpdate(const TLbsNetSessionIdInt& aSessionId, 
								 const TPositionInfoBase& aPosInfo);
	
	void OnNetLocFinalUpdate(const TLbsNetSessionIdInt& aSessionId, 
							 const TPositionInfoBase& aPosInfo);

public: // From MPrivacyHandlerObserver
	void SetServerObserver(MLbsSessionObserver* aNrhPrivacyServer);
	void OnRespondNetworkLocationRequest(const TLbsNetSessionIdInt& aRequestId, 
                        TLbsNetworkEnumInt::TLbsPrivacyResponseInt aRequestResult,
                        TInt aResponseReason);
	void OnCancelNetworkLocationRequest(const TLbsNetSessionIdInt& aRequestId);

public: // from MAgpsInterfaceHandlerObserver
	void OnAgpsPositionUpdate(
			TInt aReason,
			const TPositionExtendedSatelliteInfo& aPosInfo,
			const TTime& aTimeStamp);

	void OnAgpsMeasurementUpdate(
			TInt aReason,
			const TPositionGpsMeasurementInfo& aPosInfo,
			const TTime& aTimeStamp);

protected: // From MLbsCallbackTimerObserver
	/** Called when the timer expires */
	void OnTimerEventL(TInt aTimerId);
	/** Called if OnTimerEventL leaves */
	TInt OnTimerError(TInt aTimerId, TInt aError);

public:
	// These accessor functions can be used as 
	// both getters and setters.

	TBool& IsEmergency() 
		{ return iIsEmergency; }

	TBool& TapMode()
		{ return iTapMode; }

	TLbsNetworkEnumInt::TLbsNetProtocolServiceInt&  SessionType() 
		{ return iSessionType; }

	TPrivLocStateExitData& ExitData() { return iExitData; }

	TBool& RefPosProcessed() 
			{ return iRefPosProcessed; }
	
	TLbsNetSessionIdInt& NetSessionId()
			{ return iSessionId; }
	
	TLbsNetPosRequestQualityInt& NetRequestQuality()
		{ return iNetRequestQuality; }

	TBool& LocReqReceived()
		{ return iLocReqReceived; }
	
	TLbsNetworkEnumInt::TLbsPrivacyResponseInt& PrivacyResponse()
		{ return iPrivacyResponse; }

	TInt& PrivacyResponseReason()
		{ return iPrivacyResponseReason; }
	
	TLbsNetPosRequestMethodInt& PosRequestMethod()
		{ return iPosRequestMethod; }
	
	TBool& PrivacyRequestCancelled()
		{ return iReqCancelled; }
	
	TLbsNetPosRequestQualityInt& GpsRequestQuality()
		{ return iGpsRequestQuality; }
	
	TBool& LocationFixReceived()
		{ return iLocationFixReceived; }
	
	TTime& ActualTime()
		{ return iActualTime; }
	
	TPositionExtendedSatelliteInfo& GpsPosition()
		{ return iPosInfo; }
	
	TBool& MeasurementInfoReceived()
		{ return iMeasurementInfoReceived; }
	
	TInt& MeasurementInfoError()
		{ return iMeasurementInfoErr; }
	
	TPositionGpsMeasurementInfo& GpsMeasurementInfo()
		{ return iMeasurementResults; }
		
	TInt& PreviousStateExitInfo()
		{ return iPreviousStateExitInfo; }
	
	CLbsCallbackTimer& LocationUpdateTimer()
		{ return *iLocationUpdateTimer; }
	
	TLbsNetSessionIdInt& LastLocReqSessionId()
		{ return iLastLocReqSessionId; }
	
	TBool& WasPrivacyResponseReceivedStateExited() 
	    { return iWasPrivacyResponseReceivedStateExited; }
	
	TLbsExternalRequestInfo::TRequestType& ExternalRequestType()
	    { return iExternalRequestType; }
	
	TBool& WasPositioningStatusIncremented()
        { return iPositioningStatusIncremented; }
	   
	
private: // Allow access for friend classes (the states and the NRH) 
	friend class CLbsPrivLocStateBase;
	friend class CLbsNetworkRequestHandler;
	friend class CPrivacyAndLocationHandler;
	friend class CLbsPrivLocWaitLocUpdateState;
	CPrivacyAndLocationHandler& PrivLocHandler();
	
private:

	// The privacy and location handler
	CPrivacyAndLocationHandler& iPrivLocHandler;
	
	// The current Session ID being used by this FSM
	TLbsNetSessionIdInt iSessionId;

	// Is the current request an emergency request?
	TBool iIsEmergency;

	// Is the current session porcessing a Tap request?
	TBool iTapMode;
	
	// Service type of the current request.
	TLbsNetworkEnumInt::TLbsNetProtocolServiceInt  iSessionType;
	
	// Exit data from the current state.
	TPrivLocStateExitData iExitData;
	
	// Has a reference position been processed -by provacy framework?
	TBool iRefPosProcessed;
		
	// Quality/accuracy requirements for the location request.
	TLbsNetPosRequestQualityInt iNetRequestQuality;
	
	// Record if a location request has arrived while waiting for privacy response.
	TBool iLocReqReceived;
	
	// Response from a privacy request.
	TLbsNetworkEnumInt::TLbsPrivacyResponseInt iPrivacyResponse;
	
	// Reason for the privacy request response.
	TInt iPrivacyResponseReason;
	
	// The location method requested by the network.
	TLbsNetPosRequestMethodInt iPosRequestMethod;
	
	// Was the privacy request cancelled by the user?
	TBool iReqCancelled;
	
	// Request quality sent to agps manager.
	TLbsNetPosRequestQualityInt iGpsRequestQuality;
	
	// GPS position update has arrived?
	TBool iLocationFixReceived;
	
	// GPS position update timestamp.
	TTime iActualTime;
	
	// GPS position update.
	TPositionExtendedSatelliteInfo iPosInfo;
	
	// GPS measurement info update arrived?
	TBool iMeasurementInfoReceived;
	
	// GPS measurement info error code.
	TInt iMeasurementInfoErr;
	
	// GPS measurement info update data.
	TPositionGpsMeasurementInfo iMeasurementResults;
	
	// Exit info code from the previous state ?!?
	TInt iPreviousStateExitInfo;
	
	// MaxFixTime timeout timer for location requests to agps manager.
	CLbsCallbackTimer* iLocationUpdateTimer;
	
	// Record the sessionId of the last/current location request.
	TLbsNetSessionIdInt iLastLocReqSessionId;

	// Has a privacy request been rejected?
	TBool iWasPrivacyResponseReceivedStateExited;
	
	// The type of external request that has been recieved.
	TLbsExternalRequestInfo::TRequestType iExternalRequestType;
	
	// Indicates if this session resulted in the positioning status being incremented.
	TBool iPositioningStatusIncremented;
	
private:
	//  the states
	CLbsPrivLocStateBase* iCurrentState;
	TFixedArray<CLbsPrivLocStateBase*, ETotalStates> iStates;
	};
		
	
	
#endif //PRIVACYANDLOCATIONHANDLER_H