--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/supl/locationomasuplprotocolhandler/protocolhandlerver1/src/epos_comasuplposinitstate.cpp Tue Feb 02 01:06:48 2010 +0200
@@ -0,0 +1,1600 @@
+/*
+* Copyright (c) 2002-2005 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: class for handling SUPL_POS_INIT message...
+*
+*/
+
+
+
+#include <etelmm.h>
+#include <hash.h>
+#include <f32file.h>
+#include <flogger.h>
+#include <lbs/epos_comasuplpossessionbase.h>
+#include "utf.h"
+#include "epos_comasupllocationid.h"
+#include "lbs/epos_comasuplreqasstdata.h"
+#include "lbs/epos_comasuplinforequestlist.h"
+#include "lbs/epos_comasuplsetcapabilities.h"
+#include "lbs/epos_comasuplpospayload.h"
+#include "lbs/epos_comasuplposition.h"
+#include "lbs/epos_comasuplvelocity.h"
+
+#include "epos_comasuplsession.h"
+#include "epos_comasuplposinit.h"
+#include "epos_comasuplposinitstate.h"
+#include "epos_comasuplposrequestor.h"
+#include "epos_omasuplconstants.h"
+#include "epos_comasupltrace.h"
+
+
+_LIT(KTraceFileName,"SUPL_OMA_SESSION::EPos_COMASuplPosInitState.cpp");
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// COMASuplPosInitState::COMASuplPosInitState
+// C++ constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+COMASuplPosInitState::COMASuplPosInitState(COMASuplSETCapabilities* aOldCapabilities,
+ RMobilePhone& aMobilePhone,TInt aMsgTimeout,
+ COMASuplPOSRequestor* aPosRequestor,
+ COMASuplSession::TOMASuplReqType aRequestType,
+ COMASuplAsnHandlerBase* aOMASuplAsnHandlerBase):
+ COMASuplStartState(aMobilePhone,
+ aMsgTimeout,aPosRequestor,aOMASuplAsnHandlerBase),
+ iRequestType(aRequestType),
+ iPosPayloadPresent(EFalse),iIgnorePosData(EFalse),iRepeatedPosDataFetch(EFalse)
+ {
+ iCurrentState = ESUPL_POS_INIT;
+ iOldCapabilities = aOldCapabilities; // Caps recevied during SUPL_START from POS
+ iRes.FillZ();
+ iGenerationStatus = EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplPosInitState::~COMASuplPosInitState
+// -----------------------------------------------------------------------------
+//
+COMASuplPosInitState::~COMASuplPosInitState()
+ {
+ if(iHSLPAddress)
+ {
+ delete iHSLPAddress;
+ }
+
+ if(iEncodedSuplInit)
+ {
+ delete iEncodedSuplInit;
+ }
+
+ if(iLocationId)
+ {
+ delete iLocationId;
+ iLocationId=NULL;
+ }
+
+ if(iTrace)
+ {
+ iTrace->Trace(_L("COMASuplPosInitState::~COMASuplPosInitState..."), KTraceFileName, __LINE__);
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplPosInitState::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void COMASuplPosInitState::ConstructL(TInt aAllowedCapabilities, TOMASuplPosMethod aPosMethod, HBufC8* aEncodedSuplInit, HBufC8* aHSLPAddress)
+ {
+ COMASuplStartState::ConstructL(aAllowedCapabilities);
+ iTrace->Trace(_L(""), KTraceFileName, __LINE__);
+
+
+ switch(aPosMethod)
+ {
+ case EOMAAgpsSETAssisted:
+ {
+ iTrace->Trace(_L("EGpsSETAssisted"), KTraceFileName, __LINE__);
+ iPosMethod = COMASuplPosSessionBase::EGpsSETAssisted;
+ }
+ break;
+
+ case EOMAAgpsSETAssistedPref:
+ {
+ iTrace->Trace(_L("EOMAAgpsSETAssistedPref"), KTraceFileName, __LINE__);
+ iPosMethod = COMASuplPosSessionBase::EGpsSETAssistedPreferred;
+ }
+ break;
+
+ case EOMAAgpsSETBased:
+ {
+ iTrace->Trace(_L("EOMAAgpsSETBased"), KTraceFileName, __LINE__);
+ iPosMethod = COMASuplPosSessionBase::EGpsSETBased;
+ }
+ break;
+
+ case EOMAAgpsSETBasedPref:
+ {
+ iTrace->Trace(_L("EOMAAgpsSETBasedPref"), KTraceFileName, __LINE__);
+ iPosMethod = COMASuplPosSessionBase::EGpsSETBasedPreferred;
+ }
+ break;
+
+ case EOMAAutonomousGps:
+ {
+ iTrace->Trace(_L("EOMAAutonomousGps"), KTraceFileName, __LINE__);
+ iPosMethod = COMASuplPosSessionBase::EAutonomousGps;
+ }
+ break;
+
+ case EOMAFLT:
+ {
+ iTrace->Trace(_L("EOMAFLT"), KTraceFileName, __LINE__);
+ iPosMethod = COMASuplPosSessionBase::EAFLT;
+ }
+ break;
+
+ case EOMAeOTD:
+ {
+ iTrace->Trace(_L("EOMAeOTD"), KTraceFileName, __LINE__);
+ iPosMethod = COMASuplPosSessionBase::EeOTD;
+ }
+ break;
+
+ case EOMAoTDOA:
+ {
+ iTrace->Trace(_L("EOMAoTDOA"), KTraceFileName, __LINE__);
+ iPosMethod = COMASuplPosSessionBase::EoTDOA;
+ }
+ break;
+
+ case EOMANoPosition:
+ {
+ iTrace->Trace(_L("EOMANoPosition"), KTraceFileName, __LINE__);
+ iPosMethod = COMASuplPosSessionBase::ENoPosition;
+ }
+ break;
+
+ default:
+
+ {
+ iTrace->Trace(_L("default"), KTraceFileName, __LINE__);
+ iPosMethod = COMASuplPosSessionBase::EPositionUndefined;
+ }
+ break;
+ }
+
+ TBuf<128> msg(_L("COMASuplPosInitState::ConstructL... iPosMethod: "));
+ msg.AppendNum(iPosMethod);
+ iTrace->Trace(msg, KTraceFileName, __LINE__);
+
+ if(aEncodedSuplInit)
+ {
+ TInt len = aEncodedSuplInit->Length();
+ if(len > 0)
+ {
+ iEncodedSuplInit = HBufC8::NewL(len);
+ *iEncodedSuplInit = *aEncodedSuplInit;
+ }
+
+ }
+
+ if(aHSLPAddress)
+ {
+ TInt len = aHSLPAddress->Length();
+
+ if(len > 0)
+ {
+ iHSLPAddress = HBufC8::NewL(len);
+ *iHSLPAddress = *aHSLPAddress;
+ }
+
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplPosInitState::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+COMASuplPosInitState* COMASuplPosInitState::NewL(COMASuplSETCapabilities* aOldCapabilities,
+ RMobilePhone& aMobilePhone,TInt aMsgTimeout,
+ COMASuplPOSRequestor* aPosRequestor,TInt aAllowedCapabilities,
+ COMASuplSession::TOMASuplReqType aRequestType, TOMASuplPosMethod aPosMethod,
+ COMASuplAsnHandlerBase* aOMASuplAsnHandlerBase,
+ HBufC8* aEncodedSuplInit,
+ HBufC8* aHSLPAddress
+ )
+ {
+ COMASuplPosInitState* self = new ( ELeave ) COMASuplPosInitState(aOldCapabilities,
+ aMobilePhone,aMsgTimeout,aPosRequestor,aRequestType,aOMASuplAsnHandlerBase);
+ CleanupStack::PushL( self );
+ self->ConstructL(aAllowedCapabilities, aPosMethod, aEncodedSuplInit, aHSLPAddress);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplPosInitState::GenerateMessage
+// Generates SUPL_POS_INIT message
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt COMASuplPosInitState::GenerateMessageL()
+ {
+ iGenerationStatus = ETrue;
+ iTrace->Trace(_L("Start of COMASuplPosInitState::GenerateMessage"), KTraceFileName, __LINE__);
+ iVerPresent = ComputeSuplInitVerL();
+ if(iVerPresent)
+ {
+ iLocationIDRequestor->GetLocationID();
+ }
+ else
+ {
+ iMsgStateObserver->OperationCompleteL(KErrGeneral);
+ }
+ return KErrNone;
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplPosInitState::ComputeSuplInitVer
+// Generates SUPL_POS_INIT message
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool COMASuplPosInitState::ComputeSuplInitVerL()
+ {
+ if(iRequestType == COMASuplSession::ESUPL_TERMINAL)
+ {
+ return ETrue;
+ }
+
+ if(iEncodedSuplInit && (iEncodedSuplInit->Length()) > 0 &&
+ iHSLPAddress && iHSLPAddress->Length() > 0)
+ {
+ TInt blockSize = 64;
+ TChar ipad = 0x36;
+ TChar opad = 0x5c;
+ TBuf8<64> key0;
+ TInt i;
+
+ CMessageDigest* sha1 = CMessageDigestFactory::NewDigestLC(
+ CMessageDigest::ESHA1 );
+
+ // Step 1: Append 0x00 to the key to create a string of size = blocksize
+ key0.SetLength( blockSize );
+ key0.FillZ();
+
+ if ( iHSLPAddress->Length() != blockSize )
+ {
+ // If key greater than the block size of digest which is 64
+ // then hash the key to get a 20 byte code
+ if ( iHSLPAddress->Length() > blockSize )
+ {
+ TPtrC8 hashedKey = sha1->Hash(*iHSLPAddress );
+ for ( i = 0; i < hashedKey.Length(); i++ )
+ {
+ key0[i] = hashedKey[i];
+ }
+ sha1->Reset();
+ }
+ else if ( iHSLPAddress->Length() < blockSize )
+ {
+ for ( i = 0; i < iHSLPAddress->Length(); i++ )
+ {
+ key0[i] = (*iHSLPAddress)[i];
+ }
+ }
+ }
+ else
+ {
+ for ( i = 0; i < iHSLPAddress->Length(); i++ )
+ {
+ key0[i] = (*iHSLPAddress)[i];
+ }
+ }
+
+
+ // Step 2: XOR the string obtained in Step 1 with ipad
+ for ( TInt i = 0; i < blockSize; i++ )
+ {
+ iRes.Append( key0[i] ^ ipad );
+ }
+
+
+#ifdef PRINT_MESSAGE
+ iTrace->Trace(_L("ipad of server address "), KTraceFileName, __LINE__);
+ PrintHex(iRes,__LINE__);
+#endif
+
+ // Step 3: Append the message to the string resulting from Step 2
+ HBufC8* messageKeyString =
+ HBufC8::NewLC( iEncodedSuplInit->Size() + iRes.Size() );
+ messageKeyString->Des().Append( iRes );
+ messageKeyString->Des().Append( *iEncodedSuplInit );
+
+
+ // Step 4: Generate hash code of the string resulting in Step 3
+ TPtrC8 innerHashedMessage = sha1->Hash( messageKeyString->Des() );
+ HBufC8* step4Msg = HBufC8::NewLC(innerHashedMessage.Size());
+ step4Msg->Des().Append(innerHashedMessage);
+ sha1->Reset();
+
+
+ // Step 5: XOR the string obtained in Step 1 with opad
+ HBufC8* hmacString = HBufC8::NewLC( step4Msg->Size() + blockSize );
+ for ( TInt i = 0; i < blockSize; i++ )
+ {
+ hmacString->Des().Append( key0[i] ^ opad );
+ }
+
+
+#ifdef PRINT_MESSAGE
+ iTrace->Trace(_L("xor ofserver address with opad"), KTraceFileName, __LINE__);
+ PrintHex(hmacString->Des(),__LINE__);
+#endif
+
+ // Step 6: Append the string obtained in step 4 to the string
+ // obtained in Step 5
+ hmacString->Des().Append( step4Msg->Des() );
+
+
+ // Step 7: Generate hash code of the string resulting from Step 6
+ iRes.FillZ();
+ iRes.Zero();
+ TPtrC8 hmacSha1Code = sha1->Hash( hmacString->Des() );
+
+ // Truncate hash output to 64 bits
+ iRes.Copy( hmacSha1Code.Ptr(), 8 );
+
+ CleanupStack::PopAndDestroy( hmacString );
+ CleanupStack::PopAndDestroy( step4Msg );
+ CleanupStack::PopAndDestroy( messageKeyString );
+ CleanupStack::PopAndDestroy( sha1 );
+
+#ifdef PRINT_MESSAGE
+ iTrace->Trace(_L("Final ver..."), KTraceFileName, __LINE__);
+ PrintHex(iRes,__LINE__);
+#endif
+ return ETrue;
+ }
+
+ return EFalse;
+
+ }
+// -----------------------------------------------------------------------------
+// COMASuplPosInitState::GetPosParamsL
+// Collects the optional parameters for SUPL_POS_INIT
+// message from POS Message plugin
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void COMASuplPosInitState::GetPosParamsL()
+ {
+
+ iGenerationStatus = ETrue;
+
+ // Re-initialize the POS Requestor
+ if(iPosRequestor)
+ iPosRequestor->DestroyList();
+ iPosRequestor->CreateListL();
+
+ // Create SET capabilities object
+ iCurSetCapabilities = COMASuplSETCapabilities::NewL();
+
+ // Create the Request Assistance data object
+ iReqAsstData = COMASuplReqAsstData::NewL();
+
+ // Create Position
+ iPosition = COMASuplPosition::NewL();
+
+ // Create POS Payload
+ iPosPayload = COMASuplPosPayload::NewL();
+
+ // Create Velocity
+ iVelocity = COMASuplVelocity::NewL();
+
+
+ // Append the SUPL POS INIT optional parameters to the list
+ // in POS Requestor
+ iPosRequestor->AppendInfoRequest(iCurSetCapabilities);
+ iPosRequestor->AppendInfoRequest(iReqAsstData);
+ iPosRequestor->AppendInfoRequest(iPosition);
+ iPosRequestor->AppendInfoRequest(iPosPayload);
+ iPosRequestor->AppendInfoRequest(iVelocity);
+
+ // Set self as Observer to POS Requestor
+ iPosRequestor->SetObserver(this);
+
+ TBuf<128> msg(_L("Filling iPosMethod in iPosRequestor: "));
+ iTrace->Trace(msg, KTraceFileName, __LINE__);
+ if(iPosRequestor)
+ {
+ iAllowedCapabilitiesforPOS.SetAllowedCapabilities(EFalse, EFalse, EFalse, EFalse, EFalse, EFalse, EFalse, EFalse);
+ iPosRequestor->SetPosMethodAndAllowedCapabilities (iAllowedCapabilitiesforPOS,iPosMethod );
+ if(iHSLPAddress)
+ {
+ HBufC* slpAddress = CnvUtfConverter::ConvertToUnicodeFromUtf8L(*iHSLPAddress);
+ msg.Copy(_L("Filling iHSLPAddress in iPosRequestor: "));
+ msg.Append(*slpAddress);
+ iTrace->Trace(msg, KTraceFileName, __LINE__);
+ iPosRequestor->SetSLPAddressUsed(*slpAddress);
+ }
+ }
+ // Get the information from POS
+ if(iPosRequestor)
+ User::LeaveIfError(iPosRequestor->GetSuplInfoL());
+
+ }
+// -----------------------------------------------------------------------------
+// COMASuplPosInitState::OperationCompleteL
+// An observer method that indicates the completion of
+// data retrieval from POS Message plugin
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void COMASuplPosInitState::OperationCompleteL(TInt aError )
+ {
+ if(iMsgStateObserver)
+ {
+ iGenerationStatus = EFalse;
+ if(aError == KErrNone)
+ {
+ iLocationIDRequestor->GetComparisionLocationID();
+ }
+ else
+ iMsgStateObserver->OperationCompleteL(aError);
+ }
+ }
+// -----------------------------------------------------------------------------
+// COMASuplPosInitState::ValidateSetCapabilities
+// Collects the optional parameters for SUPL_POS_INIT
+// message from POS Message plugin
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt COMASuplPosInitState::ValidateSetCapabilities()
+ {
+ if(!iPosRequestor || iRequestType == COMASuplSession::ESUPL_NETWORK ) //No need to check status if POS is not there
+ {
+ return KErrNone;
+ }
+
+ TInt status = iCurSetCapabilities->Status(); // Caps from POS
+
+ if(status == KErrNone)
+ {
+
+
+ TOMASuplPosTechnology oldPosTech, curPosTech;
+ COMASuplSETCapabilities::TOMASuplPrefMethod oldPrefMethod, curPrefMethod;
+ TOMASuplPosProtocol oldPosProtocol, curPosProtocol;
+
+ iOldCapabilities->GetSETCapabilities(oldPosTech, oldPrefMethod, oldPosProtocol);
+
+ iCurSetCapabilities->GetSETCapabilities(curPosTech, curPrefMethod, curPosProtocol);
+
+ TBool oldGpsSETAssisted, curGpsSETAssisted, oldGpsSETBased, curGpsSETBased;
+ TBool oldAutonomousGps, curAutonomousGps, oldaFLT, curaFLT, oldAeOTD, curAeOTD;
+ TBool oldOTDOA, curoTDOA;
+
+ oldPosTech.GetPosTechnology(oldGpsSETAssisted, oldGpsSETBased, oldAutonomousGps, oldaFLT,
+ oldAeOTD, oldOTDOA);
+
+ curPosTech.GetPosTechnology(curGpsSETAssisted, curGpsSETBased, curAutonomousGps, curaFLT,
+ curAeOTD, curoTDOA);
+
+ if((oldGpsSETAssisted == curGpsSETAssisted) && (oldGpsSETBased == curGpsSETBased) &&
+ (oldAutonomousGps == curAutonomousGps) && (oldaFLT == curaFLT) && (oldAeOTD == curAeOTD)
+ && (oldOTDOA == curoTDOA))
+ {
+ TBool oldTIA801, curTIA801, oldRRLP, curRRLP, oldRRC, curRRC;
+
+ oldPosProtocol.GetPosProtocol(oldTIA801, oldRRLP, oldRRC);
+ curPosProtocol.GetPosProtocol(curTIA801, curRRLP, curRRC);
+
+ if((oldTIA801 == curTIA801) && (oldRRLP == curRRLP) && (oldRRC == curRRC))
+ {
+ if(oldPrefMethod == curPrefMethod)
+ {
+ return KErrNone;
+ }
+ }
+ }
+
+ return KErrOMASETCapMisMatch;
+
+ }
+
+ return status;
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// COMASuplPosInitState::EncodeMessageL
+// Encodes message ...returns encoded data
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+HBufC8* COMASuplPosInitState::EncodeMessageL(TOMASuplVersion &aSuplVersion,
+ COMASuplSessionID* aSessionId,TInt &aError)
+ {
+
+ TInt error = KErrNone;
+
+ iTrace->Trace(_L("Start of COMASuplPosInitState::EncodeMessageL"), KTraceFileName, __LINE__);
+ COMASuplState::EncodeMessageL(aSuplVersion,aSessionId,aError);
+
+ if(iRequestType == COMASuplSession::ESUPL_NETWORK )
+ {
+ UpdateCapabilities(); //update with caps from POS
+ }
+
+ aError = ValidateSetCapabilities();
+ if(aError != KErrNone)
+ {
+ return NULL;
+ }
+
+ COMASuplAsnMessageBase* OMASuplMessageBase = iOMASuplAsnHandlerBase->CreateOMASuplMessageL(COMASuplAsnMessageBase::ESUPL_POSINIT);
+ COMASuplPosInit* OMASuplPosInit = static_cast<COMASuplPosInit*>(OMASuplMessageBase);
+ CleanupStack::PushL(OMASuplMessageBase);
+
+ iTrace->Trace(_L("Created COMASuplPosInit"), KTraceFileName, __LINE__);
+
+ OMASuplPosInit->SetMessageBase(aSuplVersion,aSessionId);
+
+ if(iEncodedSuplInit)
+ {
+ OMASuplPosInit->SetVer(iRes);
+ }
+
+ //iLocationId ownership will be with "this" class
+ ComputeCapabilities();
+
+ if(iOldCapabilities && iPosRequestor)
+ {
+ iTrace->Trace(_L("Filling capability for POS....."), KTraceFileName, __LINE__);
+
+ TOMASuplPosTechnology posTech;
+ COMASuplSETCapabilities::TOMASuplPrefMethod prefMethod;
+ TOMASuplPosProtocol posProtocol;
+
+ iOldCapabilities->GetSETCapabilities(posTech, prefMethod, posProtocol);
+
+ TBool aGpsSetAssisted, aGpsSetBased, autonomousGps, AFLT, EOTD, OTDOA;
+ posTech.GetPosTechnology(aGpsSetAssisted, aGpsSetBased, autonomousGps, AFLT, EOTD, OTDOA);
+
+ iAllowedCapabilitiesforPOS.SetAllowedCapabilities(aGpsSetAssisted, aGpsSetBased, autonomousGps, AFLT, EOTD, OTDOA, ETrue, ETrue);
+
+ iPosRequestor->SetPosMethodAndAllowedCapabilities (iAllowedCapabilitiesforPOS,iPosMethod );
+ }
+
+ OMASuplPosInit->SetSuplPosInit(static_cast<COMASuplSETCapabilities*>(iOldCapabilities->CloneL()),static_cast<COMASuplLocationId*>(iLocationId->CloneL()),iECId);
+ if(iECId)
+ {
+ OMASuplPosInit->SetECellId(iMmCellInfo);
+ }
+
+ // Fill up the optional parameters
+
+ // Requested Assistance Data
+ if(iReqAsstData)
+ {
+ if(KErrNone == iReqAsstData->Status())
+ {
+ COMASuplReqAsstData* reqAsstData =static_cast <COMASuplReqAsstData *> (iReqAsstData->CloneL());
+ OMASuplPosInit->SetRequestAssistanceData(reqAsstData);
+ }
+ }
+
+ // Position
+ if(iPosition)
+ {
+ if(KErrNone == iPosition->Status() && !iIgnorePosData) //if iIgnorePosData is set do not use the pos data
+ {
+ COMASuplPosition* position =static_cast <COMASuplPosition *>(iPosition->CloneL());
+ position->SetType(COMASuplInfoRequest::EOMASuplPosition);
+ OMASuplPosInit->SetPosition(position);
+ }
+ else if(iIgnorePosData)
+ iTrace->Trace(_L("COMASuplPosInitState::EncodeMessageL ignoring pos data"), KTraceFileName, __LINE__);
+ iIgnorePosData = EFalse; //reset the status back as we ignored pos data once
+ }
+
+ // POS Payload
+ if(iPosPayload)
+ {
+ if(KErrNone == iPosPayload->Status())
+ {
+ COMASuplPosPayload *posPayload = static_cast <COMASuplPosPayload *>(iPosPayload->CloneL());
+ StripPospayLoadL();
+ OMASuplPosInit->SetSuplPosPayload(posPayload);
+ iPosPayloadPresent = ETrue;
+ }
+ }
+
+ // Velocity
+ if(iVelocity)
+ {
+ if(KErrNone == iVelocity->Status())
+ {
+ COMASuplHorizVelocity* horVel = iVelocity->Velocity();
+ if(!horVel)
+ {
+ horVel = COMASuplHorizVelocity::NewL();
+ iVelocity->SetVelocity(horVel);
+ }
+ COMASuplVelocity *velocity =static_cast <COMASuplVelocity *>(iVelocity->CloneL());
+ OMASuplPosInit->SetVelocity(velocity);
+ }
+ }
+#ifdef PRINT_MESSAGE
+
+ LogSETCapabilities();
+ LogPosPayloadData();
+ LogPosition();
+ LogReqAssistanceData();
+ if(iVelocity)
+ {
+ if(KErrNone == iVelocity->Status())
+ {
+ iTrace->Trace(_L("Velocity data in SUPL_POSINIT "), KTraceFileName, __LINE__);
+ LogVelocity(iVelocity);
+ }
+ else
+ {
+ iTrace->Trace(_L("No Velocity data provided for SUPL_POSINIT by POS message plugin"), KTraceFileName, __LINE__);
+ }
+ }
+#endif
+
+ iTrace->Trace(_L("Starting Encoding...SUPL_POS_INIT"), KTraceFileName, __LINE__);
+
+ HBufC8 *encodedBuffer = NULL;
+
+ TRAPD(err,encodedBuffer = iOMASuplAsnHandlerBase->EncodeL(OMASuplPosInit,error));
+ CleanupStack::PopAndDestroy(OMASuplMessageBase);
+
+
+ if ( error == KErrNone && err == KErrNone )
+ {
+ iTrace->Trace(_L("Encoding Done..."), KTraceFileName, __LINE__);
+ aError = KErrNone;
+#ifdef PRINT_MESSAGE
+ RFile file;
+ RFs fs;
+ TInt cErr=fs.Connect();
+ TInt fErr = file.Open(fs,_L("c:\\logs\\epos\\packet.txt"),EFileWrite|EFileShareAny);
+ if (fErr == KErrNotFound)
+ {
+ file.Create(fs, _L("c:\\logs\\epos\\packet.txt"), EFileWrite|EFileShareAny);
+ fErr = file.Open(fs,_L("c:\\logs\\epos\\packet.txt"),EFileWrite|EFileShareAny);
+ }
+ TInt aPos;
+ file.Seek(ESeekEnd, aPos);
+ _LIT8(KMsgType, "SUPL POS INIT");
+ file.Write(KMsgType);
+ file.Write(_L8("\r \n"));
+ file.Write(*encodedBuffer);
+ file.Write(_L8("\r \n"));
+ file.Close();
+ fs.Close();
+#endif
+ return encodedBuffer;
+ }
+ else
+ {
+ iTrace->Trace(_L("Encoding Failed."), KTraceFileName, __LINE__);
+ if( error == KErrNone)
+ {
+ delete iLocationId;
+ iLocationId = NULL;
+ }
+ aError = error;
+ delete encodedBuffer;
+ encodedBuffer = NULL;
+ }
+ return NULL;
+ }
+
+void COMASuplPosInitState::GetPositionComplete(TInt /*aError*/)
+{
+}
+
+
+// -----------------------------------------------------------------------------
+// COMASuplPosInitState::ComparisionLocationIDRequestCompletedL
+// Gets called when location request for comparision completed
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void COMASuplPosInitState::ComparisionLocationIDRequestCompletedL(COMASuplLocationId* aLocationId,
+ TInt aErrorCode)
+ {
+
+ iTrace->Trace(_L("COMASuplPosInitState::ComparisionLocationIDRequestCompletedL..."), KTraceFileName, __LINE__);
+
+ if(aErrorCode!=KErrNone)
+ {
+ iTrace->Trace(_L("COMASuplPosInitState::ComparisionLocationIDRequestFailed"), KTraceFileName, __LINE__);
+ if(iMsgStateObserver)
+ {
+ iMsgStateObserver->OperationCompleteL(aErrorCode);
+ return;
+ }
+ }
+ //if the current Cell id is the same as the Cell id when we made the request for assistance data then use the assistance data
+ //and we have not already repeated a request before
+ if(!iRepeatedPosDataFetch && iLocationId->GetCellId() == aLocationId->GetCellId())
+ {
+ iTrace->Trace(_L("COMASuplPosInitState::ComparisionLocationIDRequestCompletedL Cell Id not changed since making last request, so continuing"), KTraceFileName, __LINE__);
+ if(iLocationId)
+ delete iLocationId;
+ iLocationId = aLocationId;
+ if(iMsgStateObserver)
+ iMsgStateObserver->OperationCompleteL(aErrorCode);
+ }
+ else // Cell id has changed since previous request so assistance data may be invalid
+ {
+ iTrace->Trace(_L("COMASuplPosInitState::ComparisionLocationIDRequestCompletedL Cell Id changed since making last request, retrieving toe limit"), KTraceFileName, __LINE__);
+ TOMASuplNavigationModel navModel;
+ if(KErrNone == iReqAsstData->GetNavigationData(navModel))
+ {
+ TInt gpsWeek, gpsToe, NSAT, toeLimit;
+ navModel.GetNavigationModel(gpsWeek, gpsToe, NSAT, toeLimit);
+ if(toeLimit >= KMaxCellIdChangeToeLimit)
+ {
+ iTrace->Trace(_L("COMASuplPosInitState::ComparisionLocationIDRequestCompletedL toe limit greater than KMaxCellIdChangeToeLimit. getting pos data again"), KTraceFileName, __LINE__);
+ if(!iRepeatedPosDataFetch)//if cell id changed and we have not already repeated fetching pos data
+ {
+ iRepeatedPosDataFetch = ETrue;
+ if(iLocationId)
+ delete iLocationId;
+ iLocationId = aLocationId; //update the location id member for the next request as we are making a request again
+ iTrace->Trace(_L("COMASuplPosInitState::ComparisionLocationIDRequestCompletedL toe limit greater than KMaxCellIdChangeToeLimit. getting pos data again"), KTraceFileName, __LINE__);
+ GetPosParamsL();
+ }
+ else
+ {
+ iRepeatedPosDataFetch = EFalse; //reset the status
+ if(iLocationId)
+ delete iLocationId;
+ iLocationId = aLocationId;
+ iTrace->Trace(_L("COMASuplPosInitState::ComparisionLocationIDRequestCompletedL toe limit greater than KMaxCellIdChangeToeLimit. But repeated a pos fetch already so continuing"), KTraceFileName, __LINE__);
+ iMsgStateObserver->OperationCompleteL(aErrorCode);//use the pos data as it is
+ }
+ }
+ else //ignore the position data
+ {
+ iIgnorePosData = ETrue;
+ iTrace->Trace(_L("COMASuplPosInitState::ComparisionLocationIDRequestCompletedL toe limit less than KMaxCellIdChangeToeLimit. Ignoring pos data"), KTraceFileName, __LINE__);
+ iRepeatedPosDataFetch = EFalse; //reset the status
+ if(iLocationId)
+ delete iLocationId;
+ iLocationId = aLocationId;
+ iMsgStateObserver->OperationCompleteL(aErrorCode);
+ }
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// COMASuplPosInitState::ComputeCapabilities
+// Does ANDing of SETCapabilities with AllowedCapabilities & stores in SETCapabilities
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void COMASuplPosInitState::ComputeCapabilities()
+{
+ iTrace->Trace(_L("Start of COMASuplPosInitState::ComputeCapabilities"), KTraceFileName, __LINE__);
+
+ TOMASuplPosProtocol SETposProtocol;
+ COMASuplSETCapabilities::TOMASuplPrefMethod SETprefMethod;
+ TOMASuplPosTechnology SETposTechnology;
+
+ TOMASuplPosProtocol AllowedposProtocol;
+ COMASuplSETCapabilities::TOMASuplPrefMethod AllowedprefMethod;
+ TOMASuplPosTechnology AllowedposTechnology;
+
+ TBool SETGpsSETAssisted,AllowedGpsSETAssisted;
+ TBool SETGpsSETBased,AllowedGpsSETBased;
+ TBool SETAutonomousGps,AllowedAutonomousGps;
+ TBool SETeOTD,AllowedeOTD;
+ TBool SEToTDOA,AllowedoTDOA;
+ TBool SETFLT, AllowedFLT;
+ TBool SETTIA801,AllowedTIA801;
+ TBool SETRRLP,AllowedRRLP;
+ TBool SETRRC,AllowedRRC;
+
+ iOldCapabilities->GetSETCapabilities(SETposTechnology,SETprefMethod,SETposProtocol);
+ iAllowedCapabilities->GetSETCapabilities(AllowedposTechnology,AllowedprefMethod,AllowedposProtocol);
+
+ SETposTechnology.GetPosTechnology(SETGpsSETAssisted,SETGpsSETBased,SETAutonomousGps,SETFLT,
+ SETeOTD,SEToTDOA);
+ SETposProtocol.GetPosProtocol(SETTIA801,SETRRLP,SETRRC);
+
+ AllowedposTechnology.GetPosTechnology(AllowedGpsSETAssisted,AllowedGpsSETBased,AllowedAutonomousGps,AllowedFLT,
+ AllowedeOTD,AllowedoTDOA);
+ SETposProtocol.GetPosProtocol(AllowedTIA801,AllowedRRLP,AllowedRRC);
+ AllowedprefMethod = COMASuplSETCapabilities::EOMANoPreferred;
+
+ SETGpsSETAssisted &= AllowedGpsSETAssisted;
+ SETGpsSETBased &= AllowedGpsSETBased;
+ SETAutonomousGps &= AllowedAutonomousGps;
+
+ SETFLT &= AllowedFLT;
+ SETeOTD &=AllowedeOTD;
+ SEToTDOA &=AllowedoTDOA;
+
+ SETTIA801 &= AllowedTIA801;
+ SETRRLP &= AllowedRRLP;
+ SETRRC &= AllowedRRC;
+
+ SETposTechnology.SetPosTechnology(SETGpsSETAssisted,SETGpsSETBased,SETAutonomousGps,SETFLT,
+ SETeOTD,SEToTDOA);
+
+ SETposProtocol.SetPosProtocol(SETTIA801,SETRRLP,SETRRC);
+
+ //If client has restricted SETBased and still POS msg plugin sets SETBasedPreferred.....then
+ // it as EOMANoPreferred
+
+ if(SETprefMethod == COMASuplSETCapabilities::EOMAAGpsSETBasedPreferred && (!SETGpsSETBased ))
+ {
+ SETprefMethod = COMASuplSETCapabilities::EOMANoPreferred;
+ }
+
+ if(SETprefMethod == COMASuplSETCapabilities::EOMAAGpsSETAssitedPreferred && (!SETGpsSETAssisted))
+ {
+ SETprefMethod = COMASuplSETCapabilities::EOMANoPreferred;
+ }
+
+ iOldCapabilities->SetSETCapabilities(SETposTechnology,SETprefMethod,SETposProtocol);
+
+ iTrace->Trace(_L("End of COMASuplPosInitState::ComputeCapabilities"), KTraceFileName, __LINE__);
+}
+
+// -----------------------------------------------------------------------------
+// COMASuplPosState::CancelOperation
+// Cancels Operation...which will be depend on derived class implementation
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void COMASuplPosInitState::CancelOperation()
+ {
+ COMASuplStartState::CancelOperation();
+ iTrace->Trace(_L("COMASuplPosState::CancelOperation..."), KTraceFileName, __LINE__);
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplPosState::UpdateCapabilities
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void COMASuplPosInitState::UpdateCapabilities()
+ {
+ if(!iPosRequestor)
+ {
+ return;
+ }
+
+ TOMASuplPosTechnology curPosTech;
+ COMASuplSETCapabilities::TOMASuplPrefMethod curPrefMethod;
+ TOMASuplPosProtocol curPosProtocol;
+ iCurSetCapabilities->GetSETCapabilities(curPosTech, curPrefMethod, curPosProtocol);
+ iOldCapabilities->SetSETCapabilities(curPosTech, curPrefMethod, curPosProtocol);
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplPosState::IsGenerationInProgress
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool COMASuplPosInitState::IsGenerationInProgress()
+ {
+ return iGenerationStatus;
+ }
+
+// -----------------------------------------------------------------------------
+// COMASuplPosInitState::StartTimer
+// StartTimer...starts the timer ...
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void COMASuplPosInitState::StartTimer()
+{
+ iTrace->Trace(_L("COMASuplPosInitState::StartTimer..."), KTraceFileName, __LINE__);
+ if(!iPosPayloadPresent)
+ {
+ iTrace->Trace(_L("Timer Started"), KTraceFileName, __LINE__);
+ COMASuplState::StartTimer();
+ }
+ else
+ {
+ iTrace->Trace(_L("Timer Not Started"), KTraceFileName, __LINE__);
+ }
+}
+
+
+TBool COMASuplPosInitState::IsPosPayloadPresent()
+{
+ if(iPosPayloadPresent)
+ {
+ return ETrue;
+ }
+ else
+ {
+ return EFalse;
+ }
+
+}
+
+// -----------------------------------------------------------------------------
+// COMASuplPosInitState::StripPospayLoadL
+// Strip the data if it exceeds more than 8 KB
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void COMASuplPosInitState::StripPospayLoadL()
+{
+ HBufC8* payload;
+ COMASuplPosPayload::TOMASuplPosPayloadType payloadType;
+
+ iPosPayload->GetPosPayload(payload,payloadType);
+
+ if(! payload)
+ {
+ return;
+ }
+
+ TInt len = payload->Length();
+ if(len > KMaxPosPayloadLength) //Strip the data if it exceeds more than 8 Kb
+ {
+ HBufC8* remainingPospayloadData = HBufC8::NewL(len - KMaxPosPayloadLength);
+ remainingPospayloadData->Des().Copy(payload->Des().Mid(KMaxPosPayloadLength));// Copy rest data
+ iRemainingPospayload = static_cast <COMASuplPosPayload *>(iPosPayload->CloneL()); // Ownnership will not be with this class
+ iRemainingPospayload->SetPosPayload(remainingPospayloadData,payloadType);
+ payload->Des().Copy(payload->Des().Left(KMaxPosPayloadLength));// Remove rest of data
+ LogPacket(payload->Des());
+ }
+
+ //Remove following code after testing...
+ iPosPayload->GetPosPayload(payload,payloadType);
+ len = payload->Length();
+
+}
+
+// -----------------------------------------------------------------------------
+// COMASuplPosInitState::GetRemainingPospayLoadL
+// Copies remaining PosPayload data to send with SUPL_POS
+// Callee gets ownership....
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+COMASuplPosPayload* COMASuplPosInitState::GetRemainingPospayLoadL()
+{
+ return iRemainingPospayload;
+}
+
+
+void COMASuplPosInitState::LogSETCapabilities()
+ {
+
+#ifdef PRINT_MESSAGE
+
+ if(iSETCapabilities)
+ {
+ iTrace->Trace(_L("SET Capabilities in POS INIT....."), KTraceFileName, __LINE__);
+
+ TOMASuplPosTechnology posTech;
+ COMASuplSETCapabilities::TOMASuplPrefMethod prefMethod;
+ TOMASuplPosProtocol posProtocol;
+
+ if(iOldCapabilities)
+ iOldCapabilities->GetSETCapabilities(posTech, prefMethod, posProtocol);
+
+ TBuf <200> posTechStr;
+ posTechStr.Append(_L("POS Technologies - "));
+ TBool gpsSetAssisted, gpsSetBased, autonomousGps, AFLT, EOTD, OTDOA;
+ posTech.GetPosTechnology(gpsSetAssisted, gpsSetBased, autonomousGps, AFLT, EOTD, OTDOA);
+
+ if(gpsSetAssisted) posTechStr.Append(_L(" AGPS SET Assisted "));
+ if(gpsSetBased) posTechStr.Append(_L(" AGPS SET Based "));
+ if(autonomousGps) posTechStr.Append(_L(" Autonomous GPS "));
+ if(AFLT) posTechStr.Append(_L(" AFLT "));
+ if(EOTD) posTechStr.Append(_L(" EOTD "));
+ if(OTDOA) posTechStr.Append(_L(" OTDOA "));
+
+ iTrace->Trace(posTechStr, KTraceFileName, __LINE__);
+
+ TBuf <80> prefMethodStr;
+ prefMethodStr.Append(_L("Preferred Method - "));
+
+ switch(prefMethod)
+ {
+ case COMASuplSETCapabilities::EOMAAGpsSETAssitedPreferred:
+ prefMethodStr.Append(_L(" AGPS SET Assisted Preferred"));
+ break;
+ case COMASuplSETCapabilities::EOMAAGpsSETBasedPreferred:
+ prefMethodStr.Append(_L(" AGPS SET Based Preferred"));
+ break;
+ case COMASuplSETCapabilities::EOMANoPreferred:
+ prefMethodStr.Append(_L(" No Preference"));
+ break;
+ }
+
+ iTrace->Trace(prefMethodStr, KTraceFileName, __LINE__);
+
+ TBuf <80> posProtocolStr;
+ posProtocolStr.Append(_L("POS Protocol - "));
+ TBool tia801, rrlp, rrc;
+
+ posProtocol.GetPosProtocol(tia801, rrlp, rrc);
+ if(tia801) posProtocolStr.Append(_L(" TIA 801 "));
+ if(rrlp) posProtocolStr.Append(_L(" RRLP "));
+ if(rrc) posProtocolStr.Append(_L(" RRC "));
+
+ iTrace->Trace(posProtocolStr, KTraceFileName, __LINE__);
+ }
+
+ // Location ID
+ if(iLocationId)
+ {
+ iTrace->Trace(_L("Location ID in POS_INIT......."), KTraceFileName, __LINE__);
+
+ TBuf<50> locationIDTypeStr;
+ locationIDTypeStr.Append(_L("Location ID Type - "));
+ COMASuplLocationId::TOMASuplCellInfoType cellInfoType;
+ COMASuplLocationId::TOMASuplStatus status;
+ TInt refMNC, refMcc, refCI, refLAC;
+ TInt err;
+
+ cellInfoType = iLocationId->SuplCellInfoType();
+ switch(cellInfoType)
+ {
+ case COMASuplLocationId::EGSM:
+ locationIDTypeStr.Append(_L(" GSM "));
+ iTrace->Trace(locationIDTypeStr, KTraceFileName, __LINE__);
+
+ COMASuplGSMCellInfo *gsmCellInfo ;
+
+ err = iLocationId->SuplLocationId(gsmCellInfo, status);
+ if(KErrNone == err)
+ {
+ TBuf <100> gsmCellInfoStr;
+ gsmCellInfoStr.Append(_L("GSM Cell Info - "));
+ gsmCellInfo->SuplGSMCellInfo(refMNC, refMcc, refCI, refLAC);
+ gsmCellInfoStr.Append(_L("MNC - "));
+ gsmCellInfoStr.AppendNum(refMNC);
+ gsmCellInfoStr.Append(_L(" MCC - "));
+ gsmCellInfoStr.AppendNum(refMcc);
+ gsmCellInfoStr.Append(_L(" CI - "));
+ gsmCellInfoStr.AppendNum(refCI);
+ gsmCellInfoStr.Append(_L(" LAC - "));
+ gsmCellInfoStr.AppendNum(refLAC);
+
+ iTrace->Trace(gsmCellInfoStr, KTraceFileName, __LINE__);
+ }
+ break;
+
+ case COMASuplLocationId::EWCDMA:
+ locationIDTypeStr.Append(_L(" WCDMA "));
+ iTrace->Trace(locationIDTypeStr, KTraceFileName, __LINE__);
+
+ COMASuplCellInfo *wcdmaCellInfo ;
+
+ err = iLocationId->SuplLocationId(wcdmaCellInfo, status);
+ if(KErrNone == err)
+ {
+ TBuf <100> wcdmaCellInfoStr;
+ wcdmaCellInfoStr.Append(_L("WCDMA Cell Info - "));
+ wcdmaCellInfo->SuplCellInfo(refMNC, refMcc, refCI);
+ wcdmaCellInfoStr.Append(_L(" MNC - "));
+ wcdmaCellInfoStr.AppendNum(refMNC);
+ wcdmaCellInfoStr.Append(_L(" MCC - "));
+ wcdmaCellInfoStr.AppendNum(refMcc);
+ wcdmaCellInfoStr.Append(_L(" CI - "));
+ wcdmaCellInfoStr.AppendNum(refCI);
+
+ iTrace->Trace(wcdmaCellInfoStr, KTraceFileName, __LINE__);
+ }
+
+ break;
+ }
+ TBuf <60> locationIdStatusStr;
+ locationIdStatusStr.Append(_L("Location ID Status - "));
+ switch(status)
+ {
+ case COMASuplLocationId::EStale:
+ locationIdStatusStr.Append(_L("Stale"));
+ break;
+ case COMASuplLocationId::ECurrent:
+ locationIdStatusStr.Append(_L("Current"));
+ break;
+ case COMASuplLocationId::EUnknown:
+ locationIdStatusStr.Append(_L("Unknown"));
+ break;
+ }
+ iTrace->Trace(locationIdStatusStr, KTraceFileName, __LINE__);
+ }
+
+
+#endif
+ }
+
+void COMASuplPosInitState::LogPosPayloadData()
+{
+
+#ifdef PRINT_MESSAGE
+
+ if(iPosPayload)
+ {
+ TInt posPosPayLoadError = iPosPayload->Status();
+ if(posPosPayLoadError != KErrNone )
+ {
+ iTrace->Trace(_L("No POS Payload data provided for SUPL_POSINIT by POS message plugin"), KTraceFileName, __LINE__);
+ return;
+ }
+
+ iTrace->Trace(_L("**************** Start of SUPL_POSINIT PosPayLoad provided by POS message plugin **********************"), KTraceFileName, __LINE__);
+
+ HBufC8* payLoad = NULL;
+ COMASuplPosPayload::TOMASuplPosPayloadType payLoadType;
+
+ iPosPayload->GetPosPayload(payLoad,payLoadType);
+ HBufC* payLoadBuffer = NULL;
+ if(payLoad)
+ {
+ TInt err;
+ TRAP(err,payLoadBuffer = HBufC::NewL(payLoad->Length()));
+ err = 0;
+ payLoadBuffer->Des().Copy(payLoad->Des());
+ }
+
+ if(payLoadType == COMASuplPosPayload::ETIA801)
+ {
+ iTrace->Trace(_L("POS DATA Type - ETIA801 "), KTraceFileName, __LINE__);
+ if(payLoadBuffer)
+ iTrace->Trace(payLoadBuffer->Des(),KTraceFileName, __LINE__);
+ }
+ else if(payLoadType == COMASuplPosPayload::ERRLP)
+ {
+ iTrace->Trace(_L("POS DATA Type - ERRLP "), KTraceFileName, __LINE__);
+ if(payLoadBuffer)
+ iTrace->Trace(payLoadBuffer->Des(),KTraceFileName, __LINE__);
+ }
+ else if(payLoadType == COMASuplPosPayload::ERRC)
+ {
+ iTrace->Trace(_L("POS DATA Type - ERRC "), KTraceFileName, __LINE__);
+ if(payLoadBuffer)
+ iTrace->Trace(payLoadBuffer->Des(),KTraceFileName, __LINE__);
+ }
+ delete payLoadBuffer;
+ payLoadBuffer = NULL;
+ }
+#endif
+}
+
+void COMASuplPosInitState::LogPosition()
+{
+
+#ifdef PRINT_MESSAGE
+ if(!iPosition)
+ return;
+
+ if(KErrNone != iPosition->Status())
+ {
+ iTrace->Trace(_L("No Position is provided by POS message plugin for SUPL_POSINIT "), KTraceFileName, __LINE__);
+ return;
+ }
+
+ TBuf <300> positionLog;
+ TOMASuplUtcTime utcTime;
+ TOMASuplPositionEstimate posEstimate;
+ TDateTime lDateTime;
+ TInt zoneCode;
+ TInt zone;
+ TInt error;
+ iTrace->Trace(_L("-------Start of Position in SUPL_POSINIT ----------"), KTraceFileName, __LINE__);
+
+ iPosition->GetPosition(utcTime,posEstimate );
+ utcTime.GetUtcTime(lDateTime,zoneCode,zone);
+
+ positionLog.Append(_L("UTC Time Log : "));
+ positionLog.Append(_L("Year : "));
+ positionLog.AppendNum(lDateTime.Year());
+ positionLog.Append(_L("Month : "));
+ positionLog.AppendNum(lDateTime.Month());
+ positionLog.Append(_L("Day : "));
+ positionLog.AppendNum(lDateTime.Day());
+ positionLog.Append(_L("Hour : "));
+ positionLog.AppendNum(lDateTime.Hour());
+ positionLog.Append(_L("Minute : "));
+ positionLog.AppendNum(lDateTime.Minute());
+ positionLog.Append(_L("Second : "));
+ positionLog.AppendNum(lDateTime.Second());
+ positionLog.Append(_L("MicroSecond : "));
+ positionLog.AppendNum(lDateTime.MicroSecond());
+ positionLog.Append(_L("Zone Code : "));
+ positionLog.AppendNum(zoneCode);
+ positionLog.Append(_L("Zone : "));
+ positionLog.AppendNum(zone);
+
+ iTrace->Trace(positionLog, KTraceFileName, __LINE__);
+
+ TOMASuplPositionEstimate::TOMASuplLatitudeSign latSign;
+ TInt latitude;
+ TInt longitude;
+ posEstimate.GetPositionEstimate(latSign,latitude,longitude);
+
+ positionLog.Copy(_L("Position Estimate : "));
+ positionLog.Append(_L(" latitude Sign : "));
+ positionLog.AppendNum(latSign);
+ positionLog.Append(_L(" Latitude : "));
+ positionLog.AppendNum(latitude);
+ positionLog.Append(_L(" Longitude : "));
+ positionLog.AppendNum(longitude);
+
+ iTrace->Trace(positionLog, KTraceFileName, __LINE__);
+
+ TOMASuplUncertainty uncertainty;
+ error = posEstimate.GetUncertainty(uncertainty);
+ if(!error)
+ {
+ TInt uncertSemiMajor;
+ TInt uncertSemiMinor;
+ TInt orientMajorAxis;
+ uncertainty.GetUncertainty(uncertSemiMajor,uncertSemiMinor,orientMajorAxis);
+
+ positionLog.Copy(_L("Uncertainity Information of Position "));
+ positionLog.Append(_L(" Uncertainity Semi Major : "));
+ positionLog.AppendNum(uncertSemiMajor);
+ positionLog.Append(_L(" Uncertainity Semi Minor : "));
+ positionLog.AppendNum(uncertSemiMinor);
+ positionLog.Append(_L(" Orientation Major Axis : "));
+ positionLog.AppendNum(orientMajorAxis);
+ iTrace->Trace(positionLog, KTraceFileName, __LINE__);
+ }
+ else
+ {
+ iTrace->Trace(_L("Error in retriving Uncertinity"), KTraceFileName, __LINE__);
+ }
+
+ // Retrieve Confidence
+ TInt confidence;
+ error = posEstimate.GetConfidence(confidence);
+ if(!error)
+ {
+ positionLog.Copy(_L("Confidence in Position : "));
+ positionLog.AppendNum(confidence);
+ iTrace->Trace(positionLog, KTraceFileName, __LINE__);
+ }
+ else
+ {
+ iTrace->Trace(_L("Error in retriving Confidence"), KTraceFileName, __LINE__);
+ }
+
+ TOMASuplAltitudeInfo altitudeInfo;
+ error = posEstimate.GetAltitudeInfo(altitudeInfo);
+ if(!error)
+ {
+ TOMASuplAltitudeInfo::TOMASuplAltitudeDirection altDirection;
+ TInt altitude;
+ TInt altUncert;
+ altitudeInfo.GetAltitudeInfo(altDirection,altitude,altUncert);
+
+ positionLog.Copy(_L("Altitude Information of Position "));
+
+ positionLog.Append(_L("Altitude Direction : "));
+ positionLog.AppendNum(altDirection);
+ positionLog.Append(_L(" Altitude : "));
+ positionLog.AppendNum(altitude);
+ positionLog.Append(_L(" Altitude Uncertainity : "));
+ positionLog.AppendNum(altUncert);
+ iTrace->Trace(positionLog, KTraceFileName, __LINE__);
+ }
+ else
+ {
+ iTrace->Trace(_L("Error in retriving AltitudeInfo"), KTraceFileName, __LINE__);
+ }
+
+
+ COMASuplVelocity* velocity = NULL;
+ error = iPosition->GetVelocity(velocity);
+ if(!error)
+ {
+ iTrace->Trace(_L("Velocity Information for position in SUPL_POS_INIT "), KTraceFileName, __LINE__);
+ LogVelocity(velocity);
+ }
+ else
+ {
+ iTrace->Trace(_L("Error in retriving Velocity"), KTraceFileName, __LINE__);
+ }
+
+ iTrace->Trace(_L("-------End of Position in SUPL_POSINIT ----------"), KTraceFileName, __LINE__);
+
+#endif
+
+}
+
+void COMASuplPosInitState::LogReqAssistanceData()
+{
+
+#ifdef PRINT_MESSAGE
+ if(!iReqAsstData)
+ return;
+
+ if(KErrNone != iReqAsstData->Status())
+ {
+ iTrace->Trace(_L("No Assistance data is provided by POS message plugin for SUPL_POSINIT "), KTraceFileName, __LINE__);
+ return;
+ }
+
+ iTrace->Trace(_L("-------Start of Assistance data in SUPL_POSINIT ----------"), KTraceFileName, __LINE__);
+ TOMASuplNavigationModel navModel;
+ TBool almanacReq, utcModel, ionModel, dgpsCorrect,
+ refeLocation, referenceTimeRequested,acquisition, realTime;
+
+ iReqAsstData->GetReqAsstData(almanacReq, utcModel, ionModel, dgpsCorrect, refeLocation,
+ referenceTimeRequested, acquisition, realTime);
+
+ TBuf <300> reqAsstDataStr;
+ reqAsstDataStr.Append(_L("Requested Assistance Data - "));
+
+ if(almanacReq) reqAsstDataStr.Append(_L(" Almanac Requested "));
+ if(utcModel) reqAsstDataStr.Append(_L(" UTC Model Requested "));
+ if(ionModel) reqAsstDataStr.Append(_L(" Ionospheric Model Requested "));
+ if(dgpsCorrect) reqAsstDataStr.Append(_L(" DGPS Corrections "));
+ if(refeLocation) reqAsstDataStr.Append(_L(" Reference Location "));
+ if(referenceTimeRequested) reqAsstDataStr.Append(_L(" Reference Time "));
+ if(acquisition) reqAsstDataStr.Append(_L(" Acquisition Assistance "));
+ if(realTime) reqAsstDataStr.Append(_L(" Real Time Integrity "));
+
+ iTrace->Trace(reqAsstDataStr, KTraceFileName, __LINE__);
+
+
+ if(KErrNone == iReqAsstData->GetNavigationData(navModel))
+ {
+ TBuf <80> satInfoStr;
+ satInfoStr.Append(_L("Satellite Info - "));
+
+ TInt gpsWeek, gpsToe, NSAT, toeLimit;
+ navModel.GetNavigationModel(gpsWeek, gpsToe, NSAT, toeLimit);
+
+ if(gpsWeek) satInfoStr.Append(_L(" GPS Week "));
+ if(gpsToe) satInfoStr.Append(_L(" GPS Toe "));
+ if(NSAT) satInfoStr.Append(_L(" NSAT "));
+ if(toeLimit) satInfoStr.Append(_L(" TOE Limit"));
+
+ iTrace->Trace(satInfoStr, KTraceFileName, __LINE__);
+
+ RArray<TOMASuplSatelliteInfoElement> satEleArr;
+
+ if(KErrNone == navModel.GetSatInfoElement(satEleArr))
+ {
+ TInt count = satEleArr.Count();
+ TBuf <50> satInfoElementStr;
+ satInfoElementStr.Append(_L("Number of Satellite Info Elements - "));
+ satInfoElementStr.AppendNum(count);
+ iTrace->Trace(satInfoElementStr, KTraceFileName, __LINE__);
+ if(count > 0)
+ {
+
+ TOMASuplSatelliteInfoElement satInfoEle;
+
+ for(TInt i = 0; i < count; i ++)
+ {
+ TInt err = navModel.GetSatInfoElement(satInfoEle, i);
+ TInt satId,iode;
+
+ satInfoEle.GetSatInfoElement(satId, iode);
+
+ TBuf<50> satInfoEleStr;
+ satInfoEleStr.Append(_L(" Satellite Info Element - "));
+ satInfoEleStr.AppendNum(satId);
+ satInfoEleStr.Append(_L(" "));
+ satInfoEleStr.AppendNum(iode);
+ iTrace->Trace(satInfoEleStr, KTraceFileName, __LINE__);
+ }
+ }
+ }
+ else
+ {
+ iTrace->Trace(_L("No Satelite Info OR error in retriving Satelite Info "), KTraceFileName, __LINE__);
+ }
+ satEleArr.Close();
+ }
+ else
+ {
+ iTrace->Trace(_L("Error in Getting Navigationl Data... "), KTraceFileName, __LINE__);
+ }
+
+ iTrace->Trace(_L("------- End of Assistance data in SUPL_POSINIT ----------"), KTraceFileName, __LINE__);
+
+#endif
+}
+
+void COMASuplPosInitState::LogVelocity(COMASuplVelocity*
+#ifdef PRINT_MESSAGE
+velocity
+#endif
+)
+{
+
+#ifdef PRINT_MESSAGE
+ if(velocity)
+ {
+
+ TBuf<256> msg;
+ TOMASuplVelocityType velocityType = velocity->VelType();
+ COMASuplHorizVelocity* horizVelocity = velocity->Velocity();
+ TUint16 bearing;
+ TUint16 horSpeed;
+ switch(velocityType)
+ {
+ case EHorizVelocity:
+ {
+ iTrace->Trace(_L("Velocity Type : EHorizVelocity - Values "), KTraceFileName, __LINE__);
+ horizVelocity->GetHorizVel(bearing,horSpeed);
+
+ msg.Append(_L("Bearing : "));
+ msg.AppendNum(bearing);
+ msg.Append(_L("Horizontal Speed : "));
+ msg.AppendNum(horSpeed);
+ iTrace->Trace(msg, KTraceFileName, __LINE__);
+ break;
+ }
+ case EHorizAndVertVelocity:
+ {
+ TUint8 verDirect;
+ TUint8 verSpeed;
+ COMASuplHorizAndVertVelocity* horizVertVel = (COMASuplHorizAndVertVelocity*)horizVelocity;
+ horizVertVel->GetHorizAndVertVel(bearing,horSpeed,verDirect,verSpeed);
+
+ iTrace->Trace(_L("Velocity Type : EHorizVelocity - Values "), KTraceFileName, __LINE__);
+
+ msg.Append(_L("Bearing : "));
+ msg.AppendNum(bearing);
+ msg.Append(_L("Horizontal Speed : "));
+ msg.AppendNum(horSpeed);
+ msg.Append(_L("Vertical Direction : "));
+ msg.AppendNum(verDirect);
+ msg.Append(_L("Vertical Speed : "));
+ msg.AppendNum(verSpeed);
+ iTrace->Trace(msg, KTraceFileName, __LINE__);
+
+ break;
+ }
+ case EHorizUncertVelocity:
+ {
+ TUint8 uncertSpeed;
+ COMASuplHorizUncertVelocity* horizUncertVel = (COMASuplHorizUncertVelocity*)horizVelocity;
+
+ horizUncertVel->GetHorizUncertVel(bearing,horSpeed,uncertSpeed);
+
+ iTrace->Trace(_L("Velocity Type : EHorizUncertVelocity - Values "), KTraceFileName, __LINE__);
+
+ msg.Append(_L("Bearing : "));
+ msg.AppendNum(bearing);
+ msg.Append(_L("Horizontal Speed : "));
+ msg.AppendNum(horSpeed);
+ msg.Append(_L("Uncertainity Speed : "));
+ msg.AppendNum(uncertSpeed);
+
+ iTrace->Trace(msg, KTraceFileName, __LINE__);
+
+ break;
+ }
+ case EHorizAndVertUncertVelocity:
+ {
+ TUint8 verDirect;
+ TUint8 verSpeed;
+ TUint8 horizUncertSpeed;
+ TUint8 vertUncertSpeed;
+
+ COMASuplHorizAndVertUncertVelocity* horizVertUncertVel = (COMASuplHorizAndVertUncertVelocity*)horizVelocity;
+
+ horizVertUncertVel->GetHorizVertUncertVel(bearing,horSpeed,verDirect,verSpeed,
+ horizUncertSpeed,vertUncertSpeed);
+
+ iTrace->Trace(_L("Velocity Type : EHorizAndVertUncertVelocity - Values "), KTraceFileName, __LINE__);
+
+ msg.Append(_L("Bearing : "));
+ msg.AppendNum(bearing);
+ msg.Append(_L("Horizontal Speed : "));
+ msg.AppendNum(horSpeed);
+ msg.Append(_L("Vertical Direction : "));
+ msg.AppendNum(verDirect);
+ msg.Append(_L("Vertical Speed : "));
+ msg.AppendNum(verSpeed);
+ msg.Append(_L("Horiz Uncertain Speed : "));
+ msg.AppendNum(horizUncertSpeed);
+ msg.Append(_L("Vertical Uncertain Speed : "));
+ msg.AppendNum(vertUncertSpeed);
+ iTrace->Trace(msg, KTraceFileName, __LINE__);
+
+ break;
+ }
+ }
+ }
+#endif
+}
+
+void COMASuplPosInitState::LogPacket(const TDesC8&
+#ifdef PRINT_MESSAGE
+aPacket
+#endif
+)
+{
+
+#ifdef PRINT_MESSAGE
+ RFile file;
+ RFs fs;
+ TInt cErr=fs.Connect();
+
+ TInt fErr = file.Open(fs,_L("c:\\logs\\epos\\POSINITpacket.txt"),EFileWrite|EFileShareAny);
+ if (fErr == KErrNotFound)
+ {
+ file.Create(fs, _L("c:\\logs\\epos\\POSINITpacket.txt"), EFileWrite|EFileShareAny);
+ fErr = file.Open(fs,_L("c:\\logs\\epos\\POSINITpacket.txt"), EFileWrite|EFileShareAny);
+ }
+
+ TInt aPos;
+ file.Seek(ESeekEnd, aPos);
+ file.Write(aPacket);
+ file.Close();
+ fs.Close();
+#endif
+}
+
+void COMASuplPosInitState::PrintHex(const TDesC8&
+#ifdef PRINT_MESSAGE
+aBuffer
+#endif
+,
+TInt
+#ifdef PRINT_MESSAGE
+aLine
+#endif
+)
+ {
+#ifdef PRINT_MESSAGE
+ TBuf<256> buffer;
+ TBuf<2> buff;
+ _LIT16(KFormat1,"%02x");
+ TInt len = aBuffer.Length();
+ for(TInt i = 0 ; i <len; i++)
+ {
+ buff.Zero();
+ buff.Format(KFormat1,aBuffer[i]);
+ buffer.Append(buff);
+ buffer.Append(_L(" "));
+ }
+
+ iTrace->Trace(buffer, KTraceFileName, aLine);
+#endif
+ }
+
+// End of File
+
+
+