--- /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;
+ }
+