diff -r a2efdd544abf -r b47902b73a93 locationrequestmgmt/networkrequesthandler/inc/ngmessageswitch.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/locationrequestmgmt/networkrequesthandler/inc/ngmessageswitch.h Fri Jun 04 10:34:15 2010 +0100 @@ -0,0 +1,305 @@ +// 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: +// + +/** + @file + @InternalComponent + @released +*/ + +#ifndef NGMESSAGESWITCH_H +#define NGMESSAGESWITCH_H + +#include +#include +#include "lbscommoninternaldatatypes.h" +#include "privacyhandlerobserver.h" +#include "privacyhandler.h" +#include "lbsnetinternalapi.h" +#include "lbsnrhngmsgs.h" + + + +class CNGMessageSendBufferBase; + +/** + * + * Class which defines the observer interface for CNGMessageSwitch. + * Objects which want to be informed of incoming messages should + * inherit and implement this interface and register themselves by + * calling CNGMessageSwitch::RegisterObserver(); + * + */ +class MNGMessageSwitchObserver + { +public: + /** Called when a privacy request arrives from the network. + + Note: a privacy request is often the start of an MT-LR, hence the function name. + */ + virtual void OnMTLRRequest(const TLbsNetSessionIdInt& aSessionId, + TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType, + TBool aIsEmergency, + const TLbsExternalRequestInfo& aExternalRequestInfo, + const TLbsNetPosRequestPrivacyInt& aNetPosRequestPrivacy) = 0; + + /** Called when a session complete arrives from the network. + */ + virtual void OnSessionComplete(const TLbsNetSessionIdInt& aSessionId, TInt aReason) = 0; + + /** Called when a location request arrives from the network. + */ + virtual void OnNetLocRequest(const TLbsNetSessionIdInt& aSessionId, + const TLbsNetPosRequestMethodInt& aNetPosMethod, + TLbsNetworkEnumInt::TLbsNetProtocolServiceInt aSessionType, + TBool aIsEmergency, + const TLbsNetPosRequestQualityInt& aQuality) = 0; + + /** Called when a location response is sent to the network. + + This is only needed for the X3P handler, so that it knows what quality + parameters were used when the location request was sent to the A-GPS manager. + */ + virtual void OnNetLocResponse(const TLbsNetSessionIdInt& aSessionId, + const TLbsNetPosRequestQualityInt& aQuality) = 0; + + /** Called when a reference location arrives from the network. + */ + virtual void OnNetLocReferenceUpdate(const TLbsNetSessionIdInt& aSessionId, + const TPositionInfoBase& aPosInfo) = 0; + + /** Called when a final location arrives from the network. + */ + virtual void OnNetLocFinalUpdate(const TLbsNetSessionIdInt& aSessionId, + const TPositionInfoBase& aPosInfo) = 0; + }; + +/** + * + * Class which implements the interface between the Network Gateway and the + * Network Request Handler + */ +class CNGMessageSwitch : public CBase, + public MLbsNetChannelObserver + { +public: + static CNGMessageSwitch* NewL(CLbsAdmin& aAdmin); + ~CNGMessageSwitch(); + +public: + /* + * Called by an observer to register itself with the + * message switch. + */ + TInt RegisterObserver(MNGMessageSwitchObserver* aPrvLocObserver); + + /** + * Called by the Privacy and Location Request Handler to send the + * result of an MTLR to the Network + */ + void SendMTLRResponse(const TLbsNetSessionIdInt& aSessionId, + TLbsNetworkEnumInt::TLbsPrivacyResponseInt aResult, + TInt aReason, + TBool aEmergency); + /** + * Called by the Privacy and Location Request Handler to send the + * result of a location measurement request to the Network + */ + void SendNetLocResponse(const TLbsNetSessionIdInt& aSessionId, + TInt aCompletionCode, + const TLbsNetPosRequestQualityInt& aRequestQuality, + const TPositionInfoBase& aPosInfo, + const TTime& aTimeStamp, + TBool aEmergency); + /** + * Called by the X3P Request Handler to send + * an X3P request to the Message Gateway Protocol Handler + */ + void SendX3pRequest(const TLbsNetSessionIdInt& aSessionId, + const TDesC& aDestId, + TUint aTransmitPriority, + const TLbsNetPosRequestOptionsTechnologyInt& aOptions); + /** + * Called by the X3P Request Handler to cancel + * an X3P request to the Message Gateway Protocol Handler + */ + void SendX3pCancel(const TLbsNetSessionIdInt& aSessionId, + TInt aReason); + + /** + * Called by the Privacy and Location Request Handler to cancel + * an External Location request + */ + void SendExternalLocateCancel(const TLbsNetSessionIdInt& aSessionId, + TInt aReason); + + TInt GetNetworkReferencePosition(const TLbsNetSessionIdInt& aSessionId, + TPositionInfoBase& aPosInfo); + + TInt GetNetworkFinalPosition(const TLbsNetSessionIdInt& aSessionId, + TPositionInfoBase& aPosInfo); + +public: // From MLbsNetChannelObserver + void ProcessNetChannelMessage(RLbsNetChannel::TLbsNetChannelId aChannelId, + const TLbsNetInternalMsgBase& aMessage); + + +protected: + void ConstructL(); + +private: + CNGMessageSwitch(CLbsAdmin& aLbsAdmin); + +private: + + class TNetPosItem + { + public: + TLbsNetSessionIdInt iSessionId; + TPositionInfo iPosInfo; + + }; + + class TNetFNPPosItem + { + public: + TLbsNetSessionIdInt iSessionId; + TPositionExtendedSatelliteInfo iPosInfo; + + }; + + static TBool IsSessionIdEqual(const TLbsNetSessionIdInt* aSessionId, + const TNetPosItem& aItem); + static TBool IsFNPSessionIdEqual(const TLbsNetSessionIdInt* aSessionId, + const TNetFNPPosItem& aItem); + + void RemoveBufferedNetworkPositions(const TLbsNetSessionIdInt& aSessionId); + +private: + RPointerArray iObservers; + RLbsNetChannel iNetworkGateway; + CNGMessageSendBufferBase* iNetworkGatewaySendBuffer; + CLbsAdmin& iAdmin; + + RArray iRefPosBuffer; + RPointerArray iFNPPosBuffer; + + }; + +/** Abstract base class for buffer for sending messages to the Network Gateway. +*/ +class CNGMessageSendBufferBase : public CActive + { +public: + ~CNGMessageSendBufferBase(); + + virtual void SendNetLocResponseToNetwork( + const TLbsNetSessionIdInt& aSessionId, + TInt aCompletionCode, + const TPositionInfoBase& aPosInfo, + const TTime& aTimeStamp, + TBool aEmergency) = 0; + + virtual void SendMtlrResponseToNetwork( + const TLbsNetSessionIdInt& aSessionId, + TLbsNetworkEnumInt::TLbsPrivacyResponseInt aResult, + TInt aReason, + TBool aEmergency) = 0; + + virtual void SendX3pRequestToNetwork( + const TLbsNetSessionIdInt& aSessionId, + const TDesC& aDestId, + TUint aTransmitPriority, + const TLbsNetPosRequestOptionsTechnologyInt& aOptions) = 0; + + virtual void SendX3pCancelToNetwork( + const TLbsNetSessionIdInt& aSessionId, + TInt aReason) = 0; + + virtual void SendExternalLocateCancelToNetwork( + const TLbsNetSessionIdInt& aSessionId, + TInt aReason) = 0; + +protected: + CNGMessageSendBufferBase(RLbsNetChannel& aGatewayChannel, CLbsAdmin& aAdmin); + + void RunL(); + void DoCancel(); + + void SendMessageToNetwork(const TLbsNetInternalMsgBase& aMessage); + + virtual void BufferData(TLbsNetInternalMsgBase* aData) = 0; + +protected: + CLbsAdmin& iAdmin; + +private: + RLbsNetChannel& iNetGatewayChannel; + }; + + + +/** The NRH uses this buffer used to send messages to network gateway. + +This buffer has a special, non-dynamic allocation that guarantees that the messages +can be sent. This avoiding Emergencies failing due to +OOM situations. For non-emergencies messages the +memory is allocated off the heap to buffer messages. +When this fails due to OOM then the result is that the messages are not sent. +*/ +class CNGMessageSendBuffer : public CNGMessageSendBufferBase + { +public: + static CNGMessageSendBuffer* NewL(RLbsNetChannel& aGatewayChannel, CLbsAdmin& aAdmin); + ~CNGMessageSendBuffer(); + + void SendNetLocResponseToNetwork(const TLbsNetSessionIdInt& aSessionId, + TInt aCompletionCode, + const TPositionInfoBase& aPosInfo, + const TTime& aTimeStamp, + TBool aEmergency); + void SendMtlrResponseToNetwork(const TLbsNetSessionIdInt& aSessionId, + TLbsNetworkEnumInt::TLbsPrivacyResponseInt aResult, + TInt aReason, + TBool aEmergency); + void SendX3pRequestToNetwork(const TLbsNetSessionIdInt& aSessionId, + const TDesC& aDestId, + TUint aTransmitPriority, + const TLbsNetPosRequestOptionsTechnologyInt& aOptions); + void SendX3pCancelToNetwork(const TLbsNetSessionIdInt& aSessionId, + TInt aReason); + void SendExternalLocateCancelToNetwork(const TLbsNetSessionIdInt& aSessionId, + TInt aReason); +private: + CNGMessageSendBuffer(RLbsNetChannel& aGatewayChannel, CLbsAdmin& aAdmin); + + void RunL(); + TInt RunError(TInt aError); + + void BufferData(TLbsNetInternalMsgBase* aData); + void BufferEmergencyData(TLbsNetInternalMsgBase* aData); // two spaces are pre-allocated in this array + + +private: + RPointerArray iBuffer; + RPointerArray iEmergencyBuffer; + + TLbsNetMtLrReponseMsg iEmergencyPrivacyResponseData; + TLbsNetLocationResponseMsg iEmergencyLocationResponseData; + + }; + +#endif // NGMESSAGESWITCH_H +