--- /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 <connectprog.h>
+
+//
+// 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);
+ }
+
+