networkcontrol/iptransportlayer/inc/policyrequeststates.h
changeset 0 af10295192d8
equal deleted inserted replaced
-1:000000000000 0:af10295192d8
       
     1 // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 /**
       
    17  @file
       
    18  @internal
       
    19  @released
       
    20 */
       
    21 
       
    22 #if !defined(POLICYREQUESTSTATES_H)
       
    23 #define POLICYREQUESTSTATES_H
       
    24 
       
    25 #include <comms-infras/ss_nodemessages.h>
       
    26 #include <comms-infras/ss_coreprstates.h>
       
    27 #include <comms-infras/ss_corepractivities.h>
       
    28 #include "policyrequest.h"
       
    29 
       
    30 namespace PolicyRequestStates
       
    31 {
       
    32 
       
    33 typedef MeshMachine::TNodeContext<CPolicyRequest, CoreStates::TContext> TContext;
       
    34 
       
    35 //
       
    36 //Default self generated error handling for request transitions
       
    37 template<class TCONTEXT>
       
    38 NONSHARABLE_CLASS(TPolicyRequestTransitionBase) : public MeshMachine::TStateTransition<TCONTEXT>
       
    39     {
       
    40 public:
       
    41     explicit TPolicyRequestTransitionBase(TCONTEXT& aContext)
       
    42     :	MeshMachine::TStateTransition<TCONTEXT>(aContext) {}
       
    43 
       
    44 	virtual void Error(TInt aError)
       
    45 	    {
       
    46         this->iContext.iReturn = aError;
       
    47        	this->iContext.Node().iError = aError;
       
    48         MeshMachine::TStateTransition<TCONTEXT>::Error(aError);
       
    49         }
       
    50     };
       
    51 
       
    52 //
       
    53 // Default Cancel and Error handling for states of CESockClientActivityBase Activities
       
    54 // Intended for ECAB'isation of an otherwise normal state
       
    55 // Not intended to be used as the first ECAB state (no TransitionTag handling) which
       
    56 // is never actually desired (specific Accept must be present for the first state of ECAB)
       
    57 template<class TSTATE>
       
    58 NONSHARABLE_CLASS(TPolicyRequestState) : public TSTATE
       
    59     {
       
    60 public:
       
    61 	NETSM_TPL_DECLARE_CTR(TPolicyRequestState, NetStateMachine::MState, TContext)
       
    62 
       
    63     explicit TPolicyRequestState(TContext& aContext)
       
    64     :	TSTATE(aContext)
       
    65         {
       
    66         }
       
    67 
       
    68 	virtual TBool Accept()
       
    69     	{
       
    70     	Messages::TEBase::TError* msg = Messages::message_cast<Messages::TEBase::TError>(&this->iContext.iCFMessageSig);
       
    71     	if(msg)
       
    72 	    	{
       
    73 			// save error in activity so it will be forwarded on to originator when the node is destroyed.
       
    74 	    	CPolicyRequest& fr = static_cast<CPolicyRequest&>(this->iContext.Node());
       
    75 	    	fr.iError = msg->iValue;
       
    76 	    	// Error handling has to clean-up node properly, including leaving the client nodes. Done through an
       
    77 	    	// explicit error handling activity that we trigger by forwarding the message to ourself: we can't
       
    78 	    	// let it get originated by a client because their subsequent leave will abort the activity
       
    79 			Messages::TNodeId selfId(this->iContext.Node()());
       
    80 	    	if(this->iContext.iSender != selfId)
       
    81 	    		{
       
    82 	    		Messages::RClientInterface::OpenPostMessageClose(selfId, selfId, *msg);
       
    83 	    		}
       
    84     		this->iContext.iCFMessageSig.ClearMessageId();
       
    85     		return EFalse;
       
    86     		}
       
    87     	return TSTATE::Accept();
       
    88     	}
       
    89 
       
    90 	virtual void Cancel()
       
    91         {
       
    92         // We're handling our own abort sequence
       
    93         this->iContext.iCFMessageSig.iReturn = KErrNone;
       
    94         }
       
    95 
       
    96     };
       
    97 
       
    98 //
       
    99 // States
       
   100 //
       
   101 DECLARE_SMELEMENT_HEADER( TAwaitingBinderResponse, MeshMachine::TState<TContext>, NetStateMachine::MState, TContext )
       
   102 	virtual TBool Accept();
       
   103 DECLARE_SMELEMENT_FOOTER( TAwaitingBinderResponse )
       
   104 
       
   105 DECLARE_SMELEMENT_HEADER( TAwaitingConnPolicyRequest, MeshMachine::TState<TContext>, NetStateMachine::MState, TContext )
       
   106 	virtual TBool Accept();
       
   107 DECLARE_SMELEMENT_FOOTER( TAwaitingConnPolicyRequest )
       
   108 
       
   109 DECLARE_SMELEMENT_HEADER( TAwaitingCancelError, MeshMachine::TState<TContext>, NetStateMachine::MState, TContext )
       
   110 	virtual TBool Accept();
       
   111 DECLARE_SMELEMENT_FOOTER( TAwaitingCancelError )
       
   112 
       
   113 //
       
   114 // Activities
       
   115 //
       
   116 
       
   117 DECLARE_SMELEMENT_HEADER( TSendQoSParamsToNewSCpr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
       
   118 	virtual void DoL();
       
   119 DECLARE_SMELEMENT_FOOTER( TSendQoSParamsToNewSCpr )
       
   120 
       
   121 DECLARE_SMELEMENT_HEADER( TJoinReceivedSCpr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
       
   122 	virtual void DoL();
       
   123 DECLARE_SMELEMENT_FOOTER( TJoinReceivedSCpr )
       
   124 
       
   125 DECLARE_SMELEMENT_HEADER( TRequestCommsBinderFromSCpr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
       
   126 	virtual void DoL();
       
   127 DECLARE_SMELEMENT_FOOTER( TRequestCommsBinderFromSCpr )
       
   128 
       
   129 DECLARE_SMELEMENT_HEADER( TAwaitingError, MeshMachine::TState<TContext>, NetStateMachine::MState, TContext )
       
   130 	virtual TBool Accept();
       
   131 DECLARE_SMELEMENT_FOOTER( TAwaitingError )
       
   132 
       
   133 DECLARE_SMELEMENT_HEADER( TJoinCpr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
       
   134 	virtual void DoL();
       
   135 DECLARE_SMELEMENT_FOOTER( TJoinCpr )
       
   136 
       
   137 DECLARE_SMELEMENT_HEADER( TLeaveCpr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
       
   138 	virtual void DoL();
       
   139 DECLARE_SMELEMENT_FOOTER( TLeaveCpr )
       
   140 
       
   141 DECLARE_SMELEMENT_HEADER( TSendBindToComplete, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
       
   142 	virtual void DoL();
       
   143 DECLARE_SMELEMENT_FOOTER( TSendBindToComplete )
       
   144 
       
   145 
       
   146 //-=========================================================
       
   147 //Rejoin
       
   148 //-=========================================================
       
   149 DECLARE_SMELEMENT_HEADER( TJoinTheDeftSCPr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
       
   150 	virtual void DoL();
       
   151 DECLARE_SMELEMENT_FOOTER( TJoinTheDeftSCPr )
       
   152 
       
   153 DECLARE_SMELEMENT_HEADER( TLeaveTheDeftSCPr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
       
   154 	virtual void DoL();
       
   155 DECLARE_SMELEMENT_FOOTER( TLeaveTheDeftSCPr )
       
   156 
       
   157 DECLARE_SMELEMENT_HEADER( TSendRejoinDataClientRequestToDeftSCPr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
       
   158 	virtual void DoL();
       
   159 DECLARE_SMELEMENT_FOOTER( TSendRejoinDataClientRequestToDeftSCPr )
       
   160 
       
   161 DECLARE_SMELEMENT_HEADER( TSendApplyToDeftSCPr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
       
   162 	virtual void DoL();
       
   163 DECLARE_SMELEMENT_FOOTER( TSendApplyToDeftSCPr )
       
   164 
       
   165 DECLARE_SMELEMENT_HEADER( TSendApplyToNewSCPr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
       
   166 	virtual void DoL();
       
   167 DECLARE_SMELEMENT_FOOTER( TSendApplyToNewSCPr )
       
   168 
       
   169 DECLARE_SMELEMENT_HEADER( TSendCancelToDeftSCPr, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
       
   170 	virtual void DoL();
       
   171 DECLARE_SMELEMENT_FOOTER( TSendCancelToDeftSCPr )
       
   172 
       
   173 DECLARE_SMELEMENT_HEADER( TIgnoreAndCloseSubConEvent, PolicyRequestStates::TPolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
       
   174 	virtual void DoL();
       
   175 DECLARE_SMELEMENT_FOOTER( TIgnoreAndCloseSubConEvent )
       
   176 
       
   177 //
       
   178 //SCpr specific
       
   179 /*DECLARE_SMELEMENT_NAMESPACE_HEADER( TJoinSCpr, PolicyRequestStates, PolicyRequestTransitionBase<TContext>, NetStateMachine::MStateTransition, TContext )
       
   180 	virtual void DoL();
       
   181 DECLARE_SMELEMENT_FOOTER( TJoinSCpr )*/
       
   182 
       
   183 } //namespace PolicyRequestStates
       
   184 
       
   185 
       
   186 namespace PolicyRequestActivities
       
   187 {
       
   188 
       
   189 NONSHARABLE_CLASS(CPolicyRequestActivity) : public MeshMachine::CNodeActivityBase, public CoreActivities::ABindingActivity,
       
   190 											public ITFHIERARCHY_1(CPolicyRequestActivity, CoreActivities::ABindingActivity)
       
   191 	{
       
   192 public:
       
   193 	typedef ITFHIERARCHY_1(CPolicyRequestActivity, CoreActivities::ABindingActivity) TIfStaticFetcherNearestInHierarchy;
       
   194 
       
   195 public:
       
   196     static MeshMachine::CNodeActivityBase* NewL(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode)
       
   197     	{
       
   198 		return new (ELeave) CPolicyRequestActivity(aActivitySig,aNode,static_cast<const CPolicyRequest&>(aNode));
       
   199     	}
       
   200 
       
   201 	void ReturnInterfacePtrL(CoreActivities::ABindingActivity*& aInterface)
       
   202 		{
       
   203 		aInterface = this;
       
   204 		}
       
   205 
       
   206 protected:
       
   207 	CPolicyRequestActivity(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode, const CPolicyRequest& aPolicyRequest)
       
   208 	:MeshMachine::CNodeActivityBase(aActivitySig, aNode),
       
   209 	 ABindingActivity(aNode.Id()),
       
   210 	 TIfStaticFetcherNearestInHierarchy(this),
       
   211 	 iPolicyRequest(&aPolicyRequest)
       
   212 		{
       
   213 		}
       
   214 
       
   215 	virtual ~CPolicyRequestActivity()
       
   216 		{
       
   217 		ASSERT(iPolicyRequest);
       
   218 		if (iPolicyRequest->CountAllActivities()==0)
       
   219 			{
       
   220 			delete iPolicyRequest;
       
   221 			}
       
   222 		SetError(KErrNone);	// any bad news we're carrying gets passed to the client through the request
       
   223 		}
       
   224 
       
   225 private:
       
   226 	const CPolicyRequest* iPolicyRequest;
       
   227 	};
       
   228 
       
   229 } //namespace PolicyRequestActivities
       
   230 
       
   231 
       
   232 #endif
       
   233 // QOSPOLICYREQUESTSTATES_H
       
   234