networkcontrol/iptransportlayer/src/policyrequeststates.cpp
changeset 0 af10295192d8
child 7 db85996de7c4
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 #include <comms-infras/ss_log.h>
       
    17 #include "ss_glob.h"
       
    18 #include "policyrequest.h"
       
    19 #include "policyrequeststates.h"
       
    20 #include <comms-infras/ss_mcprnodemessages.h>
       
    21 #include <comms-infras/ss_coreprstates.h>
       
    22 
       
    23 #include <comms-infras/ss_nodemessages_dataclient.h>
       
    24 #include <comms-infras/ss_nodemessages_rejoiningprovider.h>
       
    25 #include <comms-infras/ss_nodemessages_subconn.h>
       
    26 #include <comms-infras/ss_nodemessages_scpr.h>
       
    27 
       
    28 using namespace Messages;
       
    29 using namespace MeshMachine;
       
    30 using namespace ESock;
       
    31 using namespace PolicyRequestStates;
       
    32 using namespace CorePanics;
       
    33 
       
    34 #ifdef _DEBUG
       
    35 _LIT (KCPolicyRequestPanic,"PolicyRequestPanic");
       
    36 #endif
       
    37 
       
    38 //
       
    39 // States
       
    40 //
       
    41 DEFINE_SMELEMENT( TAwaitingBinderResponse, NetStateMachine::MState, PolicyRequestStates::TContext)
       
    42 TBool TAwaitingBinderResponse::Accept()
       
    43 	{
       
    44 	const TCFServiceProvider::TCommsBinderResponse* br = message_cast<TCFServiceProvider::TCommsBinderResponse>(&iContext.iMessage);
       
    45 	if (br)
       
    46     	{
       
    47         iContext.Node().iNewSCprId = br->iNodeId;
       
    48         return ETrue;        
       
    49     	}
       
    50 	return EFalse;
       
    51 	}
       
    52 
       
    53 DEFINE_SMELEMENT( TAwaitingConnPolicyRequest, NetStateMachine::MState, PolicyRequestStates::TContext)
       
    54 TBool PolicyRequestStates::TAwaitingConnPolicyRequest::Accept()
       
    55 	{
       
    56 	TCFIPMessage::TPolicyRequest* PolicyReqMsg = message_cast<TCFIPMessage::TPolicyRequest>(&iContext.iMessage);
       
    57 	return PolicyReqMsg && PolicyReqMsg->iValue == ESoCreateWithConnection ? ETrue : EFalse;
       
    58 	}
       
    59 
       
    60 //
       
    61 // Activities
       
    62 //
       
    63 
       
    64 DEFINE_SMELEMENT( TSendQoSParamsToNewSCpr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
       
    65 void TSendQoSParamsToNewSCpr::DoL()
       
    66 	{
       
    67 #ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
       
    68 	iContext.iNodeActivity->PostRequestTo(*iContext.Node().ServiceProvider(),
       
    69 	    ESock::TCFScpr::TSetParamsRequest(iContext.Node().iParamBundle).CRef());
       
    70 #else
       
    71 	iContext.iNodeActivity->PostRequestTo(*iContext.Node().ServiceProvider(),
       
    72 	    ESock::TCFScpr::TParamsRequest(iContext.Node().iParamBundle).CRef());
       
    73 #endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
       
    74 	}
       
    75 
       
    76 DEFINE_SMELEMENT( TJoinReceivedSCpr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
       
    77 void PolicyRequestStates::TJoinReceivedSCpr::DoL()
       
    78 	{
       
    79 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic, KPanicNoActivity));
       
    80 	__ASSERT_DEBUG(iContext.iPeer == iContext.Node().ServiceProvider(), User::Panic(KCPolicyRequestPanic, KPanicExpectedNoServiceProvider));
       
    81 
       
    82 	TCFServiceProvider::TCommsBinderResponse& br = message_cast<TCFServiceProvider::TCommsBinderResponse>(iContext.iMessage);
       
    83     iContext.Node().AddClientL(br.iNodeId, TClientType(TCFClientType::EServProvider, TCFClientType::EActive));
       
    84 
       
    85     iContext.iNodeActivity->PostRequestTo(br.iNodeId,
       
    86     	TCFServiceProvider::TJoinRequest(iContext.NodeId(), TClientType(TCFClientType::ECtrl)).CRef());
       
    87 	}
       
    88 
       
    89 DEFINE_SMELEMENT( TRequestCommsBinderFromSCpr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
       
    90 void PolicyRequestStates::TRequestCommsBinderFromSCpr::DoL()
       
    91 	{
       
    92     __ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic, KPanicNoActivity));
       
    93     RNodeInterface* sp = iContext.Node().ServiceProvider();
       
    94     __ASSERT_DEBUG(sp, User::Panic(KCPolicyRequestPanic, KPanicNoServiceProvider));
       
    95     iContext.iNodeActivity->PostRequestTo(*sp,
       
    96     	TCFServiceProvider::TCommsBinderRequest(TSubConnOpen::ECreateNew).CRef());
       
    97 	}
       
    98 
       
    99 DEFINE_SMELEMENT( TAwaitingError, NetStateMachine::MState, PolicyRequestStates::TContext)
       
   100 TBool PolicyRequestStates::TAwaitingError::Accept()
       
   101 	{
       
   102 	return iContext.iMessage.IsMessage<TEBase::TError>();
       
   103 	}
       
   104 
       
   105 DEFINE_SMELEMENT( TAwaitingCancelError, NetStateMachine::MState, PolicyRequestStates::TContext)
       
   106 TBool PolicyRequestStates::TAwaitingCancelError::Accept()
       
   107 	{
       
   108 	TEBase::TError* msg = message_cast<TEBase::TError>(&iContext.iMessage);
       
   109 
       
   110 	return msg && msg->iValue == KErrCancel;
       
   111 	}
       
   112 
       
   113 
       
   114 //
       
   115 //Cpr specific
       
   116 DEFINE_SMELEMENT( TJoinCpr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
       
   117 void PolicyRequestStates::TJoinCpr::DoL()
       
   118 	{
       
   119 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic, KPanicNoActivity));
       
   120 	RNodeInterface* cpr = iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EServProvider, TCFClientType::EActive));
       
   121 
       
   122 	//The sc has been already added
       
   123 	__ASSERT_DEBUG(cpr != NULL, User::Panic(KCPolicyRequestPanic, KPanicNoServiceProvider));
       
   124 
       
   125 	//Join the service provider
       
   126 	iContext.iNodeActivity->PostRequestTo(*cpr,
       
   127 		TCFServiceProvider::TJoinRequest(iContext.NodeId(), TClientType(TCFClientType::ECtrl)).CRef());
       
   128 	}
       
   129 
       
   130 DEFINE_SMELEMENT( TLeaveCpr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
       
   131 void PolicyRequestStates::TLeaveCpr::DoL()
       
   132 	{
       
   133 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic, KPanicNoActivity));
       
   134 	RNodeInterface* cpr = iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EServProvider, TCFClientType::EActive));
       
   135 
       
   136 	//The sc has been already added
       
   137 	__ASSERT_DEBUG(cpr != NULL, User::Panic(KCPolicyRequestPanic, KPanicNoServiceProvider));
       
   138 
       
   139 	//Leave the service provider
       
   140 	iContext.iNodeActivity->PostRequestTo(*cpr,
       
   141 		TEPeer::TLeaveRequest().CRef());
       
   142 	cpr->SetFlags(TCFClientType::ELeaving);
       
   143 	}
       
   144 
       
   145 
       
   146 DEFINE_SMELEMENT( TSendBindToComplete, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
       
   147 void PolicyRequestStates::TSendBindToComplete::DoL()
       
   148 	{
       
   149 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic, KPanicNoActivity));
       
   150 	RNodeInterface* cpr = iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EServProvider, TCFClientType::EActive));
       
   151 
       
   152 	if(cpr)
       
   153 		{	
       
   154 		iContext.iNodeActivity->PostRequestTo(*cpr,
       
   155 			TCFDataClient::TBindToComplete(iContext.iNodeActivity->Error()).CRef());
       
   156  		}
       
   157 	}
       
   158 
       
   159 //-=========================================================
       
   160 //Rejoin
       
   161 //-=========================================================
       
   162 
       
   163 DEFINE_SMELEMENT( TJoinTheDeftSCPr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
       
   164 void PolicyRequestStates::TJoinTheDeftSCPr::DoL()
       
   165 	{
       
   166 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic,KPanicNoActivity));
       
   167 
       
   168 	//MZTODO: activity using this transition - and possibly the whole approach - must be redesigned
       
   169 	//so that all destinations are safe! (used to be: TCtrlClientJoinRequestUnsafeDst).
       
   170     iContext.Node().iDeftScprClient = iContext.Node().AddClientL(iContext.Node().iSenderSCPrNodeId, TClientType(TCFClientType::EServProvider, TCFClientType::EActive));
       
   171 
       
   172     iContext.iNodeActivity->PostRequestTo(iContext.Node().iSenderSCPrNodeId,
       
   173     	TCFServiceProvider::TJoinRequest(iContext.NodeId(), TClientType(TCFClientType::ECtrl)).CRef());
       
   174 	}
       
   175 
       
   176 DEFINE_SMELEMENT( TLeaveTheDeftSCPr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
       
   177 void PolicyRequestStates::TLeaveTheDeftSCPr::DoL()
       
   178 	{
       
   179 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic,KPanicNoActivity));
       
   180     RClientInterface::OpenPostMessageClose(TNodeCtxId(iContext.ActivityId(), iContext.NodeId()), iContext.Node().iSenderSCPrNodeId,
       
   181     	TEPeer::TLeaveRequest().CRef());
       
   182 	iContext.Node().iDeftScprClient->SetFlags(TCFClientType::ELeaving);
       
   183 	}
       
   184 
       
   185 DEFINE_SMELEMENT( TSendRejoinDataClientRequestToDeftSCPr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
       
   186 void PolicyRequestStates::TSendRejoinDataClientRequestToDeftSCPr::DoL()
       
   187 	{
       
   188 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic,KPanicNoActivity));
       
   189 
       
   190     RClientInterface::OpenPostMessageClose(TNodeCtxId(iContext.ActivityId(), iContext.NodeId()), iContext.Node().iSenderSCPrNodeId,
       
   191     	TCFRejoiningProvider::TRejoinDataClientRequest(iContext.Node().iFlowNodeId, iContext.Node().iNewSCprId).CRef());
       
   192 	}
       
   193 
       
   194 DEFINE_SMELEMENT( TSendApplyToDeftSCPr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
       
   195 void PolicyRequestStates::TSendApplyToDeftSCPr::DoL()
       
   196 	{
       
   197 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic,KPanicNoActivity));
       
   198     iContext.iNodeActivity->PostRequestTo(iContext.Node().iSenderSCPrNodeId,
       
   199     	ESock::TCFScpr::TApplyRequest().CRef());
       
   200 	}
       
   201 
       
   202 DEFINE_SMELEMENT( TSendApplyToNewSCPr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
       
   203 void PolicyRequestStates::TSendApplyToNewSCPr::DoL()
       
   204 	{
       
   205 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic,KPanicNoActivity));
       
   206     iContext.iNodeActivity->PostRequestTo(iContext.Node().iNewSCprId,
       
   207     	ESock::TCFScpr::TApplyRequest().CRef());
       
   208 	}
       
   209 
       
   210 DEFINE_SMELEMENT( TSendCancelToDeftSCPr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
       
   211 void PolicyRequestStates::TSendCancelToDeftSCPr::DoL()
       
   212 	{
       
   213 	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic,KPanicNoActivity));
       
   214 
       
   215     RClientInterface::OpenPostMessageClose(TNodeCtxId(iContext.ActivityId(), iContext.NodeId()), iContext.Node().iSenderSCPrNodeId,
       
   216     	TEBase::TCancel().CRef());
       
   217 
       
   218 	iContext.iNodeActivity->ClearPostedTo(); // the error that comes in wont be a reply
       
   219 	}
       
   220 
       
   221 DEFINE_SMELEMENT( TIgnoreAndCloseSubConEvent, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
       
   222 void PolicyRequestStates::TIgnoreAndCloseSubConEvent::DoL()
       
   223 	{
       
   224 	TCFSubConnControlClient::TSubConnNotification& event = message_cast<TCFSubConnControlClient::TSubConnNotification>(iContext.iMessage);
       
   225 
       
   226     event.iRefCountOwnedSubConNotification->Close();
       
   227 	}
       
   228 
       
   229