--- 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();
}