networkcontrol/iptransportlayer/src/ipscprstates.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkcontrol/iptransportlayer/src/ipscprstates.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,285 @@
+// Copyright (c) 2006-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:
+// IP SubConnection Provider states/transitions
+// 
+//
+
+/**
+ @file
+ @internalComponent
+*/
+
+#include <comms-infras/corescpractivities.h>
+#include <comms-infras/ss_coreprstates.h>
+#include "ipscprstates.h"
+#include "ipscprlog.h"
+
+using namespace Messages;
+using namespace ESock;
+using namespace IpSCprStates;
+using namespace MeshMachine;
+using namespace CorePanics;
+
+#if _DEBUG
+_LIT(KIpSCprPanic, "IpSCprPanic");
+#endif
+
+//-=========================================================
+//
+// Activities
+//
+//-=========================================================
+
+//-=========================================================
+//
+//States
+//
+//-=========================================================
+DEFINE_SMELEMENT(TAwaitingJoinComplete, NetStateMachine::MState, IpSCprStates::TContext)
+TBool TAwaitingJoinComplete::Accept()
+    {
+	__IPCPRLOG(IpCprLog::Printf(_L("TAwaitingJoinComplete::Accept [%08x]"), this));
+	return iContext.iMessage.IsMessage<TCFPeer::TJoinComplete>();
+    }
+//-=========================================================
+//
+//State Forks
+//
+//-=========================================================
+
+DEFINE_SMELEMENT(TNoTagOrSendApplyResponseOrErrorTag, NetStateMachine::MStateFork, IpSCprStates::TContext)
+TInt TNoTagOrSendApplyResponseOrErrorTag::TransitionTag()
+	{
+	__IPCPRLOG(IpCprLog::Printf(_L("TNoTagSendApplyResponseOrErrorTag::TransitionTag [%08x]"), this));
+
+	RIPDataClientNodeInterface* client = static_cast<RIPDataClientNodeInterface*>(
+	    iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EData, TCFClientType::EJoining)));
+
+	if (!client)
+    	{
+    	return SCprActivities::Apply::ESendApplyResponse;
+    	}
+
+	TInt err = iContext.Node().AddressCompletionValidation(*client);
+	if( KErrNone == err )
+		{
+		return KNoTag;
+		}
+	
+	iContext.iNodeActivity->SetError(err);
+	
+    return KErrorTag;
+	}
+
+DEFINE_SMELEMENT(TNoTagOrSendApplyResponse, NetStateMachine::MStateFork, IpSCprStates::TContext)
+TInt TNoTagOrSendApplyResponse::TransitionTag()
+	{
+	__IPCPRLOG(IpCprLog::Printf(_L("TNoTagOrSendApplyResponse::TransitionTag [%08x]"), this));
+
+	if (iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EData, TCFClientType::EJoining)) == NULL)
+    	{
+    	return SCprActivities::Apply::ESendApplyResponse;
+    	}
+
+    return KNoTag;
+	}
+
+DEFINE_SMELEMENT(TNoTagOrDoNothingTag, NetStateMachine::MStateFork, IpSCprStates::TContext)
+TInt TNoTagOrDoNothingTag::TransitionTag()
+	{
+	__IPCPRLOG(IpCprLog::Printf(_L("TNoTagOrNoBearerOrDoNothingTag::TransitionTag [%08x]"), this));
+
+	RIPDataClientNodeInterface* client =
+	    static_cast<RIPDataClientNodeInterface*>(iContext.iPeer);
+
+	if(!(client->Flags() & TCFClientType::EJoining)
+		&& (KErrNone == iContext.Node().AddressCompletionValidation(*client)) )
+		{
+		return KNoTag;
+		}
+
+	return KDoNothingTag;
+	}
+
+DEFINE_SMELEMENT(TDoNothingTag, NetStateMachine::MStateFork, IpSCprStates::TContext)
+TInt TDoNothingTag::TransitionTag()
+	{
+	return KDoNothingTag;
+	}
+
+DEFINE_SMELEMENT(TNoTagOrAlreadyStarted, NetStateMachine::MStateFork, IpSCprStates::TContext)
+TInt TNoTagOrAlreadyStarted::TransitionTag()
+    {
+    __ASSERT_DEBUG(iContext.iPeer || iContext.iSender == iContext.NodeId(), User::Panic(KIpSCprPanic,KPanicPeerMessage));
+	if (iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EServProvider, TCFClientType::EStarted)) != NULL)
+		{
+		// check Params
+		RCFParameterFamilyBundleC& bundle = iContext.Node().GetOrCreateParameterBundleL();
+		TInt num,i;
+        num = bundle.CountParameterSets();
+        STypeId typeId = STypeId::CreateSTypeId( CSubConIPAddressInfoParamSet::EUid,
+                                                CSubConIPAddressInfoParamSet::ETypeId );
+        for(i=0; i<num; i++)
+            {
+            RParameterFamily family = bundle.GetFamilyAtIndex(i);
+            if (family.IsNull())
+                {
+                continue;
+                }
+            else if(family.FindParameterSet(typeId,RParameterFamily::ERequested)!= NULL)
+                {
+                return CoreNetStates::KAlreadyStarted;
+                }
+            }
+		}
+	
+    return MeshMachine::KNoTag;
+    }
+//-=========================================================
+//
+//Transitions
+//
+//-=========================================================
+
+#ifndef SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+DEFINE_SMELEMENT(TSendParamsToServiceProvider, NetStateMachine::MStateTransition, IpSCprStates::TContext)
+void TSendParamsToServiceProvider::DoL()
+	{
+	__IPCPRLOG(IpCprLog::Printf(_L("TSendParamsToServiceProvider::DoL [%08x]"), this));
+
+	iContext.iNodeActivity->PostRequestTo(*iContext.Node().ServiceProvider(),
+	    TCFScpr::TParamsRequest(iContext.Node().iParameterBundle).CRef());
+	}
+#endif // SYMBIAN_ADAPTIVE_TCP_RECEIVE_WINDOW
+
+DEFINE_SMELEMENT(TSendSelfStart, NetStateMachine::MStateTransition, IpSCprStates::TContext)
+void TSendSelfStart::DoL()
+	{
+	__IPCPRLOG(IpCprLog::Printf(_L("TSendSelfStart::DoL [%08x]"), this));
+
+	__ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KIpSCprPanic, KPanicNoActivity));
+    iContext.iNodeActivity->PostRequestTo(iContext.NodeId(),
+    	TCFServiceProvider::TStart().CRef());
+	}
+
+DEFINE_SMELEMENT(TSetJoiningFlag, NetStateMachine::MStateTransition, IpSCprStates::TContext)
+void TSetJoiningFlag::DoL()
+	{
+	RIPDataClientNodeInterface* client =
+	    static_cast<RIPDataClientNodeInterface*>(iContext.iPeer);
+
+	ASSERT(client);
+
+	client->SetFlags(TCFClientType::EJoining);
+   }
+
+DEFINE_SMELEMENT(TClearJoiningFlag, NetStateMachine::MStateTransition, IpSCprStates::TContext)
+void TClearJoiningFlag::DoL()
+	{
+	RIPDataClientNodeInterface* client = static_cast<RIPDataClientNodeInterface*>(
+	    iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EData, TCFClientType::EJoining)));
+
+	ASSERT(client);
+
+	client->ClearFlags(TCFClientType::EJoining);
+   }
+
+DEFINE_SMELEMENT(TPrepareToAddClientToQosChannel, NetStateMachine::MStateTransition, IpSCprStates::TContext)
+void TPrepareToAddClientToQosChannel::DoL()
+	{
+	RIPDataClientNodeInterface* client =
+	    static_cast<RIPDataClientNodeInterface*>(iContext.iPeer);
+
+	if (client && !(client->Flags() & TCFClientType::EJoining))
+	   {
+	   client->SetFlags(TCFClientType::EJoining);
+
+	   IpSCprStates::TAddClientToQosChannel addToChannel(iContext);
+	   TRAPD(err, addToChannel.DoL();)
+
+	   client->ClearFlags(TCFClientType::EJoining);
+
+	   User::LeaveIfError(err);
+	   }
+   }
+
+DEFINE_SMELEMENT(TAddClientToQosChannel, NetStateMachine::MStateTransition, IpSCprStates::TContext)
+void TAddClientToQosChannel::DoL()
+	{
+	__IPCPRLOG(IpCprLog::Printf(_L("TAddClientToQosChannel::DoL [%08x]"), this));
+
+	RIPDataClientNodeInterface* clientToBeAdded = static_cast<RIPDataClientNodeInterface*>(
+	    iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EData, TCFClientType::EJoining)));
+	ASSERT(clientToBeAdded);
+
+
+	if (KErrNone == iContext.Node().AddressCompletionValidation(*clientToBeAdded) )
+		{
+		CSubConIPAddressInfoParamSet* IPAdressInfoParamSet = iContext.Node().InitBundleL();
+
+		if(IPAdressInfoParamSet)
+			{
+			// add Param info
+			IPAdressInfoParamSet->AddParamInfo(CSubConIPAddressInfoParamSet::TSubConIPAddressInfo(clientToBeAdded->iCliSrcAddr, clientToBeAdded->iCliDstAddr, clientToBeAdded->iProtocolId, CSubConIPAddressInfoParamSet::TSubConIPAddressInfo::EAdd));
+			__IPCPRLOG(IpCprLog::Printf(_L("SubConIPAddressParamInfo is added")));
+			}
+		else
+			{
+			// InitBundleL is already solving this
+			User::Leave(KErrArgument);
+			}
+
+		// kick start
+		ASSERT(iContext.iNodeActivity);
+		iContext.iNodeActivity->PostRequestTo(iContext.NodeId(), TCFServiceProvider::TStart().CRef());
+
+		__IPCPRLOG(IpCprLog::Printf(_L("TPrepareToAddClientToQosChannel::DoL [%08x], ActivityId=[%08x]"), this, iContext.iNodeActivity->ActivityId()));
+		}
+
+	}
+
+DEFINE_SMELEMENT(TCreateAddressInfoBundle, NetStateMachine::MStateTransition, IpSCprStates::TContext)
+void TCreateAddressInfoBundle::DoL()
+	{
+	RIPDataClientNodeInterface* dataClient =
+	    static_cast<RIPDataClientNodeInterface*>(iContext.iPeer);
+
+	ASSERT(dataClient);
+
+	CSubConIPAddressInfoParamSet* IPAdressInfoParamSet = iContext.Node().InitBundleL();
+
+	if(IPAdressInfoParamSet)
+		{
+		// add Param info
+		IPAdressInfoParamSet->AddParamInfo(CSubConIPAddressInfoParamSet::TSubConIPAddressInfo(dataClient->iCliSrcAddr, dataClient->iCliDstAddr, dataClient->iProtocolId, CSubConIPAddressInfoParamSet::TSubConIPAddressInfo::EAdd));
+		__IPCPRLOG(IpCprLog::Printf(_L("SubConIPAddressParamInfo is added")));
+		}
+	}
+
+DEFINE_SMELEMENT(TCreateAddressInfoBundleFromJoiningClient, NetStateMachine::MStateTransition, IpSCprStates::TContext)
+void TCreateAddressInfoBundleFromJoiningClient::DoL()
+	{
+	RIPDataClientNodeInterface* clientToBeAdded = static_cast<RIPDataClientNodeInterface*>(
+	    iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EData, TCFClientType::EJoining)));
+	ASSERT(clientToBeAdded);
+
+	CSubConIPAddressInfoParamSet* IPAdressInfoParamSet = iContext.Node().InitBundleL();
+
+	if(IPAdressInfoParamSet)
+		{
+		// add Param info
+		IPAdressInfoParamSet->AddParamInfo(CSubConIPAddressInfoParamSet::TSubConIPAddressInfo(clientToBeAdded->iCliSrcAddr, clientToBeAdded->iCliDstAddr, clientToBeAdded->iProtocolId, CSubConIPAddressInfoParamSet::TSubConIPAddressInfo::EAdd));
+		__IPCPRLOG(IpCprLog::Printf(_L("SubConIPAddressParamInfo is added")));
+		}
+	}