networkprotocolmodules/common/suplrrlpasn1/src/rrlpmessagebase.cpp
branchRCL_3
changeset 65 a796fdeeb33c
parent 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocolmodules/common/suplrrlpasn1/src/rrlpmessagebase.cpp	Wed Oct 13 16:07:50 2010 +0300
@@ -0,0 +1,1000 @@
+// 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 "rrlpmessagebase.h"
+#include "supldevloggermacros.h" 
+
+
+/**
+Const definition for the 3D location with uncertainty identifier.
+This is the form of location description allowed in RRLP for the
+GPS Reference Location element.
+*/
+const TUint K3DLocationWithUncertainty = 9;
+
+
+/**
+Maximun number of assistance data "elements" (be it almanac,
+acquisition, etc) that can be passed on to LBS. If an RRLP
+message contains more elements than the maximum, only the 
+first 32 are considered.
+*/
+const TUint8 KAsn1RrlpMaxSatNumber = 32;
+
+/**
+Const definition for multiplier to convert 0.08 second resolution to ms..
+The Reference Time field of the GPS Assistance Data element contains
+a GPS Time Of Week (TOW) element, with resolution 0.08seconds.
+The LBS Assistance Data object stores the TOW in ms.
+*/
+const TUint KGpsTowMultiplier = 80;
+
+/**
+Constructor
+*/
+CRrlpMessageBase::CRrlpMessageBase(TSuplPosPayloadType aType, TBool aIsOutgoingMsg)
+ : CSuplPosPayload(aType, aIsOutgoingMsg)
+	{
+	}
+
+
+/** 
+Second stage constructor 
+
+Outgoing messages: constructs the data encapsulation and control objects.
+Incoming message: no action
+*/
+void CRrlpMessageBase::ConstructL()
+	{
+	if (iIsOutgoingMessage)
+		{
+		iData    = new (ELeave) ASN1T_PDU();
+		ASN1Context* context = new (ELeave) ASN1Context;
+		CleanupDeletePushL(context);
+		iControl = new (ELeave) ASN1C_PDU(*context, *iData);
+		// construction of iControl successful, pop context off the cleanup stack
+		CleanupStack::Pop(context);
+		}
+	}
+
+
+/**
+Destructor
+*/
+CRrlpMessageBase::~CRrlpMessageBase()
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::~CRrlpMessageBase() Begin\n");
+	delete iEncodeBuffer;
+	delete iData;
+	delete iControl;
+	// release the STDLIB resources associated with this thread
+	CloseSTDLIB();
+	SUPLLOG(ELogP1, "CRrlpMessageBase::~CRrlpMessageBase() End\n");
+	}
+
+	
+/** 
+SetDecodedData()
+
+Assign decoded ASN1 data, for received messages.
+Takes ownership of passed objects.
+
+@param aData    data structure containing decoded message parameters
+@param aControl control structure associated with decoded data structure.
+*/
+void CRrlpMessageBase::SetDecodedData(ASN1T_PDU* aData, ASN1C_PDU* aControl)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::SetDecodedData() Begin\n");
+	__ASSERT_DEBUG(!iIsOutgoingMessage, User::Invariant());
+	__ASSERT_DEBUG(iData == NULL, User::Invariant());
+	__ASSERT_DEBUG(iControl == NULL, User::Invariant());
+	iData = aData;
+	iControl = aControl;
+	SUPLLOG(ELogP1, "CRrlpMessageBase::SetDecodedData() End\n");
+	}
+
+
+/**
+SetReference()
+
+Sets the RRLP session reference 
+Messages that contain the Rel-5 Extended Reference override the method
+SetExtendedReference() to populate this content.
+
+The RRLP Reference, including the Rel-5 extended reference include the
+following parameters
+	TInt  aRefNum;            // 0..7
+	TBool aRel5EntendedRefPresent;
+	TInt  aRel5SmlcCode;      // 0..63
+	TInt  aRel5TransactionId; // 0..262143
+
+@param  aRrlpRef local copy of the session reference details
+@return error indication, KErrNone otherwise
+*/
+EXPORT_C TInt CRrlpMessageBase::SetReference(const TRrlpReference& aRrlpRef)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::SetReference() Begin\n");
+	__ASSERT_DEBUG(iIsOutgoingMessage, User::Invariant());
+	__ASSERT_DEBUG(iData != NULL, User::Invariant());
+	
+	iData->referenceNumber = aRrlpRef.aRefNum;
+	
+	TInt err = KErrNone;
+	err = SetExtendedReference(aRrlpRef);
+	if (err == KErrNotFound)
+		{
+		SUPLLOG(ELogP1, "CRrlpMessageBase::SetReference() no extended reference present\n");
+		}
+	
+	
+	SUPLLOG(ELogP1, "CRrlpMessageBase::SetReference() End\n");
+	return KErrNone;
+	}
+
+	
+/**
+SetExtendedReference()
+
+Overridden by derived classes representing messages that include rel-5
+extended reference.
+
+@param  aRrlpRef local copy of the session reference details
+@return error indication, KErrNone otherwise
+*/
+TInt CRrlpMessageBase::SetExtendedReference(const TRrlpReference& /*aRrlpRef*/)
+	{
+	return KErrNone;
+	}
+
+
+/**
+Reference()
+
+Populates aRrlpRef with the session reference 
+
+@param aRrlpRef on return, populated with the session reference details
+@return error indication, KErrNone otherwise
+*/	
+EXPORT_C TInt CRrlpMessageBase::GetReference(TRrlpReference& aRrlpRef)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::Reference() Begin\n");
+	__ASSERT_DEBUG(iData != NULL, User::Invariant());
+	aRrlpRef.aRefNum = iData->referenceNumber;
+	
+	TInt err = KErrNone;
+	err = GetExtendedReference(aRrlpRef);
+	if (err == KErrNotFound)
+		{
+		SUPLLOG(ELogP1, "CRrlpMessageBase::Reference() no extended reference present\n");
+		}
+	
+	SUPLLOG(ELogP1, "CRrlpMessageBase::Reference() End\n");
+	return KErrNone;
+	}
+
+
+/**
+GetExtendedReference()
+
+Overridden by derived classes representing messages that include rel-5
+extended reference.
+
+@param  aRrlpRef local copy of the session reference details
+@return KErrNotFound if the extended reference parameters are not present,
+        KErrNone otherwise
+*/
+TInt CRrlpMessageBase::GetExtendedReference(TRrlpReference& /*aRrlpRef*/)
+	{
+	return KErrNotFound;
+	}
+
+
+/** 
+EncodeToL()
+
+Encode a populated outgoing message to the specified buffer.
+
+@param  aBuf buffer pointer 
+@return error indication, KErrNone otherwise
+*/
+EXPORT_C TInt CRrlpMessageBase::EncodeToL(TPtr8& aBuf)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::EncodeToL() Begin\n");
+	__ASSERT_DEBUG(iIsOutgoingMessage, User::Invariant());
+	
+	// buffer pointer, fixed max length
+	TUint8* msgBuf = (TUint8*)aBuf.Ptr();
+	TInt maxLength = aBuf.MaxLength();
+
+	// construct the encode buffer control object
+	iEncodeBuffer = new (ELeave) ASN1PEREncodeBuffer (msgBuf, (unsigned int)maxLength, FALSE, (OSRTContext*)iControl->getContext());
+	
+	// Encode the message to the buffer
+	TInt stat = KErrNone;
+	stat = iControl->EncodeTo(*iEncodeBuffer);
+
+	TInt retval = KErrNone;
+	if (stat == 0)
+		{
+		// Set the length according to reported buffer length
+		TInt len = iEncodeBuffer->getMsgLen();
+		aBuf.SetLength(len);
+		}
+	else
+		{
+		retval = ProcessAsn1Error(stat);
+		}
+
+	delete iEncodeBuffer;
+	iEncodeBuffer = NULL;
+
+	SUPLLOG(ELogP1, "CRrlpMessageBase::EncodeToL() End\n");
+	return retval;
+	}
+
+
+/** 
+BuildAssistanceData()
+
+@param  aDataMask populated to indicate what assistance data has been received
+@param  aData     reference to assistance data builder object to populate with
+                  received assistance data
+@param  aGpsData  the received/decoded gps assistance data RRLP element
+@return error indication, KErrNone otherwise
+*/
+TInt CRrlpMessageBase::BuildAssistanceData(TLbsAsistanceDataGroup& aDataMask, RLbsAssistanceDataBuilderSet& aAssistanceDataBuilderSet, ASN1T_ControlHeader& aGpsData)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::BuildAssistanceData() Begin\n");
+	// clear the data mask
+	aDataMask = EAssistanceDataNone;
+	
+	// Reference Time
+	if (aGpsData.m.referenceTimePresent)
+		{
+		SUPLLOG(ELogP1, "   Reference Time received...\n");
+		aDataMask |= EAssistanceDataReferenceTime;
+		
+		// Fetch a GpsReferenceTime data item.
+		RUEPositioningGpsReferenceTimeBuilder* gpsReferenceTimeBuilder;
+		aAssistanceDataBuilderSet.GetDataBuilder(gpsReferenceTimeBuilder);
+
+		WriteReferenceTimeData(gpsReferenceTimeBuilder, aGpsData);
+
+		TTime timeNow;
+		timeNow.UniversalTime();
+		gpsReferenceTimeBuilder->SetTimeStamp(timeNow);
+		}
+
+	// Reference Location
+	if (aGpsData.m.refLocationPresent)
+		{
+		SUPLLOG(ELogP1, "   Reference Location received...\n");
+		aDataMask |= EAssistanceDataReferenceLocation;
+		
+		// Fetch a ReferenceLocation data item.
+		RReferenceLocationBuilder* gpsReferenceLocationBuilder;
+		aAssistanceDataBuilderSet.GetDataBuilder(gpsReferenceLocationBuilder);
+
+		WriteReferenceLocationData(gpsReferenceLocationBuilder, aGpsData);
+		
+		TTime timeNow;
+		timeNow.UniversalTime();
+		gpsReferenceLocationBuilder->SetTimeStamp(timeNow);
+		}
+
+	// DGPS Corrections
+	if (aGpsData.m.dgpsCorrectionsPresent)
+		{
+		SUPLLOG(ELogP1, "   DGPS Corrections received, ignoring...\n");
+		// never requested by LBS, no data builder available. Ignore.
+		}
+	
+	// Navigation Model
+	if (aGpsData.m.navigationModelPresent)
+		{
+		SUPLLOG(ELogP1, "   Navigation Model received...\n");
+		aDataMask |= EAssistanceDataNavigationModel;
+		
+		// Fetch a GpsNavigationModel data item.
+		RUEPositioningGpsNavigationModelBuilder* gpsNavigationModelBuilder;
+		aAssistanceDataBuilderSet.GetDataBuilder(gpsNavigationModelBuilder);
+
+		WriteNavigationModelData(gpsNavigationModelBuilder, aGpsData);
+		
+		TTime timeNow;
+		timeNow.UniversalTime();
+		gpsNavigationModelBuilder->SetTimeStamp(timeNow);	
+		}
+
+	// Ionospheric Model	
+	if (aGpsData.m.ionosphericModelPresent)
+		{
+		SUPLLOG(ELogP1, "   Ionospheric Model received...\n");
+		aDataMask |= EAssistanceDataIonosphericModel;
+		
+		//Fetch a GpsIonosphericModel data item.
+		RUEPositioningGpsIonosphericModelBuilder* gpsIonosphericModelBuilder;
+		aAssistanceDataBuilderSet.GetDataBuilder(gpsIonosphericModelBuilder);
+		
+		WriteIonosphericModelData(gpsIonosphericModelBuilder, aGpsData);
+			
+		TTime timeNow;
+		timeNow.UniversalTime();
+		gpsIonosphericModelBuilder->SetTimeStamp(timeNow);	
+		}
+
+	// UTC Model
+	if (aGpsData.m.utcModelPresent)
+		{
+		SUPLLOG(ELogP1, "   UTC Model received...\n");
+		aDataMask |= EAssistanceDataPositioningGpsUtcModel;
+		
+		//Fetch a GpsUTCModel data item.
+		RUEPositioningGpsUtcModelBuilder* gpsUtcModelBuilder;
+		aAssistanceDataBuilderSet.GetDataBuilder(gpsUtcModelBuilder);
+		
+		WriteUtcModelData(gpsUtcModelBuilder, aGpsData);
+		
+		TTime timeNow;
+		timeNow.UniversalTime();
+		gpsUtcModelBuilder->SetTimeStamp(timeNow);	
+		}
+
+	// Almanac
+	if (aGpsData.m.almanacPresent)
+		{
+		SUPLLOG(ELogP1, "   Almanac received...\n");
+		aDataMask |= EAssistanceDataAlmanac;
+		
+		//Fetch a GpsAlmanacBuilder data builder.
+		RUEPositioningGpsAlmanacBuilder* gpsAlmanacBuilder;
+		aAssistanceDataBuilderSet.GetDataBuilder(gpsAlmanacBuilder);
+		
+		WriteAlmanacData(gpsAlmanacBuilder, aGpsData);
+
+		TTime timeNow;
+		timeNow.UniversalTime();
+		gpsAlmanacBuilder->SetTimeStamp(timeNow);	
+		}
+
+	// Acquisition Assistance
+	if (aGpsData.m.acquisAssistPresent)
+		{
+		SUPLLOG(ELogP1, "   Aquisition Assistance received...\n");
+		aDataMask |= EAssistanceDataAquisitionAssistance;
+		
+		//Fetch a GpsAcquisitionAssistance data builder.
+		RUEPositioningGpsAcquisitionAssistanceBuilder* gpsAcquisitionAssistanceBuilder;
+		aAssistanceDataBuilderSet.GetDataBuilder(gpsAcquisitionAssistanceBuilder);
+
+		WriteAcquisitionAssistanceData(gpsAcquisitionAssistanceBuilder, aGpsData);
+
+		TTime timeNow;
+		timeNow.UniversalTime();
+		gpsAcquisitionAssistanceBuilder->SetTimeStamp(timeNow);
+		}
+
+	// Real Time Integrity
+	if (aGpsData.m.realTimeIntegrityPresent)
+		{
+		SUPLLOG(ELogP1, "   Real Time Integrity received...\n");
+		aDataMask |= EAssistanceDataBadSatList;
+		
+		//Fetch a GpsBadSatList data item.
+		RBadSatListBuilder* badSatListBuilder;
+		aAssistanceDataBuilderSet.GetDataBuilder(badSatListBuilder);
+			
+		WriteRealTimeIntegrityData(badSatListBuilder, aGpsData);
+	
+		TTime timeNow;
+		timeNow.UniversalTime();
+		badSatListBuilder->SetTimeStamp(timeNow);	
+		}
+	
+	SUPLLOG(ELogP1, "CRrlpMessageBase::BuildAssistanceData() End\n");
+	return KErrNone;
+	}
+
+
+/** 
+WriteReferenceTimeData()
+
+Writes the recevieved GPS Assistance Data (Reference Time) to the Assistance 
+Data Builder.
+
+@param aReferenceTimeBuilder, the LBS assistance data builder
+@param aGpsData, the received/decoded gps assistance data RRLP element
+*/
+void CRrlpMessageBase::WriteReferenceTimeData(RUEPositioningGpsReferenceTimeBuilder* aReferenceTimeBuilder, ASN1T_ControlHeader& aGpsData)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteReferenceTimeData() Begin\n");
+	// GPS TIME elements
+	TUint gpsWeek = aGpsData.referenceTime.gpsTime.gpsWeek;
+	TUint gpsTow = aGpsData.referenceTime.gpsTime.gpsTOW23b * KGpsTowMultiplier;
+	aReferenceTimeBuilder->SetField(TUEPositioningGpsReferenceTime::EGpsWeek, gpsWeek);
+	aReferenceTimeBuilder->SetField(TUEPositioningGpsReferenceTime::EGpsTow1Msec, gpsTow);
+	
+	// GSM TIME elements (optional)
+	// Not currently supported by this implementation
+	// LBS assistance data builder support required.
+		
+	// GPS TOW ASSIST elements (optional)
+	if (aGpsData.referenceTime.m.gpsTowAssistPresent != 0)
+		{
+		RGpsTowAssistArrayBuilder towAssistArrayBuilder;
+		aReferenceTimeBuilder->GetArrayBuilder(TUEPositioningGpsReferenceTime::EGpsTowAssistArray, towAssistArrayBuilder);
+		
+		// array accessor
+		ASN1C_GPSTOWAssist towAssistArray(aGpsData.referenceTime.gpsTowAssist);
+		
+		TInt count = aGpsData.referenceTime.gpsTowAssist.count;
+		for (TInt i=0; i<count && i<KAsn1RrlpMaxSatNumber; i++)
+			{
+			RGpsTowAssistBuilder towAssistBuilder;	
+			towAssistArrayBuilder.GetFieldBuilder(i, towAssistBuilder);
+
+			ASN1T_GPSTOWAssistElement* towElement =  (ASN1T_GPSTOWAssistElement*)towAssistArray.get(i);
+			TUint satId = towElement->satelliteID;
+			TUint tlmMessage = towElement->tlmWord;
+			TBool alert = (towElement->alert !=0 ? ETrue : EFalse);
+			TBool antiSpoof = (towElement->antiSpoof !=0 ? ETrue : EFalse);
+		
+			towAssistBuilder.SetField(TGpsTowAssist::ESatID, satId);
+			towAssistBuilder.SetField(TGpsTowAssist::ETlmMessage, tlmMessage);
+			towAssistBuilder.SetField(TGpsTowAssist::EAlert, alert);
+			towAssistBuilder.SetField(TGpsTowAssist::EAntiSpoof, antiSpoof);
+			}
+		}
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteReferenceTimeData() End\n");
+	}
+
+
+
+/** 
+WriteReferenceLocationData()
+
+Writes the recevieved GPS Assistance Data (Reference Location) to the Assistance 
+Data Builder.
+
+@param aReferenceLocationBuilder, the LBS assistance data builder
+@param aGpsData, the received/decoded gps assistance data RRLP element
+*/
+void CRrlpMessageBase::WriteReferenceLocationData(RReferenceLocationBuilder* aReferenceLocationBuilder, ASN1T_ControlHeader& aGpsData)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteReferenceLocationData() Begin\n");
+	// Allowed shape type is ellipsoid point with altitude and uncertainty ellipsoid
+	TUint shapeType = 0;
+	shapeType |= aGpsData.refLocation.threeDLocation.data[0]>>4;
+	
+	// handle latitude and longitude whatever the shape type
+	TUint latitude = 0;
+	latitude |= aGpsData.refLocation.threeDLocation.data[1];
+	latitude = latitude<<8;
+	latitude |= aGpsData.refLocation.threeDLocation.data[2];
+	latitude = latitude<<8;
+	latitude |= aGpsData.refLocation.threeDLocation.data[3];
+	latitude &= 0x7FFFFF; // clear the sign of latitude bit.
+
+	// latitude sign, 0 == north, 1 == south
+	TEllipsoidPointAltitudeEllipsoide::TLatitudeSign latitudeSign = TEllipsoidPointAltitudeEllipsoide::ENorth;
+	if ((aGpsData.refLocation.threeDLocation.data[1] & 128) != 0)
+		{
+		latitudeSign = TEllipsoidPointAltitudeEllipsoide::ESouth;
+		}
+	
+	TInt longitude = 0;
+	longitude |= aGpsData.refLocation.threeDLocation.data[4];
+	longitude = longitude<<8;
+	longitude |= aGpsData.refLocation.threeDLocation.data[5];
+	longitude = longitude<<8;
+	longitude |= aGpsData.refLocation.threeDLocation.data[6];
+	
+	TUint altitude = 0;
+	altitude |= aGpsData.refLocation.threeDLocation.data[7];
+	altitude = altitude<<8;
+	altitude |= aGpsData.refLocation.threeDLocation.data[8];
+	
+	// handling of altitude and uncertainty dependant on shape type.
+	// note that RRLP specifies usage of 3D location with uncertainty, so
+	// no need to handle other types.
+	if (shapeType == K3DLocationWithUncertainty)
+		{
+		// altitude direction, 0 == above, 1 == below WGS84 ellipsoid
+		TEllipsoidPointAltitudeEllipsoide::TAltitudeDirection altitudeDirection = TEllipsoidPointAltitudeEllipsoide::EHeight;
+		if ((aGpsData.refLocation.threeDLocation.data[7] & 128) != 0)
+			{
+			altitudeDirection = TEllipsoidPointAltitudeEllipsoide::EDepth;
+			}
+
+		// uncertainty etc...
+		TUint uncertSemiMaj  = aGpsData.refLocation.threeDLocation.data[9];
+		TUint uncertSemiMin  = aGpsData.refLocation.threeDLocation.data[10];
+		TUint orientation    = aGpsData.refLocation.threeDLocation.data[11];
+		TUint uncertAltitude = aGpsData.refLocation.threeDLocation.data[12];
+		TUint confidence     = aGpsData.refLocation.threeDLocation.data[13];
+			
+		REllipsoidPointAltitudeEllipsoideBuilder ellipsoidPointAltBuilder;	
+		aReferenceLocationBuilder->GetFieldBuilder(TReferenceLocation::EEllipsoidPointAltitudeEllipsoide, ellipsoidPointAltBuilder);
+
+		ellipsoidPointAltBuilder.SetField(TEllipsoidPointAltitudeEllipsoide::ELatitudeSign, latitudeSign);
+		ellipsoidPointAltBuilder.SetField(TEllipsoidPointAltitudeEllipsoide::ELatitude, latitude);
+		ellipsoidPointAltBuilder.SetField(TEllipsoidPointAltitudeEllipsoide::ELongitude, longitude);
+		ellipsoidPointAltBuilder.SetField(TEllipsoidPointAltitudeEllipsoide::EAltitudeDirection, altitudeDirection);
+		ellipsoidPointAltBuilder.SetField(TEllipsoidPointAltitudeEllipsoide::EAltitude, altitude);
+		ellipsoidPointAltBuilder.SetField(TEllipsoidPointAltitudeEllipsoide::EUncertaintySemiMajor, uncertSemiMaj);
+		ellipsoidPointAltBuilder.SetField(TEllipsoidPointAltitudeEllipsoide::EUncertaintySemiMinor, uncertSemiMin);
+		ellipsoidPointAltBuilder.SetField(TEllipsoidPointAltitudeEllipsoide::EOrientationMajorAxis, orientation);
+		ellipsoidPointAltBuilder.SetField(TEllipsoidPointAltitudeEllipsoide::EUncertaintyAltitude, uncertAltitude);
+		ellipsoidPointAltBuilder.SetField(TEllipsoidPointAltitudeEllipsoide::EConfidence, confidence);
+		}
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteReferenceLocationData() End\n");
+	}
+
+
+/** 
+WriteNavigationModelData()
+
+Writes the recevieved GPS Assistance Data (Navigation Model) to the Assistance 
+Data Builder.
+
+@param aGpsNavigationModelBuilder, the LBS assistance data builder
+@param aGpsData, the received/decoded gps assistance data RRLP element
+*/
+void CRrlpMessageBase::WriteNavigationModelData(RUEPositioningGpsNavigationModelBuilder* aGpsNavigationModelBuilder, ASN1T_ControlHeader& aGpsData)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteNavigationModelData() Begin\n");
+	// Fetch a GpsNavigationModelSatInfoArray data item.
+	RNavigationModelSatInfoArrayBuilder navigationModelSatInfoArrayBuilder;
+	aGpsNavigationModelBuilder->GetArrayBuilder(TUEPositioningGpsNavigationModel::ENavigationModelSatelliteInfoArray, navigationModelSatInfoArrayBuilder);		
+
+	// array accessor
+	ASN1C_SeqOfNavModelElement satInfoArray(aGpsData.navigationModel.navModelList);
+
+	TInt count = aGpsData.navigationModel.navModelList.count;
+	for (TInt i=0 ; i<count && i<KAsn1RrlpMaxSatNumber; ++i)
+		{
+		// Fetch a GpsNavigationModelSatInfo data item.
+		RNavigationModelSatInfoBuilder navigationModelSatInfoBuilder;	
+		navigationModelSatInfoArrayBuilder.GetFieldBuilder(i, navigationModelSatInfoBuilder);
+		
+		// ASN1T_ControlHeader
+		// Fetch the received satellite info
+		ASN1T_NavModelElement* satInfo = (ASN1T_NavModelElement*)satInfoArray.get(i);
+		
+		WriteNavigationModelSatInfo(&navigationModelSatInfoBuilder, *satInfo);	
+		}		
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteNavigationModelData() End\n");
+	}
+
+
+/** 
+WriteNavigationModelSatInfo()
+
+Writes the recevieved GPS Assistance Data (Navigation Model Satellite Info Array) 
+to the Assistance Data Builder.
+
+@param aGpsNavigationModelBuilder, the LBS assistance data builder
+@param aGpsData, the received/decoded gps assistance data RRLP element
+*/
+void CRrlpMessageBase::WriteNavigationModelSatInfo(RNavigationModelSatInfoBuilder* aNavigationModelSatInfoBuilder, ASN1T_NavModelElement& aSatInfo)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteNavigationModelSatInfo() Begin\n");
+	// satellite ID, status
+	aNavigationModelSatInfoBuilder->SetField(TNavigationModelSatInfo::ESatId, (TUint)aSatInfo.satelliteID);
+	aNavigationModelSatInfoBuilder->SetField(TNavigationModelSatInfo::ESatelliteStatus, (TSatelliteStatus)(aSatInfo.satStatus.t-EZeroOffsetAdjust));
+	
+	// ephemeris data if either "new sat, new nav model" OR "existing sat, new nav model"
+	if (aSatInfo.satStatus.t == T_SatStatus_newSatelliteAndModelUC)
+		{
+		WriteSatInfoEphemeris(aNavigationModelSatInfoBuilder, *aSatInfo.satStatus.u.newSatelliteAndModelUC);
+		}
+	else if (aSatInfo.satStatus.t == T_SatStatus_newNaviModelUC)
+		{
+		WriteSatInfoEphemeris(aNavigationModelSatInfoBuilder, *aSatInfo.satStatus.u.newNaviModelUC);
+		}
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteNavigationModelSatInfo() End\n");
+	}
+
+
+/** 
+WriteSatInfoEphemeris()
+
+Writes the recevieved GPS Assistance Data (Navigation Model Satellite Info Element) 
+to the Assistance Data Builder.
+
+@param aNavigationModelSatInfoBuilder, the LBS assistance data builder
+@param aGpsData, the received/decoded gps assistance data RRLP element
+*/
+void CRrlpMessageBase::WriteSatInfoEphemeris(RNavigationModelSatInfoBuilder* aNavigationModelSatInfoBuilder, ASN1T_UncompressedEphemeris& aSatEphemeris)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteSatInfoEphemeris() Begin\n");
+	REphemerisParameterBuilder ephemerisBuilder;
+	aNavigationModelSatInfoBuilder->GetFieldBuilder(TNavigationModelSatInfo::EEphemerisParameter, ephemerisBuilder);
+	
+	TUint value = aSatEphemeris.ephemCodeOnL2;
+	ephemerisBuilder.SetField(TEphemerisParameter::ECodeOnL2, value);
+	
+	value = aSatEphemeris.ephemURA;
+	ephemerisBuilder.SetField(TEphemerisParameter::EUraIndex, value);
+	
+	value = aSatEphemeris.ephemSVhealth;
+	ephemerisBuilder.SetField(TEphemerisParameter::ESatHealth, value);
+	
+	value = aSatEphemeris.ephemIODC;
+	ephemerisBuilder.SetField(TEphemerisParameter::EIodc, value);
+	
+	value = aSatEphemeris.ephemL2Pflag;
+	ephemerisBuilder.SetField(TEphemerisParameter::EL2Pflag, value);
+	
+	value = aSatEphemeris.ephemTgd;
+	ephemerisBuilder.SetField(TEphemerisParameter::ETGD, value);
+	
+	value = aSatEphemeris.ephemToc;
+	ephemerisBuilder.SetField(TEphemerisParameter::EToc, value);
+	
+	value = aSatEphemeris.ephemAF2;
+	ephemerisBuilder.SetField(TEphemerisParameter::EAf2, value);
+	
+	value = aSatEphemeris.ephemAF1;
+	ephemerisBuilder.SetField(TEphemerisParameter::EAf1, value);
+	
+	value = aSatEphemeris.ephemAF0;
+	ephemerisBuilder.SetField(TEphemerisParameter::EAf0, value);
+	
+	value = aSatEphemeris.ephemCrs;
+	ephemerisBuilder.SetField(TEphemerisParameter::ECrs, value);
+	
+	value = aSatEphemeris.ephemDeltaN;
+	ephemerisBuilder.SetField(TEphemerisParameter::EDeltaN, value);
+	
+	value = aSatEphemeris.ephemM0;
+	ephemerisBuilder.SetField(TEphemerisParameter::EM0, value);
+	
+	value = aSatEphemeris.ephemCuc;
+	ephemerisBuilder.SetField(TEphemerisParameter::ECuc, value);
+	
+	value = aSatEphemeris.ephemE;
+	ephemerisBuilder.SetField(TEphemerisParameter::EE, value);
+	
+	value = aSatEphemeris.ephemCus;
+	ephemerisBuilder.SetField(TEphemerisParameter::ECus, value);
+	
+	value = aSatEphemeris.ephemAPowerHalf;
+	ephemerisBuilder.SetField(TEphemerisParameter::EASqrt, value);
+	
+	value = aSatEphemeris.ephemToe;
+	ephemerisBuilder.SetField(TEphemerisParameter::EToe, value);
+	
+	value = aSatEphemeris.ephemFitFlag;
+	ephemerisBuilder.SetField(TEphemerisParameter::EFitInterval, value);
+	
+	value = aSatEphemeris.ephemAODA;
+	ephemerisBuilder.SetField(TEphemerisParameter::EAodo, value);
+	
+	value = aSatEphemeris.ephemCic;
+	ephemerisBuilder.SetField(TEphemerisParameter::ECic, value);
+	
+	value = aSatEphemeris.ephemOmegaA0;
+	ephemerisBuilder.SetField(TEphemerisParameter::EOmega0, value);
+	
+	value = aSatEphemeris.ephemCis;
+	ephemerisBuilder.SetField(TEphemerisParameter::ECis, value);
+	
+	value = aSatEphemeris.ephemI0;
+	ephemerisBuilder.SetField(TEphemerisParameter::EI0, value);
+	
+	value = aSatEphemeris.ephemCrc;
+	ephemerisBuilder.SetField(TEphemerisParameter::ECrc, value);
+	
+	value = aSatEphemeris.ephemW;
+	ephemerisBuilder.SetField(TEphemerisParameter::EOmega, value);
+	
+	value = aSatEphemeris.ephemOmegaADot;
+	ephemerisBuilder.SetField(TEphemerisParameter::EOmegaDot, value);
+	
+	value = aSatEphemeris.ephemIDot;
+	ephemerisBuilder.SetField(TEphemerisParameter::EIDot, value);
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteSatInfoEphemeris() End\n");
+	}
+
+
+/** 
+WriteIonosphericModelData()
+
+Writes the recevieved GPS Assistance Data (Ionospheric Model) to the Assistance 
+Data Builder.
+
+@param aGpsIonosphericModelBuilder, the LBS assistance data builder
+@param aGpsData, the received/decoded gps assistance data RRLP element
+*/
+void CRrlpMessageBase::WriteIonosphericModelData(RUEPositioningGpsIonosphericModelBuilder* aGpsIonosphericModelBuilder, ASN1T_ControlHeader& aGpsData)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteIonosphericModelData() Begin\n");
+	// Ionospheric Model Data
+	aGpsIonosphericModelBuilder->SetField(TUEPositioningGpsIonosphericModel::EAlfa0, (TUint)aGpsData.ionosphericModel.alfa0);
+	aGpsIonosphericModelBuilder->SetField(TUEPositioningGpsIonosphericModel::EAlfa1, (TUint)aGpsData.ionosphericModel.alfa1);
+	aGpsIonosphericModelBuilder->SetField(TUEPositioningGpsIonosphericModel::EAlfa2, (TUint)aGpsData.ionosphericModel.alfa2);
+	aGpsIonosphericModelBuilder->SetField(TUEPositioningGpsIonosphericModel::EAlfa3, (TUint)aGpsData.ionosphericModel.alfa3);
+	aGpsIonosphericModelBuilder->SetField(TUEPositioningGpsIonosphericModel::EBeta0, (TUint)aGpsData.ionosphericModel.beta0);
+	aGpsIonosphericModelBuilder->SetField(TUEPositioningGpsIonosphericModel::EBeta1, (TUint)aGpsData.ionosphericModel.beta1);
+	aGpsIonosphericModelBuilder->SetField(TUEPositioningGpsIonosphericModel::EBeta2, (TUint)aGpsData.ionosphericModel.beta2);
+	aGpsIonosphericModelBuilder->SetField(TUEPositioningGpsIonosphericModel::EBeta3, (TUint)aGpsData.ionosphericModel.beta3);
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteIonosphericModelData() End\n");
+	}
+		
+
+/** 
+WriteUtcModelData()
+
+Writes the recevieved GPS Assistance Data (UTC Model) to the Assistance 
+Data Builder.
+
+@param aGpsUtcModelBuilder, the LBS assistance data builder
+@param aGpsData, the received/decoded gps assistance data RRLP element
+*/
+void CRrlpMessageBase::WriteUtcModelData(RUEPositioningGpsUtcModelBuilder* aGpsUtcModelBuilder, ASN1T_ControlHeader& aGpsData)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteUtcModelData() Begin\n");
+	// Universal Time Coordinate Model
+	aGpsUtcModelBuilder->SetField(TUEPositioningGpsUtcModel::EA1, (TUint)aGpsData.utcModel.utcA1);
+	aGpsUtcModelBuilder->SetField(TUEPositioningGpsUtcModel::EA0, (TUint)aGpsData.utcModel.utcA0);
+	aGpsUtcModelBuilder->SetField(TUEPositioningGpsUtcModel::ETot, (TUint)aGpsData.utcModel.utcTot);
+	aGpsUtcModelBuilder->SetField(TUEPositioningGpsUtcModel::EWnt, (TUint)aGpsData.utcModel.utcWNt);	
+	aGpsUtcModelBuilder->SetField(TUEPositioningGpsUtcModel::EDeltatLS, (TUint)aGpsData.utcModel.utcDeltaTls);	
+	aGpsUtcModelBuilder->SetField(TUEPositioningGpsUtcModel::EWnlsf, (TUint)aGpsData.utcModel.utcWNlsf);	
+	aGpsUtcModelBuilder->SetField(TUEPositioningGpsUtcModel::EDn, (TUint)aGpsData.utcModel.utcDN);	
+	aGpsUtcModelBuilder->SetField(TUEPositioningGpsUtcModel::EDeltatLSF, (TUint)aGpsData.utcModel.utcDeltaTlsf);	
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteUtcModelData() End\n");
+	}
+	
+
+/** 
+WriteUtcModelData()
+
+Writes the recevieved GPS Assistance Data (UTC Model) to the Assistance 
+Data Builder.
+
+@param aGpsUtcModelBuilder, the LBS assistance data builder
+@param aGpsData, the received/decoded gps assistance data RRLP element
+*/
+void CRrlpMessageBase::WriteAlmanacData(RUEPositioningGpsAlmanacBuilder* aGpsAlmanacBuilder, ASN1T_ControlHeader& aGpsData)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteAlmanacData() Begin\n");
+	
+	// Almanac
+	aGpsAlmanacBuilder->SetField(TUEPositioningGpsAlmanac::EWnA, (TUint)aGpsData.almanac.alamanacWNa);
+
+	// source array accessor
+	ASN1C_SeqOfAlmanacElement almanacArray(aGpsData.almanac.almanacList);
+
+	// Populate almanac satellite info array
+	RAlmanacSatInfoArrayBuilder almanacSatInfoArrayBuilder;
+	aGpsAlmanacBuilder->GetArrayBuilder(TUEPositioningGpsAlmanac::EAlmanacInfoSatArray, almanacSatInfoArrayBuilder);
+		
+	TInt count = aGpsData.almanac.almanacList.count;
+	// Copy assistance data for a maximun of KAsn1RrlpMaxSatNumber
+	// satellites (LBS data structures cannot accomodate more)
+	for (TInt i=0 ; i<count && i<KAsn1RrlpMaxSatNumber; ++i)
+		{
+		RAlmanacSatInfoBuilder almanacSatInfoBuilder;	
+		almanacSatInfoArrayBuilder.GetFieldBuilder(i, almanacSatInfoBuilder);
+
+		ASN1T_AlmanacElement* almanacElement =  (ASN1T_AlmanacElement*)almanacArray.get(i);
+		
+		WriteAlmanacSatInfo(&almanacSatInfoBuilder, *almanacElement);
+		}
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteAlmanacData() End\n");
+	}
+
+
+/** 
+WriteAlmanacSatInfo()
+
+Writes the recevieved GPS Assistance Data (UTC Model) to the Assistance 
+Data Builder.
+
+@param aGpsUtcModelBuilder, the LBS assistance data builder
+@param aGpsData, the received/decoded gps assistance data RRLP element
+*/
+void CRrlpMessageBase::WriteAlmanacSatInfo(RAlmanacSatInfoBuilder* aAlmanacSatInfoBuilder, ASN1T_AlmanacElement& aAlmanacElement)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteAlmanacSatInfo() Begin\n");
+	// Almanac
+
+	// Note: no RRLP data to populate TAlmanacSatInfo::EDataID field
+	aAlmanacSatInfoBuilder->SetField(TAlmanacSatInfo::ESatID, (TUint)aAlmanacElement.satelliteID);
+	aAlmanacSatInfoBuilder->SetField(TAlmanacSatInfo::EE, (TUint)aAlmanacElement.almanacE);
+	aAlmanacSatInfoBuilder->SetField(TAlmanacSatInfo::EToa, (TUint)aAlmanacElement.alamanacToa);
+	aAlmanacSatInfoBuilder->SetField(TAlmanacSatInfo::EDeltaI, (TUint)aAlmanacElement.almanacKsii);
+	aAlmanacSatInfoBuilder->SetField(TAlmanacSatInfo::EOmegaDot, (TUint)aAlmanacElement.almanacOmegaDot);
+	aAlmanacSatInfoBuilder->SetField(TAlmanacSatInfo::ESatHealth, (TUint)aAlmanacElement.almanacSVhealth);
+	aAlmanacSatInfoBuilder->SetField(TAlmanacSatInfo::EASqrt, (TUint)aAlmanacElement.almanacAPowerHalf);
+	aAlmanacSatInfoBuilder->SetField(TAlmanacSatInfo::EOmega0, (TUint)aAlmanacElement.almanacOmega0);
+	aAlmanacSatInfoBuilder->SetField(TAlmanacSatInfo::EM0, (TUint)aAlmanacElement.almanacM0);
+	aAlmanacSatInfoBuilder->SetField(TAlmanacSatInfo::EOmega, (TUint)aAlmanacElement.almanacW);
+	aAlmanacSatInfoBuilder->SetField(TAlmanacSatInfo::EAf0, (TUint)aAlmanacElement.almanacAF0);
+	aAlmanacSatInfoBuilder->SetField(TAlmanacSatInfo::EAf1, (TUint)aAlmanacElement.almanacAF1);
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteAlmanacSatInfo() End\n");
+	}
+
+
+/** 
+WriteAcquisitionAssistanceData()
+
+Writes the recevieved GPS Assistance Data (Acquisition Assistance Data) to 
+the Assistance Data Builder.
+
+@param aGpsAcquisitionAssistanceBuilder, the LBS assistance data builder
+@param aGpsData, the received/decoded gps assistance data RRLP element
+*/
+void CRrlpMessageBase::WriteAcquisitionAssistanceData(RUEPositioningGpsAcquisitionAssistanceBuilder* aGpsAcquisitionAssistanceBuilder, ASN1T_ControlHeader& aGpsData)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteAcquisitionAssistanceData() Begin\n");
+	// Aquisition Assistance
+
+	// GSM TIME elements (optional)
+	// Not currently supported by this implementation
+	// LBS assistance data builder support required.
+		
+	// source array accessor
+	ASN1C_SeqOfAcquisElement acquisAssistArray(aGpsData.acquisAssist.acquisList);
+
+	// Populate almanac satellite info array
+	RAcquisitionSatInfoArrayBuilder acquisitionSatInfoArrayBuilder;
+	aGpsAcquisitionAssistanceBuilder->GetArrayBuilder(TUEPositioningGpsAcquisitionAssistance::ESatelliteInformationArray, acquisitionSatInfoArrayBuilder);
+		
+	TInt count = aGpsData.acquisAssist.acquisList.count;
+	for (TInt i=0 ; i<count && i<KAsn1RrlpMaxSatNumber; ++i)
+		{
+		RAcquisitionSatInfoBuilder acquisitionSatInfoBuilder;	
+		acquisitionSatInfoArrayBuilder.GetFieldBuilder(i, acquisitionSatInfoBuilder);
+
+		ASN1T_AcquisElement* acquisAssistElement =  (ASN1T_AcquisElement*)acquisAssistArray.get(i);
+		
+		WriteAcquisAssistSatInfo(&acquisitionSatInfoBuilder, *acquisAssistElement);
+		}
+		
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteAcquisitionAssistanceData() End\n");
+	}
+
+
+/** 
+WriteAcquisAssistSatInfo()
+
+Writes the recevieved GPS Assistance Data (Acquisition Assistance Satellite Info) 
+to the Assistance Data Builder.
+
+@param aAcquisitionSatInfoBuilder, the LBS assistance data builder
+@param aGpsData, the received/decoded gps assistance data RRLP element
+*/
+void CRrlpMessageBase::WriteAcquisAssistSatInfo(RAcquisitionSatInfoBuilder* aAcquisitionSatInfoBuilder, ASN1T_AcquisElement& aAcquisAssistElement)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteAcquisAssistSatInfo() Begin\n");
+	aAcquisitionSatInfoBuilder->SetField(TAcquisitionSatInfo::ESatID, (TUint)aAcquisAssistElement.svid);
+	aAcquisitionSatInfoBuilder->SetField(TAcquisitionSatInfo::EDoppler0thOrder, (TInt)aAcquisAssistElement.doppler0);
+	aAcquisitionSatInfoBuilder->SetField(TAcquisitionSatInfo::ECodePhase, (TUint)aAcquisAssistElement.codePhase);
+	aAcquisitionSatInfoBuilder->SetField(TAcquisitionSatInfo::EIntegerCodePhase, (TUint)aAcquisAssistElement.intCodePhase);
+	aAcquisitionSatInfoBuilder->SetField(TAcquisitionSatInfo::EGpsBitNumber, (TUint)aAcquisAssistElement.gpsBitNumber);
+	aAcquisitionSatInfoBuilder->SetField(TAcquisitionSatInfo::ECodePhaseSearchWindow, (TCodePhaseSearchWindow)aAcquisAssistElement.codePhaseSearchWindow);
+
+	if (aAcquisAssistElement.m.addionalDopplerPresent != 0)
+		{
+		RExtraDopplerInfoBuilder extraDopplerInfoBuilder;
+		aAcquisitionSatInfoBuilder->GetFieldBuilder(TAcquisitionSatInfo::EExtraDopplerInfo, extraDopplerInfoBuilder);
+		extraDopplerInfoBuilder.SetField(TExtraDopplerInfo::EDoppler1stOrder, (TInt)aAcquisAssistElement.addionalDoppler.doppler1);
+		extraDopplerInfoBuilder.SetField(TExtraDopplerInfo::EDopplerUncertainty, (TDopplerUncertainty)aAcquisAssistElement.addionalDoppler.dopplerUncertainty);
+		}
+		
+	if (aAcquisAssistElement.m.addionalAnglePresent)
+		{
+		RTAzimuthAndElevationBuilder azimuthAndElevationBuilder;
+		aAcquisitionSatInfoBuilder->GetFieldBuilder(TAcquisitionSatInfo::EAzimuthAndElevation, azimuthAndElevationBuilder);
+		azimuthAndElevationBuilder.SetField(TAzimuthAndElevation::EAzimuth, (TUint)aAcquisAssistElement.addionalAngle.azimuth);
+		azimuthAndElevationBuilder.SetField(TAzimuthAndElevation::EElevation, (TUint)aAcquisAssistElement.addionalAngle.elevation);			
+		}
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteAcquisAssistSatInfo() End\n");
+	}
+
+
+/** 
+WriteRealTimeIntegrityData()
+
+Writes the recevieved GPS Assistance Data (Real Time Integrity) to the 
+Assistance Data Builder.
+
+@param aBadSatListBuilder, the LBS assistance data builder
+@param aGpsData, the received/decoded gps assistance data RRLP element
+*/
+void CRrlpMessageBase::WriteRealTimeIntegrityData(RBadSatListBuilder* aBadSatListBuilder, ASN1T_ControlHeader& aGpsData)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteRealTimeIntegrityData() Begin\n");
+	// Real Time Integrity
+	RBadSatArrayBuilder badSatArrayBuilder;
+	aBadSatListBuilder->GetArrayBuilder(TBadSatList::EBadSatIdArray, badSatArrayBuilder);
+	
+	TInt count = aGpsData.realTimeIntegrity.n;
+			
+	for (TInt i=0 ; i<count && i<KAsn1RrlpMaxSatNumber; ++i)
+		{	
+		badSatArrayBuilder.SetElement(i, aGpsData.realTimeIntegrity.elem[i]);
+		}
+	SUPLLOG(ELogP1, "CRrlpMessageBase::WriteRealTimeIntegrityData() End\n");
+	}
+
+
+/**
+LeaveIfAllocErrorL()
+
+Calls User::Leave(<error code>) if a memory allocation has failed.
+*/
+void CRrlpMessageBase::LeaveIfAllocErrorL()
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::LeaveIfAllocErrorL() Begin\n");
+	if (iControl->getStatus() == RTERR_NOMEM)
+		{
+		User::Leave(KErrNoMemory);
+		}
+	else if (iControl->getStatus() != RT_OK)
+		{
+		User::Leave(KErrGeneral);
+		}
+	SUPLLOG(ELogP1, "CRrlpMessageBase::LeaveIfAllocErrorL() End\n");
+	}
+
+
+/**
+Translates error codes returned by the ASN1 runtime library to distinguish
+from Symbian global error codes.
+
+Errors are simply translated to positive error codes. They maintain their
+meaning as described in rtxErrCodes.h and asn1ErrCodes.h.
+
+Exceptions:
+  RTERR_NOMEM is translated to global error code KErrNoMemory
+
+@see rtxErrCodes.h
+@see asn1ErrCodes.h
+*/
+TInt CRrlpMessageBase::ProcessAsn1Error(TInt aError)
+	{
+	SUPLLOG(ELogP1, "CRrlpMessageBase::ProcessAsn1Error() Begin\n");
+	if (aError == RTERR_NOMEM)
+		{
+		SUPLLOG(ELogP1, "CRrlpMessageBase::ProcessAsn1Error() End (Out Of Memory)\n");
+		return KErrNoMemory;
+		}
+	else
+		{
+		SUPLLOG2(ELogP1, "CRrlpMessageBase::ProcessAsn1Error() End (ASN1Error runtime error %d)\n", aError);
+		return aError * -1;
+		}
+	}
+
+/**
+Prints the content payload data structure to the logger 
+*/
+void CRrlpMessageBase::LogMessageContent()
+	{
+	SUPLLOG(ELogP9, "RRLP PAYLOAD CONTENT\n");
+	//SUPLLOG_PDU(iControl);
+	}
+