telephonyserver/etelmultimode/CETEL/mm_lcs.cpp
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserver/etelmultimode/CETEL/mm_lcs.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,464 @@
+// 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:
+// This file contains the definition for the ETelMM sub-session
+// RMobileLocationServices, which allows access to MT-LR and MO-LR Requests supporting LBS Framwork
+// applications and all their functionality.
+// 
+//
+
+/**
+ @file
+*/
+
+// From core API
+#include <etelext.h>
+
+// Multimode header files
+#include <etelmm.h>
+#include "mm_hold.h"
+#include "mmretrieve.h"
+
+//
+//
+//  RMobileLocationServices
+//
+//
+
+/**
+Default empty constructor, and is present only to support virtual
+function table export.
+@publishedPartner
+*/
+EXPORT_C RMobileLocationServices::RMobileLocationServices(): iMmPtrHolder(NULL)
+	{
+        
+	}
+
+EXPORT_C TInt RMobileLocationServices::Open(RMobilePhone& aPhone)
+/**
+This function opens a RMobileLocationServices sub-session from a 
+RMobilePhone sub-session.The name of the sub-session opened in the 
+TSY will equal the string defined by the KETelLocationServices LIT definition.
+
+The API can be called only by the Location Services Network Gateway Process.
+
+In case of hardware the API can be called by providing the SID of the 
+Location Services Network Gateway Process in ETel.iby file 
+found at \epoc32\rom\include
+
+A patchable constant KLocationServicesNetworkGatewaySid is used for 
+defining the SID value.
+In ETel.iby file find the following line
+patchdata etel.dll@KLocationServicesNetworkGatewaySid <SID>
+For example:
+patchdata etel.dll@KLocationServicesNetworkGatewaySid 0x12345678
+
+In case of emulator the API can be called by providing the SID of the 
+default phone application in epoc.ini file found at \epoc32\data
+In epoc.ini file find the following line
+etel_KLocationServicesNetworkGatewaySid <SID>
+For example:
+etel_KLocationServicesNetworkGatewaySid 0x12345678
+
+@param aPhone The RMobilePhone sub-session relative to which this
+              sub-session will open.
+@return KErrNone if successful, otherwise another of the system-wide error 
+codes.
+@capability SID
+@publishedPartner
+*/
+	{
+	RSessionBase* session=&aPhone.SessionHandle();
+	__ASSERT_ALWAYS(session!=NULL,PanicClient(EEtelPanicNullHandle));
+	TInt subSessionHandle=aPhone.SubSessionHandle();
+	__ASSERT_ALWAYS(subSessionHandle!=NULL,PanicClient(EEtelPanicNullHandle));
+
+	TRAPD(ret,ConstructL());
+	if (ret)
+		{
+		return ret;
+		}
+	TPtrC name(KETelLocationServices);
+
+	SetSessionHandle(*session);
+	TIpcArgs args(&name,TIpcArgs::ENothing,subSessionHandle);
+
+	ret = CreateSubSession(*session,EEtelOpenFromSubSessionLcs,args);
+	if (ret)
+		{
+		Destruct();	
+		}
+	return ret;
+	}
+
+/**
+This function member closes a RMobileLocationServices sub-session. 
+@capability None
+@publishedPartner
+*/
+EXPORT_C void RMobileLocationServices::Close()
+	{
+	CloseSubSession(EEtelClose);
+	Destruct();
+	}
+
+/**
+Default constructor, initialising version number of this data
+structure.
+
+@see TMultimodeEtelV7Api
+
+@publishedPartner
+*/
+EXPORT_C RMobileLocationServices::TNotifyMtlrV7::TNotifyMtlrV7()
+	{
+	iExtensionId = KEtelExtMultimodeV7;
+	}
+
+/**
+Default constructor, initialising version number of this data
+structure.
+
+@see TMultimodeEtelV7Api
+
+@publishedPartner
+*/
+EXPORT_C RMobileLocationServices::TStartMolrV7::TStartMolrV7()
+	{
+	iExtensionId = KEtelExtMultimodeV7;
+	}
+
+/**
+Default constructor, initialising version number of this data
+structure.
+
+@see TMultimodeEtelV7Api
+
+@publishedPartner
+*/
+EXPORT_C RMobileLocationServices::TMolrReturnResultV7::TMolrReturnResultV7()
+	{
+	iExtensionId = KEtelExtMultimodeV7;
+	}
+
+/**
+Default constructor, initialising version number of this data
+structure.
+
+@see TMultimodeEtelV7Api
+
+@publishedPartner
+*/
+EXPORT_C RMobileLocationServices::TMeasurementControlV7::TMeasurementControlV7()
+	{
+	iExtensionId = KEtelExtMultimodeV7;
+	}
+
+/**
+Default constructor, initialising version number of this data
+structure.
+
+@see TMultimodeEtelV7Api
+
+@publishedPartner
+*/
+EXPORT_C RMobileLocationServices::TMeasurementReportV7::TMeasurementReportV7()
+	{
+	iExtensionId = KEtelExtMultimodeV7;
+	}
+
+EXPORT_C void RMobileLocationServices::NotifyMtlr(TRequestStatus& aReqStatus,TDes8& aNotifyMtlr) 
+/** 
+This member function notifies the client about the incoming MTLR requests 
+and provides the Client with a class reference,Which contains the details 
+of the request made by the External client via Network.
+USE CancelAsyncRequest(EMobileLocationServicesNotifyMtlr) to cancel the 
+previously placed NotifyMtlr() request.
+
+As this API can be used for emergency requests as well as the non-emergency 
+ones, this method is always treated as an emergency request by ETel/TSY. 
+Clients that need to handle the emergency LCS requests should pre-allocate 
+enough memory during system initialisation to reserve it for handling of 
+the emergency LCS MT-LR. The emergency client also needs to establish itself 
+as an "Emergency Client" to the Etel server at startup, to ensure that enough 
+memory is pre-allocated by ETel/TSY and that the handling of this notification 
+will never fail due to lack of memory. The client may establish itself as an 
+Emergency Client by calling the RPhone::SetEmergencyClient() API, 
+specifying EEmergencyLCSRequest as the request type. 
+
+@param aReqStatus 	On return, KErrNone if successful.
+@param aNotifyMtlr On completion,the mobile terminated location request 
+in TNotifyMtlrV7Pckg.
+@see TNotifyMtlrV7
+@capability None
+@publishedPartner
+*/
+	{
+	TReqPriorityType type=EIsaEmergencyRequest;
+	Get(EMobileLocationServicesNotifyMtlr, aReqStatus, aNotifyMtlr, type);
+	}
+
+EXPORT_C void RMobileLocationServices::SendMtlrResponse(TRequestStatus& aReqStatus,const TMtlrResponse aMtlrResponse)  
+/** 
+This member function sends the response given by the client to the MTLR request 
+made by the network
+
+Clients that need to handle the emergency LCS requests should pre-allocate enough 
+memory during system initialisation to reserve it for responding to the 
+emergency LCS MT-LR. The emergency client also needs to establish itself 
+as an "Emergency Client" to the Etel server at startup, to ensure that enough 
+memory is preallocated by ETel/TSY and that the handling of this request will never 
+fail due to lack of memory. The client may establish itself as an Emergency Client 
+by calling the RPhone::SetEmergencyClient() API, specifying EEmergencyLCSRequest 
+as the request type. 
+
+@param aReqStatus 	On return, KErrNone if successful.
+@param aMtlrResponse It holds the response of the UE after a privacy check has being made 
+					 on the request made by the External Client.
+@see RMobileLocationServices::NotifyMtlr()
+@capability None
+@publishedPartner
+*/
+	{
+	__ASSERT_ALWAYS(iMmPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+	TPtrC8& ptr = iMmPtrHolder->SetC(CMobileLocationServicesPtrHolder::ESlot1LcsSendMtlrResponse,aMtlrResponse);
+	TReqPriorityType type=EIsaEmergencyRequest;
+	Set(EMobileLocationServicesSendMtlrResponse,aReqStatus, ptr, type);
+	}
+
+EXPORT_C void RMobileLocationServices::SendMtlrResponse(TRequestStatus& aReqStatus,const TMtlrError aMtlrError) 
+/**
+This function sends a response to the MTLR request made by the Network in 
+erroneous conditions.
+
+Clients that need to handle the emergency LCS requests should pre-allocate enough 
+memory during system initialisation to reserve it for responding to the emergency 
+LCS MT-LR. The emergency client also needs to establish itself as an 
+"Emergency Client" to the Etel server at startup, to ensure that enough memory is 
+preallocated by ETel/TSY and that the handling of this request will never fail due 
+to lack of memory. The client may establish itself as an Emergency Client by calling 
+the RPhone::SetEmergencyClient() API, specifying EEmergencyLCSRequest as the request type. 
+
+@param aReqStatus 	On return, KErrNone if successful.
+@param aMtlrError   It contains the error report generated by the UE,which is sent 
+back to the Network
+@see RMobileLocationServices::NotifyMtlr
+@capability None
+@publishedPartner
+*/
+	{
+	__ASSERT_ALWAYS(iMmPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+	TPtrC8& ptr1 = iMmPtrHolder->SetC(CMobileLocationServicesPtrHolder::ESlot1LcsSendMtlrError, aMtlrError);
+	TReqPriorityType type=EIsaEmergencyRequest;
+	Set(EMobileLocationServicesSendMtlrError,aReqStatus, ptr1, type);
+	}
+
+EXPORT_C void RMobileLocationServices::SendMtlrResponse(TRequestStatus& aReqStatus,const TMtlrReject aMtlrReject)
+/**
+This function sends a response to the MTLR request made by the Network,When 
+UE wants to reject the MTLR request made by an External Client.
+
+Clients that need to handle the emergency LCS requests should pre-allocate enough 
+memory during system initialisation to reserve it for responding to the emergency 
+LCS MT-LR. The emergency client also needs to establish itself as an 
+"Emergency Client" to the Etel server at startup, to ensure that enough memory 
+is preallocated by ETel/TSY and that the handling of this request will never fail due to 
+lack of memory. The client may establish itself as an Emergency Client by calling 
+the RPhone::SetEmergencyClient() API, specifying EEmergencyLCSRequest as the request type. 
+
+@param aReqStatus 	On return, KErrNone if successful.
+@param aMtlrReject It contains the details of the Rejection made by the UE.
+@capability None
+@publishedPartner
+*/
+	{
+	__ASSERT_ALWAYS(iMmPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+	TPtrC8& ptr1 = iMmPtrHolder->SetC(CMobileLocationServicesPtrHolder::ESlot1LcsMtlrReject, aMtlrReject);
+	TReqPriorityType type=EIsaEmergencyRequest;
+	Set(EMobileLocationServicesRejectMtlr,aReqStatus, ptr1, type);
+	}
+
+
+EXPORT_C void RMobileLocationServices::SendMolr(TRequestStatus& aReqStatus,const TDesC8& aStartMolr,TDes8& aMolrReturnResult) 
+/** 
+This member function is used to trigger a Molr request. It carries all the details 
+of the Molr request the UE wants to send to the network.This request is completed 
+after the completion of SendMeasurementReport API when the Network sends back an Error 
+report sent by the remote External client which received the UE location via network
+or a Location estimate response to the Self-Location Molr request i.e being made by 
+the UE to the Network.
+
+@param aReqStatus 	On return, KErrNone if successful.
+@param aStartMolr   A TStartMolrV7Pckg holding the details of the 
+MOLR(Mobile Originating Location Request) made by the UE.
+@see TStartMolrV7
+@param aMolrReturnResult On completion,result containing the velocity and location 
+estimate or errors in TMolrReturnResultV7Pckg.
+@see TMolrReturnResultV7
+@capability None						 			    
+@publishedPartner
+*/
+	{
+	SetAndGet(EMobileLocationServicesSendMolr,aReqStatus, aStartMolr,aMolrReturnResult);
+	}
+
+EXPORT_C void RMobileLocationServices::NotifyMeasurementControl(TRequestStatus& aReqStatus,TDes8& aMeasurementControl)
+/**
+This function waits for the notification of incoming A-GPS assistance 
+data from the network in continuance of the MTLR or MOLR.
+
+As this API can be used for emergency requests as well as the non-emergency ones, 
+this method is always treated as an emergency request by ETel/TSY. Clients that need to 
+handle the emergency LCS requests should preallocate enough memory during 
+system initialisation to reserve it for handling of the emergency LCS Measrement Control. 
+The emergency client also needs to establish itself as an "Emergency Client" to the Etel 
+server at startup, to ensure that enough memory is pre-allocated by ETel/TSY and that the
+handling of this notification will never fail due to lack of memory. The client may 
+establish itself as an Emergency Client by calling the RPhone::SetEmergencyClient() API, 
+specifying EEmergencyLCSRequest as the request type. 
+
+@param aReqStatus 	On return, KErrNone if successful, a system wide error code if not.
+@param aMeasurementControl	On completion, A TMeasurementControlV7Pckg holding 
+the A-GPS assistance data.
+@see TMeasurementControlV7
+@see RMobileLocationServices::NotifyMltr()
+@see RMobileLocationServices::SendMolr()
+
+@capability None
+@publishedPartner
+*/
+	{
+	TReqPriorityType type=EIsaEmergencyRequest;
+	Get(EMobileLocationServicesNotifyMeasurementControl,aReqStatus,aMeasurementControl,type);
+	}
+
+EXPORT_C void RMobileLocationServices::SendMeasurementReport(TRequestStatus& aReqStatus,const TDesC8& aMeasurementReport)
+/**
+This function sends the location information, computed by the UE, 
+to the network. Location information is computed using the A-GPS assistance
+data received from the network through the NotifyMeasurementControl API.
+
+Clients that need to handle the emergency LCS requests should preallocate enough memory 
+during system initialisation to reserve it for handling of the emergency LCS MT-LR 
+procedure. The emergency client also needs to establish itself as an "Emergency Client" to the 
+Etel server at startup, to ensure that enough memory is preallocated by ETel/TSY 
+and that the handling of this request will never fail due to lack of memory. 
+The client may establish itself as an Emergency Client by calling the 
+RPhone::SetEmergencyClient() API, specifying EEmergencyLCSRequest as the request type. 
+
+@param aReqStatus 	On return, KErrNone if successful, a system wide error code if not.
+@param aMeasurementReport	A TMeasurementReportV7Pckg holding the location information 
+report of the UE to be sent to the network.
+@see TMeasurementReportV7
+@see RMobileLocationServices::NotifyMeasurementControl()
+
+@capability None
+@publishedPartner
+*/
+	{
+	TReqPriorityType type=EIsaEmergencyRequest;
+	Set(EMobileLocationServicesSendMeasurementReport,aReqStatus,aMeasurementReport,type);
+	}
+
+EXPORT_C void RMobileLocationServices::SendMeasurementReport(TRequestStatus& aReqStatus,const TMeasurementControlFailure aMeasurementControlFailure)
+/**
+This function sends the measurement control failure cause, encountered while processing
+the A-GPS assistance data to compute location information, to the network. 
+
+Clients that need to handle the emergency LCS requests should preallocate enough memory 
+during system initialisation to reserve it for handling of the emergency LCS MT-LR procedure. 
+The emergency client also needs to establish itself as an "Emergency Client" to the 
+Etel server at startup, to ensure that enough memory is preallocated by ETel/TSY and 
+that the handling of this request will never fail due to lack of memory. The client 
+may establish itself as an Emergency Client by calling the 
+RPhone::SetEmergencyClient() API, specifying EEmergencyLCSRequest as the request type. 
+
+@param aReqStatus 	On return, KErrNone if successful, a system wide error code if not.
+@param aMeasurementControlFailure	Holds the measurement control failure cause to be sent
+									to the network.
+@see RMobileLocationServices::NotifyMeasurementControl()
+
+@capability None
+@publishedPartner
+*/
+	{
+	__ASSERT_ALWAYS(iMmPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+	TPtrC8& ptr = iMmPtrHolder->SetC(CMobileLocationServicesPtrHolder::ESlot1LcsSendMeasurementControlFailure, aMeasurementControlFailure);
+	TReqPriorityType type=EIsaEmergencyRequest;
+	Set(EMobileLocationServicesSendMeasurementControlFailure,aReqStatus,ptr,type);
+	}
+
+/**
+Delayed construction of heap stored data members.
+
+@leave KErrNoMemory Heap memory allocation failure for
+ CMobileLocationServicesPtrHolder object.
+*/
+void RMobileLocationServices::ConstructL()
+	{
+	__ASSERT_ALWAYS(iMmPtrHolder==NULL,PanicClient(EEtelPanicHandleNotClosed));
+	iMmPtrHolder = CMobileLocationServicesPtrHolder::NewL(CMobileLocationServicesPtrHolder::EMaxNumberLocationServicesPtrSlots,
+	CMobileLocationServicesPtrHolder::EMaxNumberLocationServicesPtrCSlots);
+	}
+
+
+/**
+Called internally when RMobileLocationServices instance is no longer
+required, to ensure clean up of data members from memory.
+*/
+void RMobileLocationServices::Destruct()
+	{
+	delete iMmPtrHolder;
+	iMmPtrHolder = NULL;
+	ResetSessionHandle();
+	}
+
+
+EXPORT_C TInt RMobileLocationServices::SetLcsDomain(const TDomain aDomain) 
+/*
+This function set the domain into either circuit switched or packet switched.
+This is the domain that applies to MO-LR,if the domain is not specified the default domain
+will be Packed switched
+
+@param TDomain	Holds the domain information of the phone to be sent
+				to the network.
+
+@capability NetworkServices
+@capability Location
+@publishedPartner
+*/
+	{
+	TPckg<TDomain> ptr(aDomain);
+	return Set(EMobileLocationServicesSetLcsDomain,ptr);
+	}
+
+/*
+This function requests a notification when a signal is received from the network 
+to reset the UE Positioning Information held by the handset.
+@see 3GPP TS 34.109 V7.2.0 Section 6.10
+@see TUePosTechnology
+
+@param aReqStatus 	On return, KErrNone if successful, a system wide error code if not.
+@param aUePosTechnology	The positioning data to reset (e.g., A-GPS). See 3GPP TS 34.109 V7.2.0 Section 6.10 
+@capability None
+@publishedPartner
+@released
+*/
+EXPORT_C void RMobileLocationServices::NotifyResetUePositioningInformation(TRequestStatus& aReqStatus, TUePosTechnology& aUePosTechnology) const
+	{
+	__ASSERT_ALWAYS(iMmPtrHolder!=NULL,PanicClient(EEtelPanicNullHandle));
+	TPtr8& ptr1 = iMmPtrHolder->Set(CMobileLocationServicesPtrHolder::ESlot1LcsNotifyUeResetPositioningInformation, aUePosTechnology);
+
+	Get(EMobileLocationServicesNotifyResetUePositioningInformation, aReqStatus, ptr1);
+	}