networkprotocolmodules/common/suplrrlpasn1/src/rrlpprotocolerror.cpp
branchRCL_3
changeset 65 a796fdeeb33c
parent 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocolmodules/common/suplrrlpasn1/src/rrlpprotocolerror.cpp	Wed Oct 13 16:07:50 2010 +0300
@@ -0,0 +1,189 @@
+// 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 "rrlpprotocolerror.h"
+#include "supldevloggermacros.h" 
+
+/**
+Static Factory Constructor
+*/
+EXPORT_C CRrlpProtocolError* CRrlpProtocolError::NewL(TBool aIsOutgoing)
+	{
+	SUPLLOG(ELogP1, "CRrlpProtocolError::NewL() Begin\n");
+	CRrlpProtocolError* self = new (ELeave) CRrlpProtocolError(aIsOutgoing);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	SUPLLOG(ELogP1, "CRrlpProtocolError::NewL() End\n");
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+
+/**
+Private default constructor
+*/
+CRrlpProtocolError::CRrlpProtocolError(TBool aIsOutgoing)
+ : CRrlpMessageBase(ERrlpProtocolError, aIsOutgoing)
+	{
+	}
+
+
+/**
+Second stage constructor
+*/
+void CRrlpProtocolError::ConstructL()
+	{
+	// call base class ConstructL to create data structures.
+	CRrlpMessageBase::ConstructL();
+
+	// construct messaage specific data 
+	// containers if this is an outgoing message
+	if (iIsOutgoingMessage)
+		{
+		// local reference to context object
+		OSCTXT* pctxt = iControl->getCtxtPtr();
+
+		iData->component.t = T_RRLP_Component_protocolError;
+		iData->component.u.protocolError = (ASN1T_ProtocolError*)rtxMemAllocZ(pctxt, sizeof(ASN1T_ProtocolError));
+	   	LeaveIfAllocErrorL();
+		}
+	}
+
+
+/**
+Destructor
+*/
+CRrlpProtocolError::~CRrlpProtocolError()
+	{
+	SUPLLOG(ELogP1, "CRrlpProtocolError::~CRrlpProtocolError() Begin\n");
+	SUPLLOG(ELogP1, "CRrlpProtocolError::~CRrlpProtocolError() End\n");
+	}
+
+
+/** 
+SetProtocolError()
+
+@param  aErrorCode - the outgoing RRLP Protocol error code
+@return error indication, KErrNone otherwise
+*/
+EXPORT_C TInt CRrlpProtocolError::SetProtocolError(const TRrlpErrorCode& aErrorCode)
+	{
+	SUPLLOG(ELogP8, "CRrlpProtocolError::SetProtocolError() Begin\n");
+	SUPLLOG2(ELogP8, "    - TRrlpErrorCode aLocError = %d", aErrorCode);
+	
+	__ASSERT_DEBUG(iIsOutgoingMessage, User::Invariant());
+	__ASSERT_DEBUG(iData->component.u.protocolError != NULL, User::Invariant());
+	
+	iData->component.u.protocolError->errorCause = aErrorCode;
+
+	SUPLLOG(ELogP1, "CRrlpProtocolError::SetProtocolError() End\n");
+	return KErrNone;
+	}
+
+
+/** 
+ProtocolError()
+
+@param  aErrorCode on return, populated with the received RRLP Error Code
+@return error indication, KErrNone otherwise
+*/
+EXPORT_C TInt CRrlpProtocolError::GetProtocolError(TRrlpErrorCode& aErrorCode)
+	{
+	SUPLLOG(ELogP8, "CRrlpProtocolError::ProtocolError() Begin\n");
+	__ASSERT_DEBUG(!iIsOutgoingMessage, User::Invariant());
+	__ASSERT_DEBUG(iData->component.u.protocolError != NULL, User::Invariant());
+	
+	aErrorCode = (TRrlpErrorCode)iData->component.u.protocolError->errorCause;
+	
+	SUPLLOG2(ELogP8, "    - TRrlpErrorCode aLocError = %d", aErrorCode);
+	SUPLLOG(ELogP1, "CRrlpProtocolError::ProtocolError() End\n");
+	return KErrNone;
+	}
+	
+	
+/**
+GetExtendedReference()
+
+Populates aRrlpRef if Rel-5 Extended Reference is present in the received message
+
+@param  aRrlpRef local copy of the session reference details
+@return KErrNotFound if the extended reference parameters are not present,
+        KErrNone otherwise
+*/
+TInt CRrlpProtocolError::GetExtendedReference(TRrlpReference& aRrlpRef)
+	{
+	__ASSERT_DEBUG(iData->component.u.protocolError != NULL, User::Invariant());
+	
+	if (iData->component.u.protocolError->m.rel_5_ProtocolError_ExtensionPresent !=0)
+		{
+		if (iData->component.u.protocolError->rel_5_ProtocolError_Extension.m.extended_referencePresent !=0)
+			{
+			aRrlpRef.aRel5EntendedRefPresent = ETrue;
+			aRrlpRef.aRel5SmlcCode = iData->component.u.protocolError->rel_5_ProtocolError_Extension.extended_reference.smlc_code;
+			aRrlpRef.aRel5TransactionId = iData->component.u.protocolError->rel_5_ProtocolError_Extension.extended_reference.transaction_ID;
+			}
+		else
+			{
+			return KErrNotFound;
+			}
+		}
+	else
+		{
+		return KErrNotFound;
+		}
+	return KErrNone;
+	}
+
+
+/**
+SetExtendedReference()
+
+Sets the extended reference parameters in the outgoing message, if they are set
+in the passed container.
+
+@param aRrlpRef on return, populated with the session reference details
+@return KErrNotFound if no extended reference data is present, 
+		KErrNone otherwise
+*/	
+TInt CRrlpProtocolError::SetExtendedReference(const TRrlpReference& aRrlpRef)
+	{
+	__ASSERT_DEBUG(iData->component.u.protocolError != NULL, User::Invariant());
+	
+	// if present, populate the optional Rel-5 extended reference
+	if (aRrlpRef.aRel5EntendedRefPresent)
+		{
+		// mark the optional component present
+		iData->component.u.protocolError->m.rel_5_ProtocolError_ExtensionPresent = 1;
+		iData->component.u.protocolError->rel_5_ProtocolError_Extension.m.extended_referencePresent = 1;
+		ASN1T_Extended_reference* extendedRef = &iData->component.u.protocolError->rel_5_ProtocolError_Extension.extended_reference;
+		extendedRef->smlc_code = aRrlpRef.aRel5SmlcCode;
+		extendedRef->transaction_ID = aRrlpRef.aRel5TransactionId;
+		}
+	else
+		{
+		return KErrNotFound;
+		}
+	
+	return KErrNone;
+	}
+	
+