diff -r 000000000000 -r 3553901f7fa8 telephonyprotocols/pdplayer/src/pdpmcprstates.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyprotocols/pdplayer/src/pdpmcprstates.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,136 @@ +// Copyright (c) 2007-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: +// + +#include +#include +#include +#include +#include "pdpmcpr.h" +#include "pdpmcprstates.h" + +using namespace ESock; +using namespace NetStateMachine; +using namespace Messages; + +namespace PdpMCprStates +{ +} + +namespace PdpMCprErrorRecoveryActivity +{ + +DEFINE_SMELEMENT(CPdpErrorRecoveryActivity::TAwaitingContentionResult, NetStateMachine::MState, PdpMCprStates::TContext) +TBool CPdpErrorRecoveryActivity::TAwaitingContentionResult::Accept() + { + TPdpContentionMessages::TPdpContentionResultMessage* msg = message_cast(&iContext.iMessage); + CPdpErrorRecoveryActivity& activity = static_cast(*iContext.iNodeActivity); + if(msg && msg->iNodeId == activity.iPendingCprId) + { + return ETrue; + } + return EFalse; + } + + +DEFINE_SMELEMENT(CPdpErrorRecoveryActivity::TPdpContentionNoTagOrError, NetStateMachine::MStateFork, PdpMCprStates::TContext) +TInt CPdpErrorRecoveryActivity::TPdpContentionNoTagOrError::TransitionTag() + { + CPdpErrorRecoveryActivity& activity = static_cast(*iContext.iNodeActivity); + + if (activity.iPendingCprId == Messages::TNodeId::NullId()) + { + return MeshMachine::KErrorTag; + } + else + { + return MeshMachine::KNoTag; + } + } + +DEFINE_SMELEMENT(CPdpErrorRecoveryActivity::TProcessErrorRecoveryReq, NetStateMachine::MStateTransition, PdpMCprStates::TContext) +void CPdpErrorRecoveryActivity::TProcessErrorRecoveryReq::DoL() + { + TEErrorRecovery::TErrorRecoveryRequest& req = message_cast(iContext.iMessage); + TInt error = req.iErrContext.iStateChange.iError; + +#ifdef SYMBIAN_NETWORKING_CONTENTION_MANAGEMENT + if (req.iErrContext.iStateChange.iError == KErrUmtsMaxNumOfContextExceededByNetwork || + req.iErrContext.iStateChange.iError == KErrUmtsMaxNumOfContextExceededByPhone) + { + // Get sender's priority + TClientIter iter = iContext.Node().GetClientIter(TCFClientType(TCFClientType::EData)); + ESock::RCFNodePriorityInterface* dataClient; + TBool wasFound = EFalse; + TUint cprPriority = KMaxTUint; + while ((dataClient = static_cast(iter++)) != NULL) + { + if (dataClient->RecipientId() == req.iErrContext.iOriginator) + { + cprPriority = dataClient->Priority(); + wasFound = ETrue; + } + } + if (wasFound) + { + TInt err = KErrNone; + TBool result = EFalse; + TRAP(err, result = iContext.Node().GetTierManager()->HandleContentionL(&iContext.Node(), req.iErrContext.iOriginator, cprPriority)); + if (err == KErrNone && result) + { + CPdpErrorRecoveryActivity& activity = static_cast(*iContext.iNodeActivity); + activity.iPendingCprId = req.iErrContext.iOriginator; + activity.iCprActivity = req.iErrContext.iActivitySigId; + activity.iCprMessageId = req.iErrContext.iMessageId; + activity.iErrorCode = error; + // The contention request has been added into query, Reset message error code. + // TErrResponse will be send from Mcpr's ContentionResolved function. + error = KErrNone; + } + } + } +#endif + + if (error != KErrNone) + { + TErrResponse propagateResp(TErrResponse::EPropagate, error, req.iErrContext.iMessageId); + TEErrorRecovery::TErrorRecoveryResponse rawResp (propagateResp); + + TCFSafeMessage::TResponseCarrierWest resp(rawResp, iContext.iSender); + iContext.PostToSender(resp); + } + } + +DEFINE_SMELEMENT(CPdpErrorRecoveryActivity::TProcessContentionResult, NetStateMachine::MStateTransition, PdpMCprStates::TContext) +void CPdpErrorRecoveryActivity::TProcessContentionResult::DoL() + { + TPdpContentionMessages::TPdpContentionResultMessage* msg = message_cast(&iContext.iMessage); + CPdpErrorRecoveryActivity& activity = static_cast(*iContext.iNodeActivity); + if (msg->iValue != 0) + { + TErrResponse retryResp(TErrResponse::ERetry, 0, activity.iCprMessageId); + TEErrorRecovery::TErrorRecoveryResponse rawResp (retryResp); + TCFSafeMessage::TResponseCarrierWest resp(rawResp, activity.iOriginators[0].RecipientId()); + iContext.PostToSender(resp); + } + else + { + TErrResponse propagateResp(TErrResponse::EPropagate, activity.iErrorCode, activity.iCprMessageId); + TEErrorRecovery::TErrorRecoveryResponse rawResp (propagateResp); + TCFSafeMessage::TResponseCarrierWest resp(rawResp, activity.iOriginators[0].RecipientId()); + iContext.PostToSender(resp); + } + } +} +