networkprotocolmodules/common/suplrrlpasn1/src/suplstart.cpp
changeset 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocolmodules/common/suplrrlpasn1/src/suplstart.cpp	Tue Feb 02 01:50:39 2010 +0200
@@ -0,0 +1,260 @@
+// 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 "ULP.h"
+#include "suplstart.h"
+#include "supldevloggermacros.h" 
+#include "suplrrlpasn1common.h"
+#include <math.h>
+
+/**
+Default minimum horizontal accuracy in meters
+*/
+const TInt KLbsSuplMinHorAccDefault = 20;
+
+
+/**
+Static factory constructor
+*/
+EXPORT_C CSuplStart* CSuplStart::NewL()
+	{
+	SUPLLOG(ELogP1, "CSuplStart::NewL() Begin\n");
+	CSuplStart* self = CSuplStart::NewLC();
+	SUPLLOG(ELogP1, "CSuplStart::NewL() End\n");
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+/**
+Static factory constructor
+*/
+EXPORT_C CSuplStart* CSuplStart::NewLC()
+	{
+	SUPLLOG(ELogP1, "CSuplStart::NewL() Begin\n");
+	CSuplStart* self = new (ELeave) CSuplStart();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	SUPLLOG(ELogP1, "CSuplStart::NewLC() End\n");
+	return self;
+	}
+
+/** 
+Constructor 
+*/
+CSuplStart::CSuplStart()
+ : CSuplMessageBase::CSuplMessageBase(ESuplStart, ETrue)
+	{
+	SUPLLOG(ELogP1, "CSuplMessageBase::CSuplMessageBase() Begin\n");
+	SUPLLOG(ELogP1, "CSuplMessageBase::CSuplMessageBase() End\n");
+	}
+	
+
+/** 
+Second stage constructor 
+*/
+void CSuplStart::ConstructL()
+	{
+	// call the base class ConstructL() to create data structures
+	CSuplMessageBase::ConstructL();
+
+	// local reference to context object
+	OSCTXT* pctxt = iControl->getCtxtPtr();
+
+	iData->message.t =  T_UlpMessage_msSUPLSTART;
+	iData->message.u.msSUPLSTART = (ASN1T_SUPLSTART*)rtxMemAllocZ(pctxt, sizeof(ASN1T_SUPLSTART));
+   	LeaveIfAllocErrorL();
+	}
+	
+
+/**
+Destructor
+*/
+CSuplStart::~CSuplStart()
+	{
+	SUPLLOG(ELogP1, "CSuplStart::~CSuplStart() Begin\n");
+	SUPLLOG(ELogP1, "CSuplStart::~CSuplStart() End\n");
+	}
+
+
+/** 
+SetCapabilities()
+
+Populates the SET Capabilities parameter of the outgoing SUPL START message.
+
+SET Capabilities
+	- Pos Technology (m) Bitmask indicating technologies the SET supports
+	- Pref Method (m)    which GPS mode the SET prefers (TA, TB, noPref)
+	- Pos Protocol (m)   which underlying positioning protocols are supported
+
+@param  aCapabilities, current capabilities reported by LBS subsystem
+@return error indication, KErrNone otherwise
+*/
+EXPORT_C TInt CSuplStart::SetCapabilities(TLbsNetPosCapabilities& aCapabilities)
+	{
+	SUPLLOG(ELogP1, "CSuplStart::SetCapabilities() Begin\n");
+	__ASSERT_DEBUG(iData->message.u.msSUPLSTART != NULL, User::Invariant());
+	
+	TInt err = PopulateSetCapabilities(aCapabilities, iData->message.u.msSUPLSTART->sETCapabilities);
+
+	SUPLLOG(ELogP1, "CSuplStart::SetCapabilities() End\n");
+	return err;
+	}
+	
+
+/**	
+SetLocationId()
+
+Set the location ID parameter 
+
+Location ID - Describes the globally unique cell identification of the most current serving cell.
+	Cell Info (m) The following cell IDs are supported:
+		- GSM Cell Info
+		- WCDMA Cell Info
+		- CDMA Cell Info
+	Status (m) Describes whether or not the cell info is:
+		- Not Current, last known cell info
+		- Current, the present cell info
+		- Unknown (ie not known whether the cell id is current or not current)
+
+Note: The Status parameter does NOT apply to WCDMA optional parameters 
+(Frequency Info, Primary Scrambling Code and Measured Results List). Frequency
+Info, Primary Scrambling Code and Measured Results List, if present, are always
+considered to be correct for the current cell.
+
+@param  aLocationId, describes the current location
+@return error indication, KErrNone otherwise
+*/
+EXPORT_C TInt CSuplStart::SetLocationId(const CSuplLocationId& aLocationId)
+	{
+	__ASSERT_DEBUG(iData->message.u.msSUPLSTART != NULL, User::Invariant());
+	SUPLLOG(ELogP1, "CSuplStart::SetLocationId() Begin\n");
+	
+	TInt err = PopulateLocationId(aLocationId, iData->message.u.msSUPLSTART->locationId);
+
+	SUPLLOG(ELogP1, "CSuplStart::SetLocationId() End\n");
+	return err;
+	}
+
+
+/**	
+SetQoP()
+
+Set the QoP parameter 
+
+QoP - the desired quality of position
+	horacc    (m) (0..127)
+	veracc    (o) (0..127)
+	maxLocAge (o) (0..65535)
+	delay     (o) (0..7)
+
+@param  aQuality, the required quality of position
+@return error indication, KErrNone otherwise
+*/
+EXPORT_C TInt CSuplStart::SetQoP(TLbsNetPosRequestQuality& aQuality)
+	{
+	__ASSERT_DEBUG(iData->message.u.msSUPLSTART != NULL, User::Invariant());
+	SUPLLOG(ELogP1, "CSuplStart::SetQoP() Begin\n");
+
+	// pointer to message body
+	ASN1T_SUPLSTART* msgBody = iData->message.u.msSUPLSTART;
+	
+	// local reference to context object
+	iControl->getCtxtPtr();
+	
+	// indicate that the optional QoP component is present
+   	msgBody->m.qoPPresent = 1;
+	
+	// Horizontal accuracy
+	if (aQuality.MinHorizontalAccuracy() != 0)
+		{
+		msgBody->qoP.horacc = Uncertainty(aQuality.MinHorizontalAccuracy());
+		}
+	else
+		{
+		msgBody->qoP.horacc = Uncertainty(KLbsSuplMinHorAccDefault);
+		}
+	
+	// vertical accuracy
+	if (aQuality.MinVerticalAccuracy() != 0)
+		{
+		msgBody->qoP.veracc = UncertaintyAltitude(aQuality.MinVerticalAccuracy());
+		msgBody->qoP.m.veraccPresent = 1;
+		}
+		
+	// max location age / max fix age
+	TTimeIntervalMicroSeconds maxAge = aQuality.MaxFixAge();
+	if (maxAge.Int64() != 0)
+		{
+		TInt64 maxAgeSeconds = maxAge.Int64() / KLbsMilliSeconds;
+		if (maxAgeSeconds > 65535)
+			{
+			// limit to 16 bits (65535 = 2^16 - 1)
+			maxAgeSeconds = 65535;
+			}
+		msgBody->qoP.maxLocAge = maxAgeSeconds;
+		msgBody->qoP.m.maxLocAgePresent = 1;
+		}
+	
+	// delay / max fix time
+	TTimeIntervalMicroSeconds maxFixTime = aQuality.MaxFixTime();
+	if (maxFixTime.Int64() != 0)
+		{
+		msgBody->qoP.m.delayPresent = 1;
+		TInt seconds = maxFixTime.Int64() / KLbsMilliSeconds;
+		if (seconds <= 1)
+			{
+			msgBody->qoP.delay = 0;
+			}
+		else if (seconds <= 2)
+			{
+			msgBody->qoP.delay = 1;
+			}
+		else if (seconds <= 4)
+			{
+			msgBody->qoP.delay = 2;
+			}
+		else if (seconds <= 8)
+			{
+			msgBody->qoP.delay = 3;
+			}
+		else if (seconds <= 16)
+			{
+			msgBody->qoP.delay = 4;
+			}
+		else if (seconds <= 32)
+			{
+			msgBody->qoP.delay = 5;
+			}
+		else if (seconds <= 64)
+			{
+			msgBody->qoP.delay = 6;
+			}
+		else
+			{
+			// maximum value
+			msgBody->qoP.delay = 7;
+			}
+		}
+
+	SUPLLOG(ELogP1, "CSuplStart::SetQoP() End\n");
+	return KErrNone;
+	}
+