--- /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 <comms-infras/ss_nodemessages.h>
+#include <comms-infras/ss_coreprstates.h>
+#include <comms-infras/ss_corepractivities.h>
+#include "policyrequest.h"
+
+namespace PolicyRequestStates
+{
+
+typedef MeshMachine::TNodeContext<CPolicyRequest, CoreStates::TContext> TContext;
+
+//
+//Default self generated error handling for request transitions
+template<class TCONTEXT>
+NONSHARABLE_CLASS(TPolicyRequestTransitionBase) : public MeshMachine::TStateTransition<TCONTEXT>
+ {
+public:
+ explicit TPolicyRequestTransitionBase(TCONTEXT& aContext)
+ : MeshMachine::TStateTransition<TCONTEXT>(aContext) {}
+
+ virtual void Error(TInt aError)
+ {
+ this->iContext.iReturn = aError;
+ this->iContext.Node().iError = aError;
+ MeshMachine::TStateTransition<TCONTEXT>::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<class TSTATE>
+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<Messages::TEBase::TError>(&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<CPolicyRequest&>(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<TContext>, NetStateMachine::MState, TContext )
+ virtual TBool Accept();
+DECLARE_SMELEMENT_FOOTER( TAwaitingBinderResponse )
+
+DECLARE_SMELEMENT_HEADER( TAwaitingConnPolicyRequest, MeshMachine::TState<TContext>, NetStateMachine::MState, TContext )
+ virtual TBool Accept();
+DECLARE_SMELEMENT_FOOTER( TAwaitingConnPolicyRequest )
+
+DECLARE_SMELEMENT_HEADER( TAwaitingCancelError, MeshMachine::TState<TContext>, NetStateMachine::MState, TContext )
+ virtual TBool Accept();
+DECLARE_SMELEMENT_FOOTER( TAwaitingCancelError )
+
+//
+// Activities
+//
+
+DECLARE_SMELEMENT_HEADER( TSendQoSParamsToNewSCpr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL();
+DECLARE_SMELEMENT_FOOTER( TSendQoSParamsToNewSCpr )
+
+DECLARE_SMELEMENT_HEADER( TJoinReceivedSCpr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL();
+DECLARE_SMELEMENT_FOOTER( TJoinReceivedSCpr )
+
+DECLARE_SMELEMENT_HEADER( TRequestCommsBinderFromSCpr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL();
+DECLARE_SMELEMENT_FOOTER( TRequestCommsBinderFromSCpr )
+
+DECLARE_SMELEMENT_HEADER( TAwaitingError, MeshMachine::TState<TContext>, NetStateMachine::MState, TContext )
+ virtual TBool Accept();
+DECLARE_SMELEMENT_FOOTER( TAwaitingError )
+
+DECLARE_SMELEMENT_HEADER( TJoinCpr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL();
+DECLARE_SMELEMENT_FOOTER( TJoinCpr )
+
+DECLARE_SMELEMENT_HEADER( TLeaveCpr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL();
+DECLARE_SMELEMENT_FOOTER( TLeaveCpr )
+
+DECLARE_SMELEMENT_HEADER( TSendBindToComplete, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL();
+DECLARE_SMELEMENT_FOOTER( TSendBindToComplete )
+
+
+//-=========================================================
+//Rejoin
+//-=========================================================
+DECLARE_SMELEMENT_HEADER( TJoinTheDeftSCPr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL();
+DECLARE_SMELEMENT_FOOTER( TJoinTheDeftSCPr )
+
+DECLARE_SMELEMENT_HEADER( TLeaveTheDeftSCPr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL();
+DECLARE_SMELEMENT_FOOTER( TLeaveTheDeftSCPr )
+
+DECLARE_SMELEMENT_HEADER( TSendRejoinDataClientRequestToDeftSCPr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL();
+DECLARE_SMELEMENT_FOOTER( TSendRejoinDataClientRequestToDeftSCPr )
+
+DECLARE_SMELEMENT_HEADER( TSendApplyToDeftSCPr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL();
+DECLARE_SMELEMENT_FOOTER( TSendApplyToDeftSCPr )
+
+DECLARE_SMELEMENT_HEADER( TSendApplyToNewSCPr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL();
+DECLARE_SMELEMENT_FOOTER( TSendApplyToNewSCPr )
+
+DECLARE_SMELEMENT_HEADER( TSendCancelToDeftSCPr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL();
+DECLARE_SMELEMENT_FOOTER( TSendCancelToDeftSCPr )
+
+DECLARE_SMELEMENT_HEADER( TIgnoreAndCloseSubConEvent, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
+ virtual void DoL();
+DECLARE_SMELEMENT_FOOTER( TIgnoreAndCloseSubConEvent )
+
+//
+//SCpr specific
+/*DECLARE_SMELEMENT_NAMESPACE_HEADER( TJoinSCpr, PolicyRequestStates, PolicyRequestTransitionBase<TContext>, 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<const CPolicyRequest&>(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
+