networkprotocolmodules/common/suplrrlpasn1/src/suplpos.cpp
changeset 45 15a2125aa2f3
parent 40 18280709ae43
child 49 5f20f71a57a3
child 51 95c570bf4a05
--- a/networkprotocolmodules/common/suplrrlpasn1/src/suplpos.cpp	Fri Jun 11 15:06:31 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,532 +0,0 @@
-// Copyright (c) 2008-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
- @internalTechnology
- 
-*/
-
-#include "RRLP-Messages.h"
-#include "ULP.h"
-
-#include "suplpos.h"
-#include "suplpospayload.h"
-#include "rrlpmeasureposrequest.h"
-#include "rrlpassistancedata.h"
-#include "rrlpprotocolerror.h"
-#include "suplasn1error.h"
-#include "supldevloggermacros.h" 
-
-#include <lbssatellite.h>
-#include <lbs/lbsgpsmeasurement.h>
-
-/** 
-Static factory constructor 
-*/
-EXPORT_C CSuplPos* CSuplPos::NewL(TBool aIsOutgoingMessage)
-	{
-	SUPLLOG(ELogP1, "CSuplPos::NewL() Begin\n");
-	CSuplPos* self = CSuplPos::NewLC(aIsOutgoingMessage);
-	SUPLLOG(ELogP1, "CSuplPos::NewL() End\n");
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-EXPORT_C CSuplPos* CSuplPos::NewLC(TBool aIsOutgoingMessage)
-	{
-	SUPLLOG(ELogP1, "CSuplPos::NewLC() Begin\n");
-	CSuplPos* self = new (ELeave) CSuplPos(aIsOutgoingMessage);
-	CleanupStack::PushL(self);
-	self->ConstructL();
-	SUPLLOG(ELogP1, "CSuplPos::NewLC() End\n");
-	return self;
-	}
-
-
-/** 
-Constructor 
-*/
-CSuplPos::CSuplPos(TBool aIsOutgoingMessage)
- : CSuplMessageBase::CSuplMessageBase(ESuplPos, aIsOutgoingMessage)
-	{
-	}
-
-
-/** 
-Second stage constructor 
-*/
-void CSuplPos::ConstructL()
-	{
-	// call the base class ConstructL() to create common data structures
-	CSuplMessageBase::ConstructL();
-
-	// message specific structures for outgoing messages.
-	if (iIsOutgoingMessage)
-		{
-		// local reference to context object
-		OSCTXT* pctxt = iControl->getCtxtPtr();
-
-		// create the SUPL POS specific data structures
-		iData->message.t =  T_UlpMessage_msSUPLPOS;
-		iData->message.u.msSUPLPOS = (ASN1T_SUPLPOS*)rtxMemAllocZ(pctxt, sizeof(ASN1T_SUPLPOS));
-   		LeaveIfAllocErrorL();
-		
-		iData->message.u.msSUPLPOS->m.velocityPresent = 0;
-		
-		iData->message.u.msSUPLPOS->posPayLoad.t = T_PosPayLoad_rrlpPayload;
-		iData->message.u.msSUPLPOS->posPayLoad.u.rrlpPayload = (ASN1T_PosPayLoad_rrlpPayload*)rtxMemAllocZ(pctxt, sizeof(ASN1T_PosPayLoad_rrlpPayload));
-   		LeaveIfAllocErrorL();
-		}
-	}
-
-
-/** 
-Destructor 
-*/
-CSuplPos::~CSuplPos()
-	{
-	SUPLLOG(ELogP1, "CSuplPos::~CSuplPos() Begin\n");
-	delete iPosPayload;
-	delete iDecodeBuffer;
-	delete iPayloadData;
-	delete iPayloadPdu;
-	SUPLLOG(ELogP1, "CSuplPos::~CSuplPos() End\n");
-	}
-
-	
-/** 
-SetVelocity()
-
-Set the velocity parameter. The parameter TPositionInfoBase must contain
-course information (eg be TPositionCourseInfo or derived) for the velocity
-parameter to be set.
-
-@param  aPosInfo: contains current velocity estimate
-@return KErrNone normally
-		KErrNotFound if no TCourse information present
-		KErrNoMemory if failed to allocate memory to store the outgoing data
-*/
-EXPORT_C TInt CSuplPos::SetVelocity(const TPositionInfoBase& aPosInfo)
-	{
-	SUPLLOG(ELogP1, "CSuplPos::SetVelocity() Begin\n");
-	__ASSERT_DEBUG(iIsOutgoingMessage, User::Invariant());
-	__ASSERT_DEBUG(iData->message.u.msSUPLPOS != NULL, User::Invariant());
-
-		// handle velocity (TCourse) information
-	if ((aPosInfo.PositionClassType() & EPositionCourseInfoClass) != 0)
-		{
-		TPositionCourseInfo courseInfo = reinterpret_cast <const TPositionCourseInfo&> (aPosInfo);
-		TCourse course;
-		courseInfo.GetCourse(course);
-		
-		// populate the velocity parameter
-		iData->message.u.msSUPLPOS->m.velocityPresent = 1;
-		TInt velErr = PopulateVelocity(course, iData->message.u.msSUPLPOS->velocity);
-		if (velErr != KErrNone)
-			{
-			SUPLLOG(ELogP1, "CSuplPos::SetVelocity() End (error populating velocity)\n");
-			return velErr;
-			}
-		}
-	else
-		{
-		// passed parameter does not contain course information.
-		SUPLLOG(ELogP1, "CSuplPos::SetVelocity() End (Course Information Not Present)\n");
-		return KErrNotFound;
-		}
-		
-	SUPLLOG(ELogP1, "CSuplPos::SetVelocity() End\n");
-	return KErrNone;
-	}
-
-
-/**
-VelocityPresent()
-
-@return ETrue if the optional velocity parameter is present
-*/
-EXPORT_C TBool CSuplPos::VelocityPresent()
-	{
-	SUPLLOG(ELogP1, "CSuplPos::VelocityPresent() Begin\n");
-	__ASSERT_DEBUG(!iIsOutgoingMessage, User::Invariant());
-	__ASSERT_DEBUG(iData->message.u.msSUPLPOS != NULL, User::Invariant());
-	
-	if (iData->message.u.msSUPLPOS->m.velocityPresent != 0)
-		{
-		SUPLLOG(ELogP1, "CSuplPos::VelocityPresent(ETrue) End\n");
-		return ETrue;
-		}
-
-	SUPLLOG(ELogP1, "CSuplPos::VelocityPresent(EFalse) End\n");
-	return EFalse;
-	}
-
-	
-/** 
-Velocity()
-
-Populates aPosInfo according to the velocity parameter 
-The parameter TPositionInfoBase must be able to store course information 
-(eg be TPositionCourseInfo or derived) for the velocity parameter to be set.
-
-Note that the LBS course API currently does not support vertical velocity, 
-so vertical speed information is ignored.
-
-@param  aPosInfo: on return, populated with velocity information.
-@return KErrNotFound if the velocity is not available in the received message
-		KErrNotSupported if the TPositionInfoBase can not hold course information.
-		KErrArgument if the received data is not in the expected format.
-		KErrNone otherwise
-*/
-EXPORT_C TInt CSuplPos::GetVelocity(TPositionInfoBase& aPosInfo)
-	{
-	SUPLLOG(ELogP1, "CSuplPos::Velocity() Begin\n");
-	__ASSERT_DEBUG(!iIsOutgoingMessage, User::Invariant());
-	__ASSERT_DEBUG(iData->message.u.msSUPLPOS != NULL, User::Invariant());
-
-	// check the velocity was present in the received message
-	if (iData->message.u.msSUPLPOS->m.velocityPresent == 0)
-		{
-		return KErrNotFound;
-		}
-	
-	// check the TPositionInfoBase can receive course information.
-	if ((aPosInfo.PositionClassType() & EPositionCourseInfoClass) == 0)
-		{
-		__ASSERT_DEBUG(0, User::Invariant());
-		return KErrNotSupported;
-		}
-		
-	// source velocity reference
-	ASN1T_Velocity& velocity = iData->message.u.msSUPLPOS->velocity;
-
-	// target course reference
-	TCourse course;
-	
-	// set the course information according to the received velocity type
-	switch (velocity.t)
-		{
-		case T_Velocity_horvel:
-			{
-			TUint bearing = 0;
-			bearing = velocity.u.horvel->bearing.data[0] << 1;
-			bearing |= velocity.u.horvel->bearing.data[1] >> 7;
-			
-			TUint speed = 0;
-			speed = velocity.u.horvel->horspeed.data[0] << 8;
-			speed |= velocity.u.horvel->horspeed.data[1];
-			
-			course.SetHeading((TReal32)bearing);
-			course.SetSpeed(ConvertHorSpeedToMetersPerSecond(speed));
-			break;
-			}
-		case T_Velocity_horandvervel:
-			{
-			TUint bearing = 0;
-			bearing = velocity.u.horandvervel->bearing.data[0] << 1;
-			bearing |= velocity.u.horandvervel->bearing.data[1] >> 7;
-			
-			TUint speed = 0;
-			speed = velocity.u.horandvervel->horspeed.data[0] << 8;
-			speed |= velocity.u.horandvervel->horspeed.data[1];
-			
-			course.SetHeading((TReal32)bearing);
-			course.SetSpeed(ConvertHorSpeedToMetersPerSecond(speed));
-			break;
-			}
-		case T_Velocity_horveluncert:
-			{
-			TUint bearing = 0;
-			bearing = velocity.u.horveluncert->bearing.data[0] << 1;
-			bearing |= velocity.u.horveluncert->bearing.data[1] >> 7;
-			
-			TUint speed = 0;
-			speed = velocity.u.horveluncert->horspeed.data[0] << 8;
-			speed |= velocity.u.horveluncert->horspeed.data[1];
-			
-			TUint speedAccuracy = velocity.u.horveluncert->uncertspeed.data[0];
-			
-			course.SetHeading((TReal32)bearing);
-			course.SetSpeed(ConvertHorSpeedToMetersPerSecond(speed));
-			course.SetSpeedAccuracy(ConvertHorSpeedAccuracyToMetersPerSecond(speedAccuracy));
-			break;
-			}
-		case T_Velocity_horandveruncert:
-			{
-			TUint bearing = 0;
-			bearing = velocity.u.horandveruncert->bearing.data[0] << 1;
-			bearing |= velocity.u.horandveruncert->bearing.data[1] >> 7;
-			
-			TUint speed = 0;
-			speed = velocity.u.horandveruncert->horspeed.data[0] << 8;
-			speed |= velocity.u.horandveruncert->horspeed.data[1];
-			
-			TUint speedAccuracy = velocity.u.horandveruncert->horuncertspeed.data[0];
-			
-			course.SetHeading((TReal32)bearing);
-			course.SetSpeed(ConvertHorSpeedToMetersPerSecond(speed));
-			course.SetSpeedAccuracy(ConvertHorSpeedAccuracyToMetersPerSecond(speedAccuracy));
-			break;
-			}
-		default:
-			{
-			__ASSERT_DEBUG(0, User::Invariant());
-			return KErrArgument;
-			}
-		}
-
-	// set the course information in the return parameter.
-	TPositionCourseInfo posInfo = reinterpret_cast <const TPositionCourseInfo&> (aPosInfo);
-	posInfo.SetCourse(course);
-	
-	SUPLLOG(ELogP1, "CSuplPos::Velocity() End\n");
-	return KErrNone;
-	}
-	
-
-/** 
-SetPosPayload()
-
-Assigns the payload RRLP message for outgoing messages. 
-CSuplPos instance takes immediate ownership of the CSuplPosPayload object.
-
-@param
-*/
-EXPORT_C void CSuplPos::SetPosPayload(CSuplPosPayload* aPayload)
-	{
-	SUPLLOG(ELogP1, "CSuplPos::SetPosPayload() Begin\n");
-	__ASSERT_DEBUG(iIsOutgoingMessage, User::Invariant());
-	__ASSERT_DEBUG(iPosPayload == NULL, User::Invariant());
-	iPosPayload = aPayload;	
-	SUPLLOG(ELogP1, "CSuplPos::SetPosPayload() End\n");
-	}
-	
-	
-/**
-DecodePosPayloadL()
-
-Decodes the content of received positioning payload. Must be called before content
-of the payload may be accessed
-
-@param aError, on return indicates if an error was encountered, 
-               eg KErrNotSupported for unsupported payload types.
-*/
-void CSuplPos::DecodePosPayloadL(TInt& aError)
-	{
-	SUPLLOG(ELogP1, "CSuplPos::DecodePosPayloadL() Begin\n");
-	__ASSERT_DEBUG(!iIsOutgoingMessage, User::Invariant());
-	__ASSERT_DEBUG(iPosPayload == NULL, User::Invariant());
-	__ASSERT_DEBUG(iData->message.u.msSUPLPOS != NULL, User::Invariant());
-	
-	// check that the payload is RRLP
-	if (iData->message.u.msSUPLPOS->posPayLoad.t != T_PosPayLoad_rrlpPayload)
-		{
-		aError = ESuplAsn1ErrUnsupportedPosProtocol;
-		return;
-		}
-	
-	// extract the RRLP payload and decode and compare...
-	TInt payloadLength  = iData->message.u.msSUPLPOS->posPayLoad.u.rrlpPayload->numocts;
-	OSOCTET* payloadptr = &iData->message.u.msSUPLPOS->posPayLoad.u.rrlpPayload->data[0];
-
-	// Create the payload decode buffer
-	ASN1Context* payloadContext = new (ELeave) ASN1Context;
-	CleanupDeletePushL(payloadContext);
-	iDecodeBuffer = new (ELeave) ASN1PERDecodeBuffer (payloadptr, payloadLength, FALSE, payloadContext);
-	// construction of iDecodeBuffer successful, pop payloadContext off the cleanup stack
-	CleanupStack::Pop(payloadContext);
-
-	// Create data and control objects to manage the decode
-	iPayloadData  = new (ELeave) ASN1T_PDU();
-	iPayloadPdu   = new (ELeave) ASN1C_PDU (*iDecodeBuffer, *iPayloadData);
-	
-	TInt stat = iPayloadPdu->Decode();
-
-	// return now if error encountered while decoding
-	if (stat != KErrNone)
-		{
-		aError = ProcessAsn1Error(stat);
-		return;
-		}
-
-	// build payload content wrapper.
-	switch (iPayloadData->component.t)
-		{
-		case T_RRLP_Component_msrPositionReq:
-			{
-			iPosPayload = CRrlpMeasurePositionRequest::NewL();
-			break;
-			}
-			
-		case T_RRLP_Component_assistanceData:
-			{
-			iPosPayload = CRrlpAssistanceData::NewL();
-			break;
-			}
-
-		case T_RRLP_Component_protocolError:
-			{
-			iPosPayload = CRrlpProtocolError::NewL(EFalse);
-			break;
-			}
-
-		case T_RRLP_Component_msrPositionRsp:
- 		case T_RRLP_Component_assistanceDataAck:
-		default:
-			{
-			// unsupported message type
-			aError = ESuplAsn1ErrUnsupportedPosMessageType;
-			return;
-			}
-		}
-	
-	// pass ownership of the decoded message content.
-	CRrlpMessageBase* rrlpMessage = (CRrlpMessageBase*)iPosPayload;
-	rrlpMessage->SetDecodedData(iPayloadData, iPayloadPdu);
-	iPayloadData = NULL;
-	iPayloadPdu  = NULL;
-
-	// no longer need the decode buffer object.
-	delete iDecodeBuffer;
-	iDecodeBuffer = NULL;
-	SUPLLOG(ELogP1, "CSuplPos::DecodePosPayloadL() End\n");
-	}
-	
-
-/** 
-PosPayload()
-
-Returns the decoded positioning payload for received SUPL POS messages.
-Note that ownership of the position payload is returned - the calling entity 
-becomes responsible for the destruction of the positioning payload.
-
-@return pointer to the positioning payload.
-*/
-EXPORT_C CSuplPosPayload* CSuplPos::PosPayload()
-	{
-	SUPLLOG(ELogP1, "CSuplPos::PosPayload() Begin\n");
-	__ASSERT_DEBUG(!iIsOutgoingMessage, User::Invariant());
-	__ASSERT_DEBUG(iPosPayload != NULL, User::Invariant());
-	__ASSERT_DEBUG(iData->message.u.msSUPLPOS != NULL, User::Invariant());
-	
-	CSuplPosPayload* posPayload = iPosPayload;
-	iPosPayload = NULL;
-
-	SUPLLOG(ELogP1, "CSuplPos::PosPayload() End\n");
-
-	return posPayload;
-	}
-
-	
-/** 
-EncodePosPayloadL()
-
-Encodes the positioning payload.
-
-@return error indication, KErrNone otherwise
-*/
-TInt CSuplPos::EncodePosPayloadL()
-	{
-	SUPLLOG(ELogP1, "CSuplPos::EncodePosPayloadL() Begin\n");
-	__ASSERT_DEBUG(iIsOutgoingMessage, User::Invariant());
-	__ASSERT_DEBUG(iPosPayload!=NULL, User::Invariant());
-
-	// encode the positioning payload. 
-	// Payload is encoded directly to the supl payload container.
-	TPtr8 payloadPtr(iData->message.u.msSUPLPOS->posPayLoad.u.rrlpPayload->data, 8192);
-	TInt err = iPosPayload->EncodeToL(payloadPtr);
-	if (err!=KErrNone)
-		{
-		SUPLLOG(ELogP1, "CSuplPos::EncodePosPayloadL() Error\n");
-		return ProcessAsn1Error(err);
-		}
-	
-	// set the SUPL payload length to the encoded payload.
-	iData->message.u.msSUPLPOS->posPayLoad.u.rrlpPayload->numocts = payloadPtr.Length();
-	
-	SUPLLOG(ELogP1, "CSuplPos::EncodePosPayloadL() End\n");
-	return KErrNone;
-	}
-
-/** 
-ConvertHorSpeedToMetersPerSecond()
-
-Converts received speed value N to meters per second, according to
-3GPP GAD:
-
-for N = 0 					N <= h < N+0.5
-for 0 < N < 2^16-1			N-0.5 <= h < N+0.5
-for N=2^16-1				N-0.5 <= h
-
-where h = speed in km/hour
-
-@param  aSpeed - the received, encoded speed N.
-@return the uncertainty speed in meters per second.
-*/
-TReal32 CSuplPos::ConvertHorSpeedToMetersPerSecond(TUint aSpeed)
-	{
-	SUPLLOG(ELogP1, "CSuplPos::ConvertHorSpeedToMetersPerSecond() Begin\n");
-	TReal32 kph;
-	if (aSpeed == 0)
-		{
-		kph = 0;
-		}
-	else if (aSpeed < 65536)
-		{
-		kph = aSpeed - 0.5;
-		}
-	else
-		{
-		kph = 65535 - 0.5;
-		}
-	
-	TReal32 metersPerSec = kph / 3.6;
-	SUPLLOG(ELogP1, "CSuplPos::ConvertHorSpeedToMetersPerSecond() End\n");
-	return metersPerSec;
-	}
-
-/** 
-ConvertHorSpeedAccuracyToMetersPerSecond()
-
-Converts received speed uncertainty value N to meters per second, according to
-3GPP GAD:
-
-Uncertainty is encoded in increments of 1 kilometer per hour using an 8bit
-encoded number N. N is therefore the uncertainty speed in kmph, except for 
-N=255 which indicates that the uncertainty is not specified
-
-@param  aSpeedAccuracy - the received, encoded uncertainty speed N.
-@return the uncertainty speed in meters per second.
-*/
-TReal32 CSuplPos::ConvertHorSpeedAccuracyToMetersPerSecond(TUint aSpeedAccuracy)
-	{
-	SUPLLOG(ELogP1, "CSuplPos::ConvertHorSpeedAccuracyToMetersPerSecond() Begin\n");
-	TReal32 metersPerSec = aSpeedAccuracy / 3.6;
-	SUPLLOG(ELogP1, "CSuplPos::ConvertHorSpeedAccuracyToMetersPerSecond() End\n");
-	return metersPerSec;
-	}
-
-/** 
-Prints the content payload data structure to the logger 
-*/
-void CSuplPos::LogPayload()
-	{
-	if (iPosPayload)
-		{
-		iPosPayload->LogMessageContent();
-		}
-	}
-