datacommsserver/esockserver/core_states/ss_corepractivities.cpp
changeset 1 21d2ab05f085
parent 0 dfb7c4ff071f
child 2 dee179edb159
--- a/datacommsserver/esockserver/core_states/ss_corepractivities.cpp	Thu Dec 17 09:22:25 2009 +0200
+++ b/datacommsserver/esockserver/core_states/ss_corepractivities.cpp	Thu Jan 07 13:34:53 2010 +0200
@@ -1,9 +1,9 @@
 // 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 the License "Symbian Foundation License v1.0"
+// under the terms of "Eclipse Public License v1.0"
 // which accompanies this distribution, and is available
-// at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
 //
 // Initial Contributors:
 // Nokia Corporation - initial contribution.
@@ -24,12 +24,14 @@
 
 #define SYMBIAN_NETWORKING_UPS
 
+#include "ss_corepractivities.h"
+
+
 #include <comms-infras/ss_log.h>
 #include "ss_internal_activities.h"
-#include "ss_coreprstates.h"
-#include "ss_corepractivities.h"
+#include <comms-infras/ss_coreprstates.h>
 #include <comms-infras/ss_subconnprov.h>
-#include "ss_mcprnodemessages.h"
+#include <comms-infras/ss_mcprnodemessages.h>
 
 #include <comms-infras/ss_protocolparameterset.h>
 #include <ss_glob.h>
@@ -40,10 +42,10 @@
 #include <elements/nm_messages_errorrecovery.h>
 #include "ss_nodemessages_dataclient.h"
 #include "ss_nodemessages_serviceprovider.h"
-#include "ss_nodemessages_rejoiningprovider.h"
-#include "ss_nodemessages_flow.h"
+#include <comms-infras/ss_nodemessages_rejoiningprovider.h>
+#include <comms-infras/ss_nodemessages_flow.h>
 #include "ss_nodemessages_factory.h"
-#include "ss_nodemessages_internal_esock.h"
+#include <comms-infras/ss_nodemessages_internal_esock.h>
 
 
 #ifdef _DEBUG
@@ -70,6 +72,7 @@
 using namespace MeshMachine;
 using namespace Factories;
 
+
 #ifdef _DEBUG
 _LIT (KCorePrPanic,"CorePrPanic");
 #endif
@@ -651,6 +654,16 @@
 	static_cast<ESock::CMMCommsProviderBase&>(iNode).DeleteMeNow();
 	}
 
+TBool CDestroyActivity::Next(TNodeContextBase& aContext)
+    {
+    if (aContext.iMessage.IsMessage<TEBase::TCancel>())
+        {  
+        return ETrue;
+        }
+    else
+        return CNodeActivityBase::Next(aContext);
+    }
+
 EXPORT_DEFINE_SMELEMENT(CDestroyActivity::TNoTagOrNoTagBackwards, NetStateMachine::MStateFork, PRStates::TContext)
 EXPORT_C TInt CDestroyActivity::TNoTagOrNoTagBackwards::TransitionTag()
     {
@@ -840,8 +853,6 @@
 	ACTIVITY_MAP_ENTRY(PRClientLeaveActivity, PRClientLeave)
 	ACTIVITY_MAP_ENTRY(PRForwardStateChangeActivity, PRForwardStateChange)
 	ACTIVITY_MAP_ENTRY(PRBindToActivity, PRBindTo)
-	ACTIVITY_MAP_ENTRY(PRDataClientStartActivity, PRDataClientStart)
-	ACTIVITY_MAP_ENTRY(PRDataClientStopActivity, PRDataClientStop)
 ACTIVITY_MAP_END_BASE(CoreActivities,coreActivitiesAll)
 
 //Activity Map provided by CorePr to be used by SCprs.
@@ -850,6 +861,8 @@
 	ACTIVITY_MAP_ENTRY(PRProvisionActivity, PrProvision)
     ACTIVITY_MAP_ENTRY(PRStartActivity, PRStart)
     ACTIVITY_MAP_ENTRY(PRStopActivity, PRStop)
+	ACTIVITY_MAP_ENTRY(PRDataClientStartActivity, PRDataClientStart)
+	ACTIVITY_MAP_ENTRY(PRDataClientStopActivity, PRDataClientStop)
 	ACTIVITY_MAP_ENTRY(PRDataClientIdleActivity, PRDataClientIdle)
 	ACTIVITY_MAP_ENTRY(PRDataClientActiveActivity, PRDataClientActive)
 	ACTIVITY_MAP_ENTRY(PRDestroyActivity, PRDestroy)
@@ -868,6 +881,8 @@
 	ACTIVITY_MAP_ENTRY(PRProvisionActivity, PrProvision)
     ACTIVITY_MAP_ENTRY(PRStartActivity, PRStart)
     ACTIVITY_MAP_ENTRY(PRStopActivity, PRStop)
+	ACTIVITY_MAP_ENTRY(PRDataClientStartActivity, PRDataClientStart)
+	ACTIVITY_MAP_ENTRY(PRDataClientStopActivity, PRDataClientStop)
 	ACTIVITY_MAP_ENTRY(PRDataClientIdleActivity, PRDataClientIdle)
 	ACTIVITY_MAP_ENTRY(PRDataClientActiveActivity, PRDataClientActive)
 	ACTIVITY_MAP_ENTRY(PRDestroyActivity, PRDestroy)
@@ -982,11 +997,13 @@
 	const TCFDataClient::TBindTo& bindToMsg(message_cast<const TCFDataClient::TBindTo>(iContext.iMessage));
 
 	__ASSERT_DEBUG(!bindToMsg.iNodeId.IsNull(), User::Panic(KCorePrPanic, KPanicNoServiceProvider));
-	activity.iNewServiceProvider = iContext.Node().AddClientL(bindToMsg.iNodeId,
-							TClientType(TCFClientType::EServProvider, TCFClientType::EActivating));
-	//Join the new service provider
-	iContext.iNodeActivity->PostRequestTo(*activity.iNewServiceProvider,
-							TCFControlClient::TJoinRequest(iContext.NodeId(), TClientType(TCFClientType::ECtrl)).CRef());
+    RNodeInterface* newServiceProvider = iContext.Node().AddClientL(bindToMsg.iNodeId,
+                            TClientType(TCFClientType::EServProvider, TCFClientType::EActivating));
+    __ASSERT_DEBUG(newServiceProvider, User::Panic(KCorePrPanic, KPanicNoServiceProvider));
+    activity.iNewServiceProvider = bindToMsg.iNodeId;
+    //Join the new service provider
+    iContext.Activity()->PostRequestTo(*newServiceProvider,
+                            TCFControlClient::TJoinRequest(iContext.NodeId(), TClientType(TCFClientType::ECtrl)).CRef());
     }
 
 EXPORT_DEFINE_SMELEMENT(CBindToActivity::TAwaitingBindToCompleteOrError, NetStateMachine::MState, CRejoinDataClientActivity::TContext)
@@ -1037,8 +1054,9 @@
   	CBindToActivity& activity = static_cast<CBindToActivity&>(*iContext.iNodeActivity);
 
   	//The service provider has been joined already and must be found here
-  	__ASSERT_DEBUG(activity.iNewServiceProvider , User::Panic(KCorePrPanic, KPanicNoServiceProvider));
-
+    __ASSERT_DEBUG(!activity.iNewServiceProvider.IsNull(), User::Panic(KCorePrPanic, KPanicNoServiceProvider));
+    RNodeInterface* newServiceProvider = iContext.Node().FindClient(activity.iNewServiceProvider);
+    __ASSERT_DEBUG(newServiceProvider, User::Panic(KCorePrPanic, KPanicNoServiceProvider));
     //We must not be in this transition if dc was not found
     __ASSERT_DEBUG(activity.CurrentDataClient(), User::Panic(KCorePrPanic, KPanicDataClient));
 
@@ -1071,7 +1089,7 @@
 
     // Send "TCommsBinderRequest" to the Current ServiceProvider
    	activity.PostRequestTo(
-   			*activity.iNewServiceProvider,
+   			*newServiceProvider,
    			TCFServiceProvider::TCommsBinderRequest(subConnOpenType).CRef()
    			);
     }
@@ -1152,24 +1170,29 @@
         return KBearerReady;
         }
 
-	if (iContext.Node().ServiceProvider()
-		&& bindToReq.iNodeId == iContext.Node().ServiceProvider()->RecipientId())
-		{
-		//received the same service provider, it's already bound to.
-		bindToActivity.iNewServiceProvider = iContext.Node().ServiceProvider();
+    RNodeInterface* sp = iContext.Node().ServiceProvider();
+    if (sp && bindToReq.iNodeId == sp->RecipientId())
+        {
+        //received the same service provider, it's already bound to.
+        bindToActivity.iNewServiceProvider = sp->RecipientId();
 		return KBearerReady;
 		}
-	bindToActivity.iNewServiceProvider = iContext.Node().FindClient(bindToReq.iNodeId);
-	if (bindToActivity.iNewServiceProvider)
+    RNodeInterface* newServiceProvider = iContext.Node().FindClient(bindToReq.iNodeId);
+	if (newServiceProvider)
 		{
-		__ASSERT_DEBUG(bindToActivity.iNewServiceProvider->Type() == TCFClientType::EServProvider, User::Panic(KCorePrPanic, KPanicIncorrectState));
+		__ASSERT_DEBUG(newServiceProvider->Type() == TCFClientType::EServProvider, User::Panic(KCorePrPanic, KPanicIncorrectState));
 		//Ok, we've received a TBindTo holding a service provider that we already know of and that is not
 		//our current service provider. We're going to assume this node tolerates multiple service providers (like MCPRs do).
 		//the current service provider will be swapped, but won't be dropped.
-		bindToActivity.iNewServiceProvider->SetFlags(TCFClientType::EActivating);
+		bindToActivity.iNewServiceProvider = bindToReq.iNodeId;
+		newServiceProvider->SetFlags(TCFClientType::EActivating);
 		bindToActivity.SetDontLeaveServiceProvider();
 		return KBearerReady;
 		}
+	else
+	    {
+        bindToActivity.iNewServiceProvider = TNodeId::NullId();
+	    }
 	//The node received a new service provider...
 	return KNoTag;
     }
@@ -1187,7 +1210,7 @@
     	return KBindToComplete;
     	}
 
-    if (!bindToActivity.iNewServiceProvider)
+    if (bindToActivity.iNewServiceProvider.IsNull())
     	{
     	//There is no service provider (new or old) below us.
     	return KBearerReady;
@@ -1209,7 +1232,8 @@
         };
     bindToActivity.iSuccessfulDataClients.Reset();
     RNodeInterface* sp = iContext.Node().ServiceProvider();
-    if (sp && sp != bindToActivity.iNewServiceProvider)
+
+    if (sp && sp->RecipientId() != bindToActivity.iNewServiceProvider)
     	{
     	if (bindToActivity.ShouldLeaveServiceProvider())
     		{
@@ -1229,14 +1253,19 @@
     	bindToActivity.SetIdle();
     	}
 
-    if (bindToActivity.iNewServiceProvider && sp != bindToActivity.iNewServiceProvider)
-    	{
-    	__ASSERT_DEBUG(bindToActivity.iNewServiceProvider->Flags() & TCFClientType::EActivating, User::Panic(KCorePrPanic, KPanicIncorrectState));
-    	bindToActivity.iNewServiceProvider->ClearFlags(TCFClientType::EActivating);
-    	bindToActivity.iNewServiceProvider->SetFlags(TCFClientType::EActive);
-    	__ASSERT_DEBUG(iContext.Node().ServiceProvider() == bindToActivity.iNewServiceProvider, User::Panic(KCorePrPanic, KPanicIncorrectState));
-    	}
-	bindToActivity.iNewServiceProvider = NULL;
+    if (!bindToActivity.iNewServiceProvider.IsNull() && (sp == NULL || sp->RecipientId() != bindToActivity.iNewServiceProvider))
+        {
+        RNodeInterface* newServiceProvider = iContext.Node().FindClient(bindToActivity.iNewServiceProvider);
+        if (newServiceProvider)
+            {
+            __ASSERT_DEBUG(newServiceProvider->Flags() & TCFClientType::EActivating, User::Panic(KCorePrPanic, KPanicIncorrectState));
+            newServiceProvider->ClearFlags(TCFClientType::EActivating);
+            newServiceProvider->SetFlags(TCFClientType::EActive);
+            // Note: iContext.Node().ServiceProvider() must be re-evaluated in the ASSERT below (i.e. don't use any previously cached value).
+            __ASSERT_DEBUG(iContext.Node().ServiceProvider() == newServiceProvider, User::Panic(KCorePrPanic, KPanicIncorrectState));
+            }
+        }
+    bindToActivity.iNewServiceProvider = TNodeId::NullId();
     }
 
 EXPORT_DEFINE_SMELEMENT(CBindToActivity::TCancel, NetStateMachine::MStateTransition, CBindToActivity::TContext)
@@ -1251,25 +1280,28 @@
         };
     bindToActivity.iSuccessfulDataClients.Reset();
 
-    if (bindToActivity.iNewServiceProvider && bindToActivity.iNewServiceProvider != iContext.Node().ServiceProvider())
-    	{
-    	__ASSERT_DEBUG(bindToActivity.iNewServiceProvider->Flags() & TCFClientType::EActivating, User::Panic(KCorePrPanic, KPanicIncorrectState));
-    	bindToActivity.iNewServiceProvider->ClearFlags(TCFClientType::EActivating);
-    	if (bindToActivity.ShouldLeaveServiceProvider())
-    		{
-	    	bindToActivity.PostRequestTo(*bindToActivity.iNewServiceProvider, TEPeer::TLeaveRequest().CRef());
-	    	bindToActivity.iNewServiceProvider->SetFlags(TCFClientType::ELeaving);
-    		}
-        else
-        	{
-        	bindToActivity.SetIdle();
-        	}
-    	}
-    else
-    	{
-    	bindToActivity.SetIdle();
-    	}
-	bindToActivity.iNewServiceProvider = NULL;
+	TBool setIdle = ETrue;
+    if (!bindToActivity.iNewServiceProvider.IsNull())
+        {
+        RNodeInterface* newServiceProvider = iContext.Node().FindClient(bindToActivity.iNewServiceProvider);
+        if (newServiceProvider && newServiceProvider != iContext.Node().ServiceProvider())
+            {
+            __ASSERT_DEBUG(newServiceProvider->Flags() & TCFClientType::EActivating, User::Panic(KCorePrPanic, KPanicIncorrectState));
+            newServiceProvider->ClearFlags(TCFClientType::EActivating);
+            if (bindToActivity.ShouldLeaveServiceProvider())
+                {
+                bindToActivity.PostRequestTo(*newServiceProvider, TEPeer::TLeaveRequest().CRef());
+                newServiceProvider->SetFlags(TCFClientType::ELeaving);
+                setIdle = EFalse;
+                }
+            }
+        }
+
+    if (setIdle)
+        {
+        bindToActivity.SetIdle();
+        }
+    bindToActivity.iNewServiceProvider = TNodeId::NullId();
     }