linklayercontrol/networkinterfacemgr/agentprcore/src/agentscprstates.cpp
changeset 0 af10295192d8
child 7 db85996de7c4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayercontrol/networkinterfacemgr/agentprcore/src/agentscprstates.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,269 @@
+// 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:
+//
+
+/**
+ @file
+ @internalTechnology
+ @prototype
+*/
+
+
+#include <comms-infras/ss_log.h>
+#include <comms-infras/linkmessages.h>
+#include <comms-infras/nifif.h>
+#include <elements/nm_messages_base.h>
+#include <comms-infras/ss_nodemessages_dataclient.h>
+
+#include "agentscpr.h"
+#include "agentscprstates.h"
+#include "CAgentAdapter.h"
+#include "agentmessages.h"
+
+
+#ifdef _DEBUG
+// Panic category for "absolutely impossible!" vanilla ASSERT()-type panics from this module
+// (if it could happen through user error then you should give it an explicit, documented, category + code)
+_LIT(KSpecAssert_NifManAgtPrCSSta, "NifManAgtPrCSSta");
+#endif
+
+
+using namespace Messages;
+using namespace ESock;
+
+
+#ifdef __CFLOG_ACTIVE
+#define KAgentSCprTag KESockSubConnectionTag
+_LIT8(KAgentSCprSubTag, "agentscprstates");
+#endif
+
+
+namespace AgentSCprStates
+{
+
+// ---------------- Start Connection Activity Overrides ----------------
+EXPORT_DEFINE_SMELEMENT(TStartAgent, NetStateMachine::MStateTransition, AgentSCprStates::TContext)
+EXPORT_C void TStartAgent::DoL()
+   {
+   __CFLOG_VAR((KAgentSCprTag, KAgentSCprSubTag, _L8("TStartAgent::DoL()")));
+
+   iContext.Node().SetActivityIdForAdapter(iContext.iNodeActivity->ActivityId());
+   iContext.Node().StartAgentL();
+   }
+
+
+// ---------------- Notifications From Flow Activity ----------------
+EXPORT_DEFINE_SMELEMENT(TAwaitingNotificationFromFlow, NetStateMachine::MState, AgentSCprStates::TContext)
+EXPORT_C TBool TAwaitingNotificationFromFlow::Accept()
+    {
+    return iContext.iMessage.IsMessage<TLinkMessage::TFlowToAgentNotification>();
+    }
+
+EXPORT_DEFINE_SMELEMENT(TNotifyAgent, NetStateMachine::MStateTransition, AgentSCprStates::TContext)
+EXPORT_C void TNotifyAgent::DoL()
+    {
+    TLinkMessage::TAgentToFlowNotification& msg = message_cast<TLinkMessage::TAgentToFlowNotification>(iContext.iMessage);
+    iContext.Node().NotificationFromFlow(static_cast<TFlowToAgentEventType>(msg.iValue));
+    }
+
+
+// ---------------- Unsolicited Flow Down Activity ----------------
+EXPORT_DEFINE_SMELEMENT(TProcessDataClientGoneDown, NetStateMachine::MStateTransition, AgentSCprStates::TContext)
+EXPORT_C void TProcessDataClientGoneDown::DoL()
+    {
+    TCFControlProvider::TDataClientGoneDown& msg = message_cast<TCFControlProvider::TDataClientGoneDown>(iContext.iMessage);
+    TInt error = msg.iValue1;
+    MNifIfNotify::TAction action = static_cast<MNifIfNotify::TAction>(msg.iValue2);
+
+    RNodeInterface* dataClient = iContext.Node().FindClient(iContext.iSender);
+    dataClient->ClearFlags(TCFClientType::EStarted);
+
+    iContext.Node().NotificationToAgent (EFlowToAgentEventTypeLinkLayerDown, &error);
+
+    if (action == MNifIfNotify::EReconnect)
+        {
+        CAgentProvisionInfo::TAgentReconnectOption option = iContext.Node().AgentProvisionInfo()->ReconnectOption();
+    	TUint32 attempts = iContext.Node().AgentProvisionInfo()->ReconnectAttempts();
+
+		if (option == CAgentProvisionInfo::EDoNotAttemptReconnect
+			|| attempts == 0)
+			{
+            iContext.Node().AgentProvisionInfo()->AgentAdapter()->DisconnectAgent(error);
+			}
+		else
+			{
+			const_cast<CAgentProvisionInfo*>(iContext.Node().AgentProvisionInfo())->SetReconnectAttempts(attempts - 1);
+
+	        switch (option)
+	            {
+	            case CAgentProvisionInfo::EAttemptReconnect:
+            		iContext.Node().ConnectAgent(EAgentReconnect);
+	                break;
+
+	            case CAgentProvisionInfo::EPromptForReconnect:
+	                // This causes the agent Reconnect() to begin
+	                // If the CAgentBase::Reconnect() hasn't been overridden the
+	                // user will be prompted
+	                iContext.Node().AgentProvisionInfo()->AgentAdapter()->PromptForReconnect();
+	                break;
+
+	            default:
+	                // No other options are available
+	                __ASSERT_DEBUG(EFalse, User::Panic(KSpecAssert_NifManAgtPrCSSta, 1));
+	                break;
+	            }
+			}
+        }
+    else
+        {
+        iContext.Node().AgentProvisionInfo()->AgentAdapter()->DisconnectAgent(error);
+        }
+    }
+
+
+// ---------------- Authentication Activity ----------------
+
+EXPORT_DEFINE_SMELEMENT(TAwaitingAuthenticate, NetStateMachine::MState, CoreStates::TContext)
+EXPORT_C TBool TAwaitingAuthenticate::Accept()
+	{
+	return iContext.iMessage.IsMessage<TLinkMessage::TAuthenticate>();
+	}
+
+EXPORT_DEFINE_SMELEMENT(TAwaitingAuthenticateComplete, NetStateMachine::MState, AgentSCprStates::TContext)
+EXPORT_C TBool TAwaitingAuthenticateComplete::Accept()
+	{
+	return iContext.iMessage.IsMessage<TLinkMessage::TAuthenticateResponse>();
+	}
+
+EXPORT_C void TAwaitingAuthenticateComplete::Cancel()
+    {
+    __CFLOG_VAR((KAgentSCprTag, KAgentSCprSubTag, _L8("AAwaitingAuthenticateComplete::Cancel()")));
+
+    CAgentSubConnectionProvider& provider = iContext.Node();
+    provider.SetActivityIdForAdapter(iContext.iNodeActivity->ActivityId());
+    __ASSERT_DEBUG(provider.AgentProvisionInfo()->AgentAdapter(), User::Panic(KSpecAssert_NifManAgtPrCSSta, 2));
+
+    if (provider.iAuthenticateInProgress)
+        {
+        provider.iAuthenticateInProgress = EFalse;
+        provider.AgentProvisionInfo()->AgentAdapter()->CancelAuthenticate();
+        }
+    }
+
+EXPORT_DEFINE_SMELEMENT(TSendAuthenticate, NetStateMachine::MStateTransition, AgentSCprStates::TContext)
+EXPORT_C void TSendAuthenticate::DoL()
+    {
+    __CFLOG_VAR((KAgentSCprTag, KAgentSCprSubTag, _L8("ASendAuthenticate::DoL()")));
+
+    CAgentSubConnectionProvider& provider = iContext.Node();
+    __ASSERT_DEBUG(provider.AgentProvisionInfo()->AgentAdapter(), User::Panic(KSpecAssert_NifManAgtPrCSSta, 3));
+
+    provider.iAuthenticateInProgress = ETrue;
+    provider.AgentProvisionInfo()->AgentAdapter()->Authenticate(provider.iUsername, provider.iPassword);
+    provider.SetActivityIdForAdapter(iContext.iNodeActivity->ActivityId());
+    iContext.iNodeActivity->SetPostedTo(provider.Id());
+    }
+
+EXPORT_DEFINE_SMELEMENT(TSendAuthenticateComplete, NetStateMachine::MStateTransition, CoreStates::TContext)
+EXPORT_C void TSendAuthenticateComplete::DoL()
+    {
+    __CFLOG_VAR((KAgentSCprTag, KAgentSCprSubTag, _L8("ASendAuthenticateComplete::DoL()")));
+    TLinkMessage::TAuthenticateResponse msg;
+    if (iContext.iNodeActivity)
+        {
+
+        iContext.iNodeActivity->PostToOriginators(msg);
+        }
+    else
+        {
+        iContext.PostToSender(msg);
+        }
+    }
+
+
+// ---------------- Stop Connection Activity Overrides ----------------
+
+EXPORT_DEFINE_SMELEMENT(TNoTagOrProviderStopped, NetStateMachine::MStateFork, AgentSCprStates::TContext)
+EXPORT_C TInt TNoTagOrProviderStopped::TransitionTag()
+	{
+	if (iContext.Node().AgentProvisionInfo()->AgentAdapter() == NULL ||
+        iContext.Node().AgentProvisionInfo()->AgentAdapter()->AgentState() == CAgentAdapter::EDisconnected)
+        {
+        return CoreNetStates::KProviderStopped;
+        }
+    return MeshMachine::KNoTag;
+    }
+
+EXPORT_DEFINE_SMELEMENT(TNoTagOrProviderStarted, NetStateMachine::MStateFork, AgentSCprStates::TContext)
+EXPORT_C TInt TNoTagOrProviderStarted::TransitionTag()
+	{
+	RNodeInterface* flow = iContext.Node().GetFirstClient<TDefaultClientMatchPolicy>(TClientType(TCFClientType::EData), TClientType(TCFClientType::EStarted));
+	return flow ? CoreNetStates::KProviderStarted : MeshMachine::KNoTag;
+    }
+
+EXPORT_DEFINE_SMELEMENT(TStopAgent, NetStateMachine::MStateTransition, AgentSCprStates::TContext)
+EXPORT_C void TStopAgent::DoL()
+    {
+    __CFLOG_VAR((KAgentSCprTag, KAgentSCprSubTag, _L8("AStopAgent::DoL()")));
+
+    TInt reason = KErrCancel;
+    if (iContext.iMessage.IsMessage<TCFDataClient::TStopped>())
+        {
+        // This supports the logic from the legacy CNifAgentRef::LinkLayerDown()
+        // During the processing of LinkLayerDown the Agent would be notified.
+        TCFDataClient::TStopped& msg = message_cast<TCFDataClient::TStopped>(iContext.iMessage);
+        iContext.Node().AgentProvisionInfo()->AgentAdapter()->NotificationToAgent (EFlowToAgentEventTypeLinkLayerDown, &msg.iValue);
+        reason = msg.iValue;
+        }
+    else if (iContext.iMessage.IsMessage<TCFDataClient::TStop>())
+        {
+        // Receiving TCFDataClient::TStop when we don't have a flow will get us here
+        // Not sure that should ever happen though
+        TCFDataClient::TStop& msg = message_cast<TCFDataClient::TStop>(iContext.iMessage);
+        reason = msg.iValue;
+        }
+    else
+        {
+        // TODO: SCpr Panic - unexpected message
+        }
+
+    iContext.Node().SetActivityIdForAdapter(iContext.iNodeActivity->ActivityId());
+    iContext.Node().StopAgent(reason);
+    iContext.iNodeActivity->SetPostedTo(iContext.NodeId());
+    }
+
+EXPORT_DEFINE_SMELEMENT(TAwaitingAgentDown, NetStateMachine::MState, AgentSCprStates::TContext)
+EXPORT_C TBool TAwaitingAgentDown::Accept()
+	{
+	return iContext.iMessage.IsMessage<TCFServiceProvider::TStopped>();
+	}
+
+EXPORT_DEFINE_SMELEMENT(TSendDataClientGoneDown, NetStateMachine::MStateTransition, AgentSCprStates::TContext)
+EXPORT_C void TSendDataClientGoneDown::DoL()
+	{
+	RNodeInterface *cp = iContext.Node().ControlProvider();
+	cp->PostMessage(TNodeCtxId(iContext.ActivityId(), iContext.NodeId()),
+		TCFControlProvider::TDataClientGoneDown(iContext.Node().iStoppingReason).CRef());
+	}
+
+EXPORT_DEFINE_SMELEMENT(TSendError, NetStateMachine::MStateTransition, AgentSCprStates::TContext)
+EXPORT_C void TSendError::DoL()
+	{
+	RNodeInterface *cp = iContext.Node().ControlProvider();
+	cp->PostMessage(TNodeCtxId(iContext.ActivityId(), iContext.NodeId()),
+		TEBase::TError(TCFDataClient::TStart::Id(), iContext.Node().iStoppingReason).CRef());
+	}
+
+} // namespace AgentSCprStates
+