networkcontrol/commsuserpromptmgr/state/src/netupsstatemachine.cpp
changeset 0 af10295192d8
child 37 052078dda061
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkcontrol/commsuserpromptmgr/state/src/netupsstatemachine.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,283 @@
+// Copyright (c) 2007-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:
+// This file provides the implementation of the NetUps Statemachine.
+// @internalAll
+// @prototype
+// 
+//
+
+#include "e32def.h"			//defines __ASSERT_DEBUG
+#include "e32cmn.h"
+
+#include "netupsassert.h"
+
+#include "netupsstatemachine.h"
+#include "netupsstate.h"
+#include "netupsstatedef.h"
+
+#include "netupsserviceid.h"
+
+#include "netupsimpl.h"
+
+#include <comms-infras/commsdebugutility.h> 		// defines the comms debug logging utility
+
+namespace NetUps
+{
+__FLOG_STMT(_LIT8(KNetUpsSubsys, 	"esock");)   
+__FLOG_STMT(_LIT8(KNetUpsComponent, "NetUps");) /*esockloader*/
+
+CUpsStateMachine* CUpsStateMachine::NewL(CNetUpsImpl& aNetUpsImpl, TInt32 aServiceId)
+	{
+	__FLOG_STATIC1(KNetUpsSubsys, KNetUpsComponent, _L("CUpsStateMachine::NewL(), aServiceId = %d"), aServiceId);		
+
+	CUpsStateMachine* self = NULL;
+	if (aServiceId != EIpServiceId)
+		{
+		__FLOG_STATIC0(KNetUpsSubsys, KNetUpsComponent, _L("CUpsStateMachine::NewL() Service id not supported"));
+		User::Leave(KErrNotSupported);
+		}
+	else
+		{
+		self = new (ELeave) CUpsStateMachine(aNetUpsImpl, aServiceId);
+
+		CleanupStack::PushL(self);
+		self->ConstructL();
+		CleanupStack::Pop(self);
+		}
+		
+	return self;
+	}
+
+CUpsStateMachine::CUpsStateMachine(CNetUpsImpl& aNetUpsImpl, TInt32 aServiceId) : iNetUpsImpl(aNetUpsImpl), iServiceId(aServiceId) 
+	{
+	__FLOG_2(_L("CUpsStateMachine %08x:\t CUpsStateMachine()"), this, aServiceId);			
+	}
+
+void CUpsStateMachine::ConstructL()
+	{
+	__FLOG_2(_L("CUpsStateMachine %08x:\t ConstructL()"), this, iNetUpsImpl.LifeTimeMode());		
+
+	// Note the order in which the states are instantiated must match the 
+	// order in which they are defined in the enumeration TNetUpsState - or a panic will occur.
+
+	iState.Append(CState::NewL(ENull, *this));	
+	switch(iNetUpsImpl.LifeTimeMode())
+		{
+		case CNetUpsImpl::EProcessLifeTimeMode:
+			{
+			iState.Append(CState::NewL(EProcLife_NonSession, *this));			
+			iState.Append(CState::NewL(EProcLife_Transit_SessionYes, *this)); // a transient state is entered when the UPS Server responds with either SessionYes or SessionNo and there are 1 or more UPS requests outstanding to other subsessions which are associated with the same process.			
+			iState.Append(CState::NewL(EProcLife_SessionYes, *this));
+			iState.Append(CState::NewL(EProcLife_Transit_SessionNo, *this));
+			iState.Append(CState::NewL(EProcLife_SessionNo, *this));
+			break;
+			}
+		case CNetUpsImpl::ENetworkLifeTimeMode:
+			{
+			iState.Append(CState::NewL(ENetLife_NonSession, *this));			
+			iState.Append(CState::NewL(ENetLife_SessionNo_Transit_WithoutConnections, *this));			
+			iState.Append(CState::NewL(ENetLife_SessionNo_WithOutConnections, *this));
+			iState.Append(CState::NewL(ENetLife_SessionNo_Transit_WithConnections, *this));
+			iState.Append(CState::NewL(ENetLife_SessionNo_WithConnections, *this));
+			iState.Append(CState::NewL(ENetLife_Transit_SessionYes, *this));
+			iState.Append(CState::NewL(ENetLife_SessionYes, *this));
+			break;				
+			}
+		default:
+			{
+			User::Leave(KErrNotSupported);			
+			}
+		}
+
+	__FLOG_OPEN(KNetUpsSubsys, KNetUpsComponent);
+	__FLOG_1(_L("CUpsStateMachine %08x:\t ConstructL()"), this);				
+	}
+
+TUint32 CUpsStateMachine::GetIndex(TNetUpsState aNetUpsState)
+	{		
+	__FLOG_2(_L("CUpsStateMachine %08x:\t GetIndex() aNetUpsState = %d"), this, aNetUpsState );		
+
+	TUint32 index = 0;
+	if (aNetUpsState != ENull)
+		{
+		switch(iNetUpsImpl.LifeTimeMode())
+			{
+			case CNetUpsImpl::EProcessLifeTimeMode:
+				index = aNetUpsState  - EProcLife_NonSession + 1;
+				//__FLOG_3(_L("CUpsStateMachine %08x:\t GetIndex() aNetUpsState = %d, index = %d, mode = iNetUpsImpl.LifeTimeMode()"), this, index, iNetUpsImpl.LifeTimeMode() );		
+				break;
+			case CNetUpsImpl::ENetworkLifeTimeMode:
+				index = aNetUpsState -  ENetLife_NonSession + 1;
+				//__FLOG_3(_L("CUpsStateMachine %08x:\t GetIndex() aNetUpsState = %d, index = %d, mode = iNetUpsImpl.LifeTimeMode()"), this, index, iNetUpsImpl.LifeTimeMode() );		
+
+				break;
+			default:				
+				__FLOG_2(_L("CUpsStateMachine %08x:\t GetIndex() aNetUpsState = %d, mode = iNetUpsImpl.LifeTimeMode()"), this, iNetUpsImpl.LifeTimeMode() );		
+				User::Panic(KNetUpsPanic, KPanicSessionTypeOutOfRange);
+				break;
+			}
+		}
+	return index;	
+	}
+
+
+CUpsStateMachine::~CUpsStateMachine()
+	{
+	__FLOG_1(_L("CUpsStateMachine %08x:\t ~CUpsStateMachine()"), this);		
+
+	for (TInt i = iState.Count() - 1; i >= 0; i--)
+			{
+			delete iState.operator[](i);
+			__FLOG_2(_L("CUpsStateMachine %08x:\t ~CUpsStateMachine(), iState[i] = %08x"), this, iState[i]);		
+			iState.Remove(i);
+			}
+	iState.Reset();
+	iState.Close();		
+
+	__FLOG_CLOSE;	
+	}
+
+TUint32 CUpsStateMachine::GetIndex(CProcessEntry& aProcessEntry)
+{
+	TNetUpsState netUpsState = CUpsStateMachine::GetState(aProcessEntry);
+	TInt32 index = static_cast<TInt32>(GetIndex(netUpsState));
+
+	__FLOG_3(_L("CUpsStateMachine %08x:\t GetIndex(), index = %d, netUpsState = %d"),
+			 this, index, netUpsState); 
+		
+	__ASSERT_DEBUG((index < iState.Count()), User::Panic(KNetUpsPanic, KPanicStateMachineIndexOutOfRange));
+	__ASSERT_DEBUG((iState.operator[](index)->State() == netUpsState), User::Panic(KNetUpsPanic, KPanicInvalidStateMachineIndex));
+
+	return index;
+}
+
+void CUpsStateMachine::ProcessPolicyCheckRequestL(TThreadKey& aThreadKey, const TPolicyCheckRequestData& aPolicyCheckRequestData, TRequestId aRequestId)
+	{
+	__FLOG_8(_L("CUpsStateMachine %08x:\t ProcessPolicyCheckRequestL(), processId = %d, threadId = %d, serviceId  = %d, platSecCheckResult  = %d, commsId  = %d, originator  = %08x, request id = %d"),
+				 this, aPolicyCheckRequestData.iProcessId.Id(),
+				 aPolicyCheckRequestData.iThreadId.Id(),		aPolicyCheckRequestData.iServiceId,
+				 aPolicyCheckRequestData.iPlatSecCheckResult, 	&aPolicyCheckRequestData.iCommsId.Node(),
+				 &(aPolicyCheckRequestData.iPolicyCheckRequestOriginator), aRequestId); 
+
+	TUint32 index = GetIndex(aThreadKey.iProcessEntry);
+	(iState.operator[](index))->ProcessPolicyCheckRequestL(aThreadKey, aPolicyCheckRequestData, aRequestId);
+	}
+
+void CUpsStateMachine::ProcessPolicyCheckRequestL(TProcessKey& aProcessKey, const TPolicyCheckRequestData& aPolicyCheckRequestData, TRequestId aRequestId)
+	{
+	__FLOG_8(_L("CUpsStateMachine %08x:\t ProcessPolicyCheckRequestL(), processId = %d, threadId = %d, serviceId  = %d, platSecCheckResult  = %d, commsId  = %08x, originator  = %08x, request id = %d"),
+				 this, aPolicyCheckRequestData.iProcessId.Id(),
+				 aPolicyCheckRequestData.iThreadId.Id(),		aPolicyCheckRequestData.iServiceId,
+				 aPolicyCheckRequestData.iPlatSecCheckResult, 	&aPolicyCheckRequestData.iCommsId.Node(),
+				 &(aPolicyCheckRequestData.iPolicyCheckRequestOriginator), aRequestId); 
+
+	// Suspect that this method is not required, when threadEntry is not known, we are in session lifetime.
+	(void) aProcessKey;
+	(void) aPolicyCheckRequestData;
+	(void) aRequestId;
+	User::Panic(KNetUpsPanic, KPanicMethodNotSupported);
+	}
+
+void CUpsStateMachine::IncrementConnectionCountL(TCommsIdKey& aCommsIdKey)
+	{
+	__FLOG_4(_L("CUpsStateMachine %08x:\t IncrementConnectionCountL(), processId = %d, threadId = %d, commsId = %d"),
+				 this, aCommsIdKey.iProcessEntry.ProcessId().Id(),
+				 aCommsIdKey.iThreadEntry.ThreadId().Id(),
+				 &aCommsIdKey.iCommsId.Node() ); 
+
+	(void) aCommsIdKey;
+	
+	// Suspect that this method is not required, connection counts are incremented without the request going via the state machine.
+
+	/*
+	TUint32 index = GetIndex(aCommsIdKey.iProcessEntry);
+	(iState.operator[](index))->IncrementConnectionCountL(aCommsIdKey);
+	*/
+	User::Panic(KNetUpsPanic, KPanicMethodNotSupported);
+
+	}
+
+void CUpsStateMachine::DecrementConnectionCountL(TCommsIdKey& aCommsIdKey)
+	{
+	__FLOG_4(_L("CUpsStateMachine %08x:\t DecrementConnectionCountL(), processId = %d, threadId = %d, commsId = %d"),
+				 this, aCommsIdKey.iProcessEntry.ProcessId().Id(),
+				 aCommsIdKey.iThreadEntry.ThreadId().Id(),
+				 &aCommsIdKey.iCommsId.Node() ); 
+
+	TUint32 index = GetIndex(aCommsIdKey.iProcessEntry);
+	(iState.operator[](index))->DecrementConnectionCountL(aCommsIdKey);
+	}
+		
+void CUpsStateMachine::HandleUPSRequestCompletionL(TCommsIdKey& aCommsIdKey, MPolicyCheckRequestOriginator& aPolicyCheckRequestOriginator , TNetUpsDecision aNetUpsDecision)
+	{
+	__FLOG_5(_L("CUpsStateMachine %08x:\t HandleUPSRequestCompletionL(), processId = %d, threadId = %d, commsId = %d, netUpsDecision = %d"),
+				 this, aCommsIdKey.iProcessEntry.ProcessId().Id(),
+				 aCommsIdKey.iThreadEntry.ThreadId().Id(),
+				 &aCommsIdKey.iCommsId.Node(),
+				 aNetUpsDecision ); 
+
+	TUint32 index = GetIndex(aCommsIdKey.iProcessEntry);
+	(iState.operator[](index))->HandleUPSRequestCompletionL(aCommsIdKey, aPolicyCheckRequestOriginator, aNetUpsDecision);
+	}
+
+void CUpsStateMachine::HandleUPSErrorOnCompletionL(TCommsIdKey& aCommsIdKey, MPolicyCheckRequestOriginator& aPolicyCheckRequestOriginator, TInt aError)
+	{
+	__FLOG_5(_L("CUpsStateMachine %08x:\t HandleUPSErrorOnCompletionL(), processId = %d, threadId = %d, commsId = %d, aError = %d"),
+				 this, aCommsIdKey.iProcessEntry.ProcessId().Id(),
+				 aCommsIdKey.iThreadEntry.ThreadId().Id(),
+				 &aCommsIdKey.iCommsId.Node(),
+				 aError ); 
+
+	TUint32 index = GetIndex(aCommsIdKey.iProcessEntry);
+	(iState.operator[](index))->HandleUPSErrorOnCompletionL(aCommsIdKey, aPolicyCheckRequestOriginator, aError);
+	}
+
+void CUpsStateMachine::HandleProcessTermination(TProcessKey& aProcessKey)
+	{
+	__FLOG_2(_L("CUpsStateMachine %08x:\t HandleProcessTermination(), processId %d"),
+				 this, aProcessKey.iProcessEntry.ProcessId().Id()); 
+
+	TUint32 index = GetIndex(aProcessKey.iProcessEntry);
+	(iState.operator[](index))->HandleProcessTermination(aProcessKey);
+	}
+
+void CUpsStateMachine::HandleThreadTermination(TThreadKey& aThreadKey)
+	{
+	__FLOG_3(_L("CUpsStateMachine\t HandleThreadTermination() processId = %d, threadId = %d"),
+				 this, aThreadKey.iProcessEntry.ProcessId().Id(), aThreadKey.iThreadEntry.ThreadId().Id() ); 
+
+	TUint32 index = GetIndex(aThreadKey.iProcessEntry);
+	(iState.operator[](index))->HandleThreadTermination(aThreadKey);
+	}
+		
+TInt32	CUpsStateMachine::ServiceId() 
+	{
+	return iServiceId;
+	}
+
+TNetUpsState CUpsStateMachine::GetState(CProcessEntry& aProcessEntry)
+	{
+	__FLOG_STATIC2(KNetUpsSubsys, KNetUpsComponent, _L("CUpsStateMachine\t GetState() processId = %d, netUpsState = %d"),
+				 	aProcessEntry.ProcessId().Id(), aProcessEntry.NetUpsState()); 
+
+	return aProcessEntry.NetUpsState();
+	}
+
+CNetUpsImpl& CUpsStateMachine::NetUpsImpl()
+	{
+	return iNetUpsImpl;	
+	}
+
+} // end of namespace
+