commsfwsupport/commselements/StateMachine/include/StateMachine.h
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwsupport/commselements/StateMachine/include/StateMachine.h	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,258 @@
+// Copyright (c) 2003-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:
+// Offers a base class for an asynchronous state machine
+// THIS API IS INTERNAL TO NETWORKING AND IS SUBJECT TO CHANGE AND NOT FOR EXTERNAL USE
+// 
+//
+
+/**
+ @file 
+ @internalTechnology
+*/
+
+#include <e32base.h>
+
+#ifndef _STATEMACHINE_H_
+#define _STATEMACHINE_H_
+
+class CAsynchEvent;
+
+class CStateMachine;
+/**
+ The statemachine notifier interface.
+ 
+ If the notifier is registered with a CStateMachine instance 
+ it receives state machine events
+ @see CStateMachine
+ @internalTechnology
+**/
+class MStateMachineNotify
+   {
+   public:
+      virtual ~MStateMachineNotify() {};
+
+      /** 
+       * Called by RunL when the state machine completed its task.
+       *
+       * @param aStateMachine the instance that has raised the event
+       * @return if the value is ETrue then aStateMachine deletes itself 
+       */
+      virtual TBool OnCompletion( CStateMachine* aStateMachine ) = 0;
+   };
+
+/**
+ The base class for asynchronous state machine with the next state represented 
+ by CAsynchEvent.
+ 
+ The class is not thread safe
+ @see CAsynchEvent
+ @internalTechnology
+**/
+class CStateMachine : public CActive
+   {
+   public:
+      IMPORT_C ~CStateMachine();
+
+      TInt LastError() const;
+      void SetLastError( TInt aLastError );
+      void SetClientStatus( TRequestStatus* aClientStatus );
+      TRequestStatus* ClientStatus() const;
+      void SetActiveEvent( CAsynchEvent* aEvent );
+      void SetErrorEvent( CAsynchEvent* aEvent );
+      void SetSuspendRequest( TBool aSuspendRequest );
+      TBool SuspendRequest() const;
+
+      void UpdateHistory( TInt aUpdate );
+      TInt History() const;
+
+      void RegisterNotify( MStateMachineNotify* aStateMachineNotify );
+      void DeRegisterNotify( MStateMachineNotify* aStateMachineNotify );
+   
+      IMPORT_C void Start( TRequestStatus* aClientStatus, CAsynchEvent* aErrorEvent, MStateMachineNotify* aStateMachineNotify
+         /*the object is NOT taking ownership of the params*/ );
+      //CActive::Cancel method should not be used
+      IMPORT_C void Cancel( TInt aLastError );
+
+      IMPORT_C HBufC8* ReAllocL( TInt aNewLength );
+      HBufC8* Fragment() const;
+
+   protected:
+      IMPORT_C CStateMachine();
+
+	   IMPORT_C virtual void DoCancel();
+	   IMPORT_C virtual void RunL();
+	   IMPORT_C virtual TInt RunError(TInt aError);
+
+      IMPORT_C void OnError();
+      IMPORT_C virtual void OnCompletion();
+
+   protected:
+      CAsynchEvent* iActiveEvent; //referenced not owned
+      CAsynchEvent* iErrorEvent; //referenced not owned
+      TInt iHistory;
+      TInt iLastError;
+
+      TRequestStatus* iClientStatus; //optional
+      HBufC8* iFragment; //shared data fragment buffer owned by this class
+
+      MStateMachineNotify* iStateMachineNotify; //one at the time so far
+      TBool iSuspendRequest : 1; //if ETrue causes the state machine to stop after completion of
+      //ongoing asynch event (no client request will be completed but MStateMachineNotify::OnCompletion
+      //will be called if installed)
+   };
+
+inline void CStateMachine::SetActiveEvent( CAsynchEvent* aEvent )
+/** 
+ * Sets the active event (the next state of the instance).
+ 
+ * An ownership is not transfered
+ *
+ * @param aEvent a pointer to the active event
+ */
+   {
+   iActiveEvent = aEvent;
+   }
+
+inline void CStateMachine::SetErrorEvent( CAsynchEvent* aEvent )
+/** 
+ * Sets the error event (the one called if RunL leaves or completes with an error).
+ 
+ * An ownership is not transfered
+ *
+ * @param aEvent a pointer to the error event
+ */
+   {
+   iErrorEvent = aEvent;
+   }
+
+inline TBool CStateMachine::SuspendRequest() const
+/** 
+ * Query for suspend request
+ *
+ * @return iSuspendRequest
+ */
+   {
+   return iSuspendRequest;
+   }
+
+inline void CStateMachine::SetSuspendRequest( TBool aSuspendRequest )
+/** 
+ * Sets the suspend request
+ 
+ * If ETrue than it will stop the state machine to stop before 
+ * processing the iActiveEvent. Notifier is notified but client request is not completed
+ *
+ * @return iSuspendRequest
+ */
+   {
+   iSuspendRequest = aSuspendRequest;
+   }
+
+inline void CStateMachine::DeRegisterNotify( MStateMachineNotify* /*aStateMachineNotify*/ )
+/** 
+ * De-registers the notifier
+ *
+ * @param aStateMachineNotify not used
+ */
+   {
+   iStateMachineNotify = NULL; //so far it's simple
+   }
+
+inline void CStateMachine::RegisterNotify( MStateMachineNotify* aStateMachineNotify )
+/** 
+ * Registers the notifier
+ *
+ * @param aStateMachineNotify a notifier to register. An ownership is not transfered
+ */
+   {
+   iStateMachineNotify = aStateMachineNotify;
+   }
+
+inline void CStateMachine::SetClientStatus( TRequestStatus* aClientStatus )
+/** 
+ * Sets a request status to complete.
+ 
+ * It does not transfer the ownership
+ *
+ * @param aClientStatus the client request to complete
+ */
+   {
+   iClientStatus = aClientStatus;
+   }
+
+inline TRequestStatus* CStateMachine::ClientStatus() const
+/** 
+ * Gets a request status to complete.
+ *
+ * @return aClientStatus the client request to complete
+ */
+   {
+   return iClientStatus;
+   }
+
+inline HBufC8* CStateMachine::Fragment() const
+/** 
+ * Gets a pointer to an arbitrary data fragment owned by the instance
+ *
+ * @return a pointer to the fragment
+ */
+   {
+   return iFragment;
+   }
+
+inline void CStateMachine::UpdateHistory( TInt aUpdate )
+/** 
+ * Updates the state machine history whatever the history means in the context 
+ * the instance is being used
+ *
+ * @param aUpdate a value to OR with the current history
+ */
+   {
+   iHistory |= aUpdate;
+   }
+
+inline TInt CStateMachine::History() const
+/** 
+ * Gets the state machine history whatever the history means in the context 
+ * the instance is being used
+ *
+ * @return the history
+ */
+   {
+   return iHistory;
+   }
+
+inline TInt CStateMachine::LastError() const
+/** 
+ * Gets the last error set when an active event processing leaves or completes
+   with an error
+ *
+ * @return the last error
+ */
+   {
+   return iLastError;
+   }
+
+inline void CStateMachine::SetLastError( TInt aLastError )
+/** 
+ * Sets the last error
+ *
+ * @param aLastError a value of the last error
+ */
+   {
+   iLastError = aLastError;
+   }
+
+#endif
+