diff -r 000000000000 -r af10295192d8 networkcontrol/iptransportlayer/inc/policyrequeststates.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networkcontrol/iptransportlayer/inc/policyrequeststates.h Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,234 @@ +// Copyright (c) 1997-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 + @internal + @released +*/ + +#if !defined(POLICYREQUESTSTATES_H) +#define POLICYREQUESTSTATES_H + +#include +#include +#include +#include "policyrequest.h" + +namespace PolicyRequestStates +{ + +typedef MeshMachine::TNodeContext TContext; + +// +//Default self generated error handling for request transitions +template +NONSHARABLE_CLASS(TPolicyRequestTransitionBase) : public MeshMachine::TStateTransition + { +public: + explicit TPolicyRequestTransitionBase(TCONTEXT& aContext) + : MeshMachine::TStateTransition(aContext) {} + + virtual void Error(TInt aError) + { + this->iContext.iReturn = aError; + this->iContext.Node().iError = aError; + MeshMachine::TStateTransition::Error(aError); + } + }; + +// +// Default Cancel and Error handling for states of CESockClientActivityBase Activities +// Intended for ECAB'isation of an otherwise normal state +// Not intended to be used as the first ECAB state (no TransitionTag handling) which +// is never actually desired (specific Accept must be present for the first state of ECAB) +template +NONSHARABLE_CLASS(TPolicyRequestState) : public TSTATE + { +public: + NETSM_TPL_DECLARE_CTR(TPolicyRequestState, NetStateMachine::MState, TContext) + + explicit TPolicyRequestState(TContext& aContext) + : TSTATE(aContext) + { + } + + virtual TBool Accept() + { + Messages::TEBase::TError* msg = Messages::message_cast(&this->iContext.iCFMessageSig); + if(msg) + { + // save error in activity so it will be forwarded on to originator when the node is destroyed. + CPolicyRequest& fr = static_cast(this->iContext.Node()); + fr.iError = msg->iValue; + // Error handling has to clean-up node properly, including leaving the client nodes. Done through an + // explicit error handling activity that we trigger by forwarding the message to ourself: we can't + // let it get originated by a client because their subsequent leave will abort the activity + Messages::TNodeId selfId(this->iContext.Node()()); + if(this->iContext.iSender != selfId) + { + Messages::RClientInterface::OpenPostMessageClose(selfId, selfId, *msg); + } + this->iContext.iCFMessageSig.ClearMessageId(); + return EFalse; + } + return TSTATE::Accept(); + } + + virtual void Cancel() + { + // We're handling our own abort sequence + this->iContext.iCFMessageSig.iReturn = KErrNone; + } + + }; + +// +// States +// +DECLARE_SMELEMENT_HEADER( TAwaitingBinderResponse, MeshMachine::TState, NetStateMachine::MState, TContext ) + virtual TBool Accept(); +DECLARE_SMELEMENT_FOOTER( TAwaitingBinderResponse ) + +DECLARE_SMELEMENT_HEADER( TAwaitingConnPolicyRequest, MeshMachine::TState, NetStateMachine::MState, TContext ) + virtual TBool Accept(); +DECLARE_SMELEMENT_FOOTER( TAwaitingConnPolicyRequest ) + +DECLARE_SMELEMENT_HEADER( TAwaitingCancelError, MeshMachine::TState, NetStateMachine::MState, TContext ) + virtual TBool Accept(); +DECLARE_SMELEMENT_FOOTER( TAwaitingCancelError ) + +// +// Activities +// + +DECLARE_SMELEMENT_HEADER( TSendQoSParamsToNewSCpr, PolicyRequestStates::TPolicyRequestTransitionBase, NetStateMachine::MStateTransition, TContext ) + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TSendQoSParamsToNewSCpr ) + +DECLARE_SMELEMENT_HEADER( TJoinReceivedSCpr, PolicyRequestStates::TPolicyRequestTransitionBase, NetStateMachine::MStateTransition, TContext ) + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TJoinReceivedSCpr ) + +DECLARE_SMELEMENT_HEADER( TRequestCommsBinderFromSCpr, PolicyRequestStates::TPolicyRequestTransitionBase, NetStateMachine::MStateTransition, TContext ) + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TRequestCommsBinderFromSCpr ) + +DECLARE_SMELEMENT_HEADER( TAwaitingError, MeshMachine::TState, NetStateMachine::MState, TContext ) + virtual TBool Accept(); +DECLARE_SMELEMENT_FOOTER( TAwaitingError ) + +DECLARE_SMELEMENT_HEADER( TJoinCpr, PolicyRequestStates::TPolicyRequestTransitionBase, NetStateMachine::MStateTransition, TContext ) + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TJoinCpr ) + +DECLARE_SMELEMENT_HEADER( TLeaveCpr, PolicyRequestStates::TPolicyRequestTransitionBase, NetStateMachine::MStateTransition, TContext ) + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TLeaveCpr ) + +DECLARE_SMELEMENT_HEADER( TSendBindToComplete, PolicyRequestStates::TPolicyRequestTransitionBase, NetStateMachine::MStateTransition, TContext ) + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TSendBindToComplete ) + + +//-========================================================= +//Rejoin +//-========================================================= +DECLARE_SMELEMENT_HEADER( TJoinTheDeftSCPr, PolicyRequestStates::TPolicyRequestTransitionBase, NetStateMachine::MStateTransition, TContext ) + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TJoinTheDeftSCPr ) + +DECLARE_SMELEMENT_HEADER( TLeaveTheDeftSCPr, PolicyRequestStates::TPolicyRequestTransitionBase, NetStateMachine::MStateTransition, TContext ) + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TLeaveTheDeftSCPr ) + +DECLARE_SMELEMENT_HEADER( TSendRejoinDataClientRequestToDeftSCPr, PolicyRequestStates::TPolicyRequestTransitionBase, NetStateMachine::MStateTransition, TContext ) + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TSendRejoinDataClientRequestToDeftSCPr ) + +DECLARE_SMELEMENT_HEADER( TSendApplyToDeftSCPr, PolicyRequestStates::TPolicyRequestTransitionBase, NetStateMachine::MStateTransition, TContext ) + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TSendApplyToDeftSCPr ) + +DECLARE_SMELEMENT_HEADER( TSendApplyToNewSCPr, PolicyRequestStates::TPolicyRequestTransitionBase, NetStateMachine::MStateTransition, TContext ) + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TSendApplyToNewSCPr ) + +DECLARE_SMELEMENT_HEADER( TSendCancelToDeftSCPr, PolicyRequestStates::TPolicyRequestTransitionBase, NetStateMachine::MStateTransition, TContext ) + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TSendCancelToDeftSCPr ) + +DECLARE_SMELEMENT_HEADER( TIgnoreAndCloseSubConEvent, PolicyRequestStates::TPolicyRequestTransitionBase, NetStateMachine::MStateTransition, TContext ) + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TIgnoreAndCloseSubConEvent ) + +// +//SCpr specific +/*DECLARE_SMELEMENT_NAMESPACE_HEADER( TJoinSCpr, PolicyRequestStates, PolicyRequestTransitionBase, NetStateMachine::MStateTransition, TContext ) + virtual void DoL(); +DECLARE_SMELEMENT_FOOTER( TJoinSCpr )*/ + +} //namespace PolicyRequestStates + + +namespace PolicyRequestActivities +{ + +NONSHARABLE_CLASS(CPolicyRequestActivity) : public MeshMachine::CNodeActivityBase, public CoreActivities::ABindingActivity, + public ITFHIERARCHY_1(CPolicyRequestActivity, CoreActivities::ABindingActivity) + { +public: + typedef ITFHIERARCHY_1(CPolicyRequestActivity, CoreActivities::ABindingActivity) TIfStaticFetcherNearestInHierarchy; + +public: + static MeshMachine::CNodeActivityBase* NewL(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode) + { + return new (ELeave) CPolicyRequestActivity(aActivitySig,aNode,static_cast(aNode)); + } + + void ReturnInterfacePtrL(CoreActivities::ABindingActivity*& aInterface) + { + aInterface = this; + } + +protected: + CPolicyRequestActivity(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode, const CPolicyRequest& aPolicyRequest) + :MeshMachine::CNodeActivityBase(aActivitySig, aNode), + ABindingActivity(aNode.Id()), + TIfStaticFetcherNearestInHierarchy(this), + iPolicyRequest(&aPolicyRequest) + { + } + + virtual ~CPolicyRequestActivity() + { + ASSERT(iPolicyRequest); + if (iPolicyRequest->CountAllActivities()==0) + { + delete iPolicyRequest; + } + SetError(KErrNone); // any bad news we're carrying gets passed to the client through the request + } + +private: + const CPolicyRequest* iPolicyRequest; + }; + +} //namespace PolicyRequestActivities + + +#endif +// QOSPOLICYREQUESTSTATES_H +