diff -r 000000000000 -r 9cfd9a3ee49c networkprotocolmodules/common/suplrrlpasn1/src/rrlpprotocolerror.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networkprotocolmodules/common/suplrrlpasn1/src/rrlpprotocolerror.cpp Tue Feb 02 01:50:39 2010 +0200 @@ -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; + } + +