diff -r 000000000000 -r af10295192d8 networkcontrol/commsuserpromptmgr/state/src/netupsstatemachine.cpp --- /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 // 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(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 +