diff -r 000000000000 -r 9cfd9a3ee49c networkprotocolmodules/common/suplrrlpasn1/src/suplresponse.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networkprotocolmodules/common/suplrrlpasn1/src/suplresponse.cpp Tue Feb 02 01:50:39 2010 +0200 @@ -0,0 +1,245 @@ +// 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 "suplresponse.h" +#include "supldevloggermacros.h" + +/** +Static factory constructor +*/ +EXPORT_C CSuplResponse* CSuplResponse::NewL() + { + SUPLLOG(ELogP1, "CSuplResponse::NewL() Begin\n"); + CSuplResponse* self = new (ELeave) CSuplResponse(); + CleanupStack::PushL(self); + self->ConstructL(); + SUPLLOG(ELogP1, "CSuplResponse::NewL() End\n"); + CleanupStack::Pop(self); + return self; + } + +/** +Constructor +*/ +CSuplResponse::CSuplResponse() + : CSuplMessageBase::CSuplMessageBase(ESuplResponse, EFalse) + { + } + +/** +Second stage constructor +*/ +void CSuplResponse::ConstructL() + { + // call the base class ConstructL() to create common data structures + CSuplMessageBase::ConstructL(); + } + + +/** +Destructor +*/ +CSuplResponse::~CSuplResponse() + { + SUPLLOG(ELogP1, "CSuplResponse::~CSuplResponse() Begin\n"); + SUPLLOG(ELogP1, "CSuplResponse::~CSuplResponse() End\n"); + } + + +/** +GetPosMethod() + +The Positioning Method parameter of the SUPL RESPONSE message is the method +that SHALL be used for the SUPL POS session. + +@param aMethod on return, populated according to Pos Method parameter +@return error indication, KErrNone otherwise +*/ +EXPORT_C TInt CSuplResponse::GetPosMethod(TLbsNetPosRequestMethod& aMethod) + { + SUPLLOG(ELogP1, "CSuplResponse::GetPosMethod() Begin\n"); + __ASSERT_DEBUG(iData->message.u.msSUPLRESPONSE != NULL, User::Invariant()); + + // pointer to message body + ASN1T_SUPLRESPONSE* msgBody = iData->message.u.msSUPLRESPONSE; + + TLbsNetPosMethod posMethods[2]; + TInt numMethods = 1; + + switch (msgBody->posMethod) + { + case PosMethod::agpsSETassisted: + posMethods[0].SetPosMethod(KLbsPositioningMeansGps, TPositionModuleInfo::ETechnologyNetwork | TPositionModuleInfo::ETechnologyAssisted); + break; + + case PosMethod::agpsSETbased: + posMethods[0].SetPosMethod(KLbsPositioningMeansGps, TPositionModuleInfo::ETechnologyTerminal | TPositionModuleInfo::ETechnologyAssisted); + break; + + case PosMethod::agpsSETassistedpref: + posMethods[0].SetPosMethod(KLbsPositioningMeansGps, TPositionModuleInfo::ETechnologyNetwork | TPositionModuleInfo::ETechnologyAssisted); + posMethods[1].SetPosMethod(KLbsPositioningMeansGps, TPositionModuleInfo::ETechnologyTerminal | TPositionModuleInfo::ETechnologyAssisted); + ++numMethods; + break; + + case PosMethod::PosMethod::agpsSETbasedpref: + posMethods[0].SetPosMethod(KLbsPositioningMeansGps, TPositionModuleInfo::ETechnologyTerminal | TPositionModuleInfo::ETechnologyAssisted); + posMethods[1].SetPosMethod(KLbsPositioningMeansGps, TPositionModuleInfo::ETechnologyNetwork | TPositionModuleInfo::ETechnologyAssisted); + ++numMethods; + break; + + case PosMethod::autonomousGPS: + posMethods[0].SetPosMethod(KLbsPositioningMeansGps, TPositionModuleInfo::ETechnologyTerminal); + break; + + case PosMethod::aFLT: + posMethods[0].SetPosMethod(KLbsPositioningMeansAflt, TPositionModuleInfo::ETechnologyTerminal); + break; + + case PosMethod::eCID: + posMethods[0].SetPosMethod(KLbsPositioningMeansCell, TPositionModuleInfo::ETechnologyTerminal); + break; + + case PosMethod::PosMethod::eOTD: + posMethods[0].SetPosMethod(KLbsPositioningMeansEotd, TPositionModuleInfo::ETechnologyTerminal); + break; + + case PosMethod::oTDOA: + posMethods[0].SetPosMethod(KLbsPositioningMeansOtdoa, TPositionModuleInfo::ETechnologyTerminal); + break; + + case PosMethod::noPosition: + posMethods[0].SetPosMethod(KLbsPositioningMeansNone, TPositionModuleInfo::ETechnologyTerminal); + break; + + default: + // error + __ASSERT_DEBUG(EFalse, User::Invariant()); + return KErrArgument; + } + + // populate the return parameter + TInt err = aMethod.SetPosMethods(posMethods, numMethods); + + SUPLLOG(ELogP1, "CSuplResponse::GetPosMethod() End\n"); + return err; + } + + +/** +SlpAddressPresent() + +The SLP Address is conditionally present - it is required if the SUPL Session +is operating in non-Proxy mode, otherwise it is not required. + +@return ETrue if the SlpAddress parameter is present +*/ +EXPORT_C TBool CSuplResponse::SlpAddressPresent() + { + SUPLLOG(ELogP1, "CSuplResponse::SlpAddressPresent() Begin\n"); + __ASSERT_DEBUG(iData->message.u.msSUPLRESPONSE != NULL, User::Invariant()); + + if (iData->message.u.msSUPLRESPONSE->m.sLPAddressPresent == 0) + { + SUPLLOG(ELogP1, "CSuplResponse::SlpAddressPresent(EFalse) End\n"); + return EFalse; + } + + SUPLLOG(ELogP1, "CSuplResponse::SlpAddressPresent(ETrue) End\n"); + return ETrue; + } + + +/** +SlpAddress() + +@param aAddress, populated according to the SLP address parameter +@return error indication, KErrNone otherwise +*/ +EXPORT_C TInt CSuplResponse::GetSlpAddress(CSuplSlpAddress& aAddress) + { + SUPLLOG(ELogP1, "CSuplResponse::SlpAddress() Begin\n"); + __ASSERT_DEBUG(iData->message.u.msSUPLRESPONSE != NULL, User::Invariant()); + __ASSERT_DEBUG(iData->message.u.msSUPLRESPONSE->m.sLPAddressPresent != 0, User::Invariant()); + + // pointer to message body + ASN1T_SUPLRESPONSE* msgBody = iData->message.u.msSUPLRESPONSE; + + if (msgBody->m.sLPAddressPresent == 0) + { + SUPLLOG(ELogP1, "CSuplResponse::SlpAddress() End (SLP Address element not present)\n"); + return KErrNotFound; + } + + if (msgBody->sLPAddress.t == T_SLPAddress_fQDN) + { + // FQDN is a NULL terminated string, length 1..255 + aAddress.iSlpAddressType = ESuplSlpAddressTypeFqdn; + + // find the length of the FQDN (NULL terminated) + const TUint8* tmp = (const TUint8*)msgBody->sLPAddress.u.fQDN; + TPtrC8 source = TPtrC8(tmp, 256); + _LIT8(KNull,"\0"); + TInt fqdnLength = source.Find(KNull); + source.Set(tmp, fqdnLength); + + // copy to the container + TBuf8<256>& fqdn = aAddress.iFqdn->iFqdn; + fqdn.Copy(source); + fqdn.SetLength(fqdnLength); + } + + else if (msgBody->sLPAddress.t == T_SLPAddress_iPAddress) + { + // SLP ID is an IP Address + aAddress.iSlpAddressType = ESuplSlpAddressTypeIp; + + // Reference to the address data buffer + TBuf8<16>& ipAddress = aAddress.iIpAddress->iIpAddress; + + // IPv4 or IPv6 address? + if (msgBody->sLPAddress.u.iPAddress->t == T_IPAddress_ipv6Address) + { + aAddress.iIpAddress->iIpAddressType = ESuplIpAddressTypeV6; + TInt len = msgBody->sLPAddress.u.iPAddress->u.ipv6Address->numocts; + TUint8* data = msgBody->sLPAddress.u.iPAddress->u.ipv6Address->data; + ipAddress.Copy(data, len); + } + else + { + aAddress.iIpAddress->iIpAddressType = ESuplIpAddressTypeV4; + TInt len = msgBody->sLPAddress.u.iPAddress->u.ipv4Address->numocts; + TUint8* data = msgBody->sLPAddress.u.iPAddress->u.ipv4Address->data; + ipAddress.Copy(data, len); + } + } + else + { + // error + __ASSERT_DEBUG(0, User::Invariant()); + return KErrArgument; + } + + SUPLLOG(ELogP1, "CSuplResponse::SlpAddress() End\n"); + return KErrNone; + } +