networkcontrol/iptransportlayer/src/policyrequeststates.cpp
changeset 0 af10295192d8
child 7 db85996de7c4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkcontrol/iptransportlayer/src/policyrequeststates.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,229 @@
+// 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:
+//
+
+#include <comms-infras/ss_log.h>
+#include "ss_glob.h"
+#include "policyrequest.h"
+#include "policyrequeststates.h"
+#include <comms-infras/ss_mcprnodemessages.h>
+#include <comms-infras/ss_coreprstates.h>
+
+#include <comms-infras/ss_nodemessages_dataclient.h>
+#include <comms-infras/ss_nodemessages_rejoiningprovider.h>
+#include <comms-infras/ss_nodemessages_subconn.h>
+#include <comms-infras/ss_nodemessages_scpr.h>
+
+using namespace Messages;
+using namespace MeshMachine;
+using namespace ESock;
+using namespace PolicyRequestStates;
+using namespace CorePanics;
+
+#ifdef _DEBUG
+_LIT (KCPolicyRequestPanic,"PolicyRequestPanic");
+#endif
+
+//
+// States
+//
+DEFINE_SMELEMENT( TAwaitingBinderResponse, NetStateMachine::MState, PolicyRequestStates::TContext)
+TBool TAwaitingBinderResponse::Accept()
+	{
+	const TCFServiceProvider::TCommsBinderResponse* br = message_cast<TCFServiceProvider::TCommsBinderResponse>(&iContext.iMessage);
+	if (br)
+    	{
+        iContext.Node().iNewSCprId = br->iNodeId;
+        return ETrue;        
+    	}
+	return EFalse;
+	}
+
+DEFINE_SMELEMENT( TAwaitingConnPolicyRequest, NetStateMachine::MState, PolicyRequestStates::TContext)
+TBool PolicyRequestStates::TAwaitingConnPolicyRequest::Accept()
+	{
+	TCFIPMessage::TPolicyRequest* PolicyReqMsg = message_cast<TCFIPMessage::TPolicyRequest>(&iContext.iMessage);
+	return PolicyReqMsg && PolicyReqMsg->iValue == ESoCreateWithConnection ? ETrue : EFalse;
+	}
+
+//
+// Activities
+//
+
+DEFINE_SMELEMENT( TSendQoSParamsToNewSCpr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
+void TSendQoSParamsToNewSCpr::DoL()
+	{
+#ifdef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+	iContext.iNodeActivity->PostRequestTo(*iContext.Node().ServiceProvider(),
+	    ESock::TCFScpr::TSetParamsRequest(iContext.Node().iParamBundle).CRef());
+#else
+	iContext.iNodeActivity->PostRequestTo(*iContext.Node().ServiceProvider(),
+	    ESock::TCFScpr::TParamsRequest(iContext.Node().iParamBundle).CRef());
+#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+	}
+
+DEFINE_SMELEMENT( TJoinReceivedSCpr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
+void PolicyRequestStates::TJoinReceivedSCpr::DoL()
+	{
+	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic, KPanicNoActivity));
+	__ASSERT_DEBUG(iContext.iPeer == iContext.Node().ServiceProvider(), User::Panic(KCPolicyRequestPanic, KPanicExpectedNoServiceProvider));
+
+	TCFServiceProvider::TCommsBinderResponse& br = message_cast<TCFServiceProvider::TCommsBinderResponse>(iContext.iMessage);
+    iContext.Node().AddClientL(br.iNodeId, TClientType(TCFClientType::EServProvider, TCFClientType::EActive));
+
+    iContext.iNodeActivity->PostRequestTo(br.iNodeId,
+    	TCFServiceProvider::TJoinRequest(iContext.NodeId(), TClientType(TCFClientType::ECtrl)).CRef());
+	}
+
+DEFINE_SMELEMENT( TRequestCommsBinderFromSCpr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
+void PolicyRequestStates::TRequestCommsBinderFromSCpr::DoL()
+	{
+    __ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic, KPanicNoActivity));
+    RNodeInterface* sp = iContext.Node().ServiceProvider();
+    __ASSERT_DEBUG(sp, User::Panic(KCPolicyRequestPanic, KPanicNoServiceProvider));
+    iContext.iNodeActivity->PostRequestTo(*sp,
+    	TCFServiceProvider::TCommsBinderRequest(TSubConnOpen::ECreateNew).CRef());
+	}
+
+DEFINE_SMELEMENT( TAwaitingError, NetStateMachine::MState, PolicyRequestStates::TContext)
+TBool PolicyRequestStates::TAwaitingError::Accept()
+	{
+	return iContext.iMessage.IsMessage<TEBase::TError>();
+	}
+
+DEFINE_SMELEMENT( TAwaitingCancelError, NetStateMachine::MState, PolicyRequestStates::TContext)
+TBool PolicyRequestStates::TAwaitingCancelError::Accept()
+	{
+	TEBase::TError* msg = message_cast<TEBase::TError>(&iContext.iMessage);
+
+	return msg && msg->iValue == KErrCancel;
+	}
+
+
+//
+//Cpr specific
+DEFINE_SMELEMENT( TJoinCpr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
+void PolicyRequestStates::TJoinCpr::DoL()
+	{
+	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic, KPanicNoActivity));
+	RNodeInterface* cpr = iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EServProvider, TCFClientType::EActive));
+
+	//The sc has been already added
+	__ASSERT_DEBUG(cpr != NULL, User::Panic(KCPolicyRequestPanic, KPanicNoServiceProvider));
+
+	//Join the service provider
+	iContext.iNodeActivity->PostRequestTo(*cpr,
+		TCFServiceProvider::TJoinRequest(iContext.NodeId(), TClientType(TCFClientType::ECtrl)).CRef());
+	}
+
+DEFINE_SMELEMENT( TLeaveCpr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
+void PolicyRequestStates::TLeaveCpr::DoL()
+	{
+	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic, KPanicNoActivity));
+	RNodeInterface* cpr = iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EServProvider, TCFClientType::EActive));
+
+	//The sc has been already added
+	__ASSERT_DEBUG(cpr != NULL, User::Panic(KCPolicyRequestPanic, KPanicNoServiceProvider));
+
+	//Leave the service provider
+	iContext.iNodeActivity->PostRequestTo(*cpr,
+		TEPeer::TLeaveRequest().CRef());
+	cpr->SetFlags(TCFClientType::ELeaving);
+	}
+
+
+DEFINE_SMELEMENT( TSendBindToComplete, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
+void PolicyRequestStates::TSendBindToComplete::DoL()
+	{
+	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic, KPanicNoActivity));
+	RNodeInterface* cpr = iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EServProvider, TCFClientType::EActive));
+
+	if(cpr)
+		{	
+		iContext.iNodeActivity->PostRequestTo(*cpr,
+			TCFDataClient::TBindToComplete(iContext.iNodeActivity->Error()).CRef());
+ 		}
+	}
+
+//-=========================================================
+//Rejoin
+//-=========================================================
+
+DEFINE_SMELEMENT( TJoinTheDeftSCPr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
+void PolicyRequestStates::TJoinTheDeftSCPr::DoL()
+	{
+	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic,KPanicNoActivity));
+
+	//MZTODO: activity using this transition - and possibly the whole approach - must be redesigned
+	//so that all destinations are safe! (used to be: TCtrlClientJoinRequestUnsafeDst).
+    iContext.Node().iDeftScprClient = iContext.Node().AddClientL(iContext.Node().iSenderSCPrNodeId, TClientType(TCFClientType::EServProvider, TCFClientType::EActive));
+
+    iContext.iNodeActivity->PostRequestTo(iContext.Node().iSenderSCPrNodeId,
+    	TCFServiceProvider::TJoinRequest(iContext.NodeId(), TClientType(TCFClientType::ECtrl)).CRef());
+	}
+
+DEFINE_SMELEMENT( TLeaveTheDeftSCPr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
+void PolicyRequestStates::TLeaveTheDeftSCPr::DoL()
+	{
+	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic,KPanicNoActivity));
+    RClientInterface::OpenPostMessageClose(TNodeCtxId(iContext.ActivityId(), iContext.NodeId()), iContext.Node().iSenderSCPrNodeId,
+    	TEPeer::TLeaveRequest().CRef());
+	iContext.Node().iDeftScprClient->SetFlags(TCFClientType::ELeaving);
+	}
+
+DEFINE_SMELEMENT( TSendRejoinDataClientRequestToDeftSCPr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
+void PolicyRequestStates::TSendRejoinDataClientRequestToDeftSCPr::DoL()
+	{
+	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic,KPanicNoActivity));
+
+    RClientInterface::OpenPostMessageClose(TNodeCtxId(iContext.ActivityId(), iContext.NodeId()), iContext.Node().iSenderSCPrNodeId,
+    	TCFRejoiningProvider::TRejoinDataClientRequest(iContext.Node().iFlowNodeId, iContext.Node().iNewSCprId).CRef());
+	}
+
+DEFINE_SMELEMENT( TSendApplyToDeftSCPr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
+void PolicyRequestStates::TSendApplyToDeftSCPr::DoL()
+	{
+	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic,KPanicNoActivity));
+    iContext.iNodeActivity->PostRequestTo(iContext.Node().iSenderSCPrNodeId,
+    	ESock::TCFScpr::TApplyRequest().CRef());
+	}
+
+DEFINE_SMELEMENT( TSendApplyToNewSCPr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
+void PolicyRequestStates::TSendApplyToNewSCPr::DoL()
+	{
+	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic,KPanicNoActivity));
+    iContext.iNodeActivity->PostRequestTo(iContext.Node().iNewSCprId,
+    	ESock::TCFScpr::TApplyRequest().CRef());
+	}
+
+DEFINE_SMELEMENT( TSendCancelToDeftSCPr, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
+void PolicyRequestStates::TSendCancelToDeftSCPr::DoL()
+	{
+	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCPolicyRequestPanic,KPanicNoActivity));
+
+    RClientInterface::OpenPostMessageClose(TNodeCtxId(iContext.ActivityId(), iContext.NodeId()), iContext.Node().iSenderSCPrNodeId,
+    	TEBase::TCancel().CRef());
+
+	iContext.iNodeActivity->ClearPostedTo(); // the error that comes in wont be a reply
+	}
+
+DEFINE_SMELEMENT( TIgnoreAndCloseSubConEvent, NetStateMachine::MStateTransition, PolicyRequestStates::TContext)
+void PolicyRequestStates::TIgnoreAndCloseSubConEvent::DoL()
+	{
+	TCFSubConnControlClient::TSubConnNotification& event = message_cast<TCFSubConnControlClient::TSubConnNotification>(iContext.iMessage);
+
+    event.iRefCountOwnedSubConNotification->Close();
+	}
+
+