diff -r 000000000000 -r af10295192d8 linklayercontrol/networkinterfacemgr/src/CAgentSMBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linklayercontrol/networkinterfacemgr/src/CAgentSMBase.cpp Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,251 @@ +// Copyright (c) 2000-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: +// Source for Base classes in States and State Machines +// +// + +/** + @file +*/ + +#include "CAgentSMBase.h" +#include "AgentPanic.h" +#include + +// +// Agent State Base +// + +EXPORT_C CAgentStateBase::CAgentStateBase(MAgentStateMachineEnv& aSMObserver) + : CActive(EPriorityStandard),iSMObserver(&aSMObserver) +/** +Constructor +*/ + { + CActiveScheduler::Add(this); + } + +EXPORT_C CAgentStateBase::~CAgentStateBase() +/** +Destructor +*/ + { + Cancel(); + } + +EXPORT_C void CAgentStateBase::JumpToRunl(TInt aError) +/** + * Jump directly to the RunL of the object + * @note Typically used in the case of errors, or when asynchronous requests do not need to be issued by this state + */ + { + SetActive(); + TRequestStatus* statusPtr=&iStatus; + User::RequestComplete(statusPtr,aError); + } + +// +// Agent State Machine Base +// + +EXPORT_C CAgentSMBase::CAgentSMBase(MAgentNotify& aControllerObserver, CDialogProcessor* aDlgPrc, CCommsDbAccess& aDbAccess) + : CActive(EPriorityStandard),iControllerObserver(&aControllerObserver),iDlgPrc(aDlgPrc), + iDb(&aDbAccess),iContinueConnection(ETrue),iSMPhase(EConnecting) +/** +Constructor + +@param aControllerObserver +@param aDlgPrc +@param aDbAccess +*/ + { + CActiveScheduler::Add(this); + } + +EXPORT_C CAgentSMBase::~CAgentSMBase() +/** +Destructor +*/ + { + Cancel(); + delete iState; + } + +void CAgentSMBase::ProcessState() + { + CAgentStateBase* nextiState=NULL; + TRAPD(ret,nextiState=iState->NextStateL(iContinueConnection)); + iContinueConnection=ETrue; + if(ret==KErrNone) // Next state instantiated succesfully + { + __ASSERT_DEBUG(nextiState, StateMachineAgentPanic(Agent::ENullStateOnProcessState)); + delete iState; + iState=nextiState; + iStatus=KRequestPending; + iState->StartState(); + if (!IsActive()) + SetActive(); + } + else + CompleteState(ret); + } + +void CAgentSMBase::StartConnect() + { + iStatus = KRequestPending; + iState->StartState(); + SetActive(); + } + +void CAgentSMBase::CancelConnect() + { + iContinueConnection=EFalse; + Cancel(); + } + +EXPORT_C void CAgentSMBase::ConnectionContinuation(TSMContinueConnectType aConnectionAction) + { + switch(aConnectionAction) + { + case ECallBack : + iCallBack=ETrue; + iSMPhase=EConnecting; + break; + case EReconnect : + iIsReconnect=ETrue; + iCallBack=EFalse; + iSMPhase=EConnecting; + break; + case EDisconnect : + iContinueConnection=EFalse; + iSMPhase=EDisconnecting; + break; + default : + AgentPanic(Agent::EIllegalActionType); + break; + } + ProcessState(); + } + +EXPORT_C void CAgentSMBase::PreventConnectionRetries() + { + iControllerObserver->PreventConnectionRetries(); + } + +EXPORT_C void CAgentSMBase::ServiceStarted() + { + if(!iIsReconnect&&!iCallBack) + { + iControllerObserver->ServiceStarted(); + } + } + +void CAgentSMBase::ConnectCompleteReset() + { + iSMPhase=EConnected; + Cancel(); + iIsReconnect=EFalse; + } + +EXPORT_C void CAgentSMBase::ConnectionComplete(TInt aProgress,TInt aError) + { + ConnectCompleteReset(); + iControllerObserver->ConnectionComplete(aProgress, aError); + } + +EXPORT_C void CAgentSMBase::ConnectionComplete(TInt aError) + { + ConnectCompleteReset(); + iControllerObserver->ConnectionComplete(aError); + } + +EXPORT_C void CAgentSMBase::DisconnectComplete() + { + Cancel(); + iSMPhase=EDisconnected; + iCallBack=EFalse; + iControllerObserver->DisconnectComplete(); + } + +EXPORT_C void CAgentSMBase::UpdateProgress(TInt aProgress,TInt aError) + { + iControllerObserver->UpdateProgress(aProgress, aError); + } + +EXPORT_C TInt CAgentSMBase::Notification(TAgentToNifEventType aEvent, TAny* aInfo) + { + return iControllerObserver->Notification(aEvent, aInfo); + } + +EXPORT_C void CAgentSMBase::GetLastError(TInt& aError) +/** +Gets the latest error code returned during a connection operation. + +@param aError +@return KErrNone, or another error code that might have been +returned by a connection operation. +*/ + { + aError=KErrNone; + } + +EXPORT_C TInt CAgentSMBase::IncomingConnectionReceived() + { + return iControllerObserver->IncomingConnectionReceived(); + } + +EXPORT_C void CAgentSMBase::RunL() + { + if(iStatus==KErrNone) + { + ProcessState(); + } + else if(iSMPhase==EConnecting) + { + ConnectionComplete(iStatus.Int()); + } + else if(iSMPhase==EDisconnecting) + { + DisconnectComplete(); + } + } + +EXPORT_C void CAgentSMBase::DoCancel() + { + iState->Cancel(); + if(iStatus==KRequestPending) + { + CompleteState(KErrCancel); + } + } + +EXPORT_C CDialogProcessor* CAgentSMBase::DlgPrc() + { + return iDlgPrc; + } + +EXPORT_C CCommsDbAccess* CAgentSMBase::Db() + { + return iDb; + } + +EXPORT_C void CAgentSMBase::CompleteState(TInt aError) + { + if (!IsActive()) + SetActive(); + TRequestStatus* status=&iStatus; + User::RequestComplete(status,aError); + } + +