commsfwsupport/commselements/StateMachine/include/sm_stateTriple.h
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwsupport/commselements/StateMachine/include/sm_stateTriple.h	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,275 @@
+// Copyright (c) 2005-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:
+// Structures to create a const static (build time) map of states
+// THIS API IS INTERNAL TO NETWORKING AND IS SUBJECT TO CHANGE AND NOT FOR EXTERNAL USE
+// 
+//
+
+/**
+ @file 
+ @internalTechnology
+*/
+
+#include <e32base.h>
+
+// Enable logging for debug builds or builds with the comms flogger enabled - must be defined before including e32utrace.h
+#if (defined(_DEBUG) || defined(__FLOG_ACTIVE)) && !defined(SYMBIAN_TRACE_ENABLE)
+#define SYMBIAN_TRACE_ENABLE
+#endif
+
+
+#ifndef _SM_StateTriple_H_
+#define _SM_StateTriple_H_
+
+#define DEFINE_TRIPLES_TABLE( name ) \
+	const NetStateMachine::TStateTriple name[] = { \
+		{ \
+		(NetStateMachine::TStateTransitionCtor)NULL, \
+		(NetStateMachine::TStateCtor)NULL, \
+		(NetStateMachine::TStateForkCtor)NULL, \
+		NetStateMachine::KTableBoundaryTag_Internal, \
+		NULL \
+		},
+
+#define TRIPLES_TABLE_END() \
+		{ \
+		(NetStateMachine::TStateTransitionCtor)NULL, \
+		(NetStateMachine::TStateCtor)NULL, \
+		(NetStateMachine::TStateForkCtor)NULL, \
+		NetStateMachine::KTableBoundaryTag_Internal, \
+		NULL \
+		} \
+	};
+
+#ifdef SYMBIAN_TRACE_ENABLE
+
+#define FIRST_TRIPLE( firstState, firstStateFork ) \
+		{ \
+		(NetStateMachine::TStateTransitionCtor)NULL, \
+		NetStateMachine::TStateSizeChecker<firstState>::GetVTablePtr, \
+		NetStateMachine::TStateForkSizeChecker<firstStateFork>::GetVTablePtr, \
+		NetStateMachine::KFirstTripleTag_Internal, \
+		_S8("NULL->"#firstState) \
+		}
+
+//STATE_TRIPLE can also be used instead of FIRST_TRIPLE to specify a "starting" transition.
+//Starting transition is a transition that is executed in case the statemachine is already running
+//and an event that would normally cause the statemachine to start occurs.
+#define STATE_TRIPLE( transitionTag, stateTransition, state, stateFork ) \
+		{ \
+		NetStateMachine::TStateTransitionSizeChecker<stateTransition>::GetVTablePtr, \
+		NetStateMachine::TStateSizeChecker<state>::GetVTablePtr, \
+		NetStateMachine::TStateForkSizeChecker<stateFork>::GetVTablePtr, \
+		transitionTag, \
+		_S8(#stateTransition "->" #state) \
+		}
+
+#define THROUGH_TRIPLE( transitionTag, stateTransition, stateFork ) \
+		{ \
+		NetStateMachine::TStateTransitionSizeChecker<stateTransition>::GetVTablePtr, \
+		(NetStateMachine::TStateCtor)NULL, \
+		NetStateMachine::TStateForkSizeChecker<stateFork>::GetVTablePtr, \
+		transitionTag, \
+		_S8(#stateTransition "->" #stateFork) \
+		}
+
+#define LAST_TRIPLE( transitionTag, lastTransition ) \
+		{ \
+		NetStateMachine::TStateTransitionSizeChecker<lastTransition>::GetVTablePtr, \
+		(NetStateMachine::TStateCtor)NULL, \
+		(NetStateMachine::TStateForkCtor)NULL, \
+		transitionTag, \
+		_S8(#lastTransition "->NULL") \
+		}
+#else
+
+#define FIRST_TRIPLE( firstState, firstStateFork ) \
+		{ \
+		(NetStateMachine::TStateTransitionCtor)NULL, \
+		NetStateMachine::TStateSizeChecker<firstState>::GetVTablePtr, \
+		NetStateMachine::TStateForkSizeChecker<firstStateFork>::GetVTablePtr, \
+		NetStateMachine::KFirstTripleTag_Internal, \
+		NULL \
+		}
+
+//STATE_TRIPLE can also be used instead of FIRST_TRIPLE to specify a "starting" transition.
+//Starting transition is a transition that is executed in case the statemachine is already running
+//and an event that would normally cause the statemachine to start occurs.
+#define STATE_TRIPLE( transitionTag, stateTransition, state, stateFork ) \
+		{ \
+		NetStateMachine::TStateTransitionSizeChecker<stateTransition>::GetVTablePtr, \
+		NetStateMachine::TStateSizeChecker<state>::GetVTablePtr, \
+		NetStateMachine::TStateForkSizeChecker<stateFork>::GetVTablePtr, \
+		transitionTag, \
+		NULL \
+		}
+
+#define THROUGH_TRIPLE( transitionTag, stateTransition, stateFork ) \
+		{ \
+		NetStateMachine::TStateTransitionSizeChecker<stateTransition>::GetVTablePtr, \
+		(NetStateMachine::TStateCtor)NULL, \
+		NetStateMachine::TStateForkSizeChecker<stateFork>::GetVTablePtr, \
+		transitionTag, \
+		NULL \
+		}
+
+#define LAST_TRIPLE( transitionTag, lastTransition ) \
+		{ \
+		NetStateMachine::TStateTransitionSizeChecker<lastTransition>::GetVTablePtr, \
+		(NetStateMachine::TStateCtor)NULL, \
+		(NetStateMachine::TStateForkCtor)NULL, \
+		transitionTag, \
+		NULL \
+		}
+
+#endif
+
+#define FIRST_TRIPLE_ENTRY( firstState, firstStateFork ) \
+	FIRST_TRIPLE( firstState, firstStateFork ),
+
+#define STATE_TRIPLE_ENTRY( transitionTag, stateTransition, state, stateFork ) \
+	STATE_TRIPLE( transitionTag, stateTransition, state, stateFork ),
+
+#define THROUGH_TRIPLE_ENTRY( transitionTag, stateTransition, stateFork ) \
+	THROUGH_TRIPLE( transitionTag, stateTransition, stateFork ),
+
+#define LAST_TRIPLE_ENTRY( transitionTag, lastTransition ) \
+	LAST_TRIPLE( transitionTag, lastTransition ),
+
+namespace NetStateMachine
+{
+
+const TInt KExecuteAlways               = 0x0FFFFFFF;
+const TInt KTableBoundaryTag_Internal   = KExecuteAlways - 1; //Should never be used except for the MM itself
+const TInt KFirstTripleTag_Internal     = KExecuteAlways - 2; //Should never be used except for the MM itself
+
+//Used as a flag to determine which direction to move 
+//in the array of triples for the next transition => the actual transition tag
+//is only 31bits
+enum KDirection
+	{
+	EIgnore   = 0x40000000, //do nothing, go nowhere, return (bin 0100...)
+	EForward  = 0x00000000,
+	EBackward = 0x80000000  //(bin 1000...)
+	};
+
+const TInt KMaxStateClassByteSize = 16;
+
+//!!Memory given to MState/MStateTransition derived classes is stack allocated.
+//The memory therefore is valid only between the constructor and one and 
+//only one subsequent call. No class variables can therefore preserve
+//the object state for possible cancel or error call. All such variables
+//are to be accessed via the given aContext pointer
+//The destructor of the state must not cancel the operation
+//There is no guarantie that the destructor of state or transition will be
+//called at all
+class MStateTransition
+	{
+	friend class ACore;
+
+protected:
+	explicit MStateTransition() 
+		{
+		};
+	virtual ~MStateTransition()
+		{
+		};
+
+protected:
+	virtual void DoL() = 0;
+	virtual void Error( TInt aError ) = 0;
+	};
+
+class MState
+	{
+	friend class ACore;
+
+protected:
+	explicit MState() 
+		{
+		};
+	virtual ~MState()
+		{
+		};
+
+protected:
+	virtual TBool Accept() = 0;
+	virtual void Cancel() = 0;
+	};
+
+class MStateFork
+	{
+	friend class ACore;
+
+protected:
+	explicit MStateFork() 
+		{
+		};
+	virtual ~MStateFork()
+		{
+		};
+
+protected:
+	virtual TInt TransitionTag() = 0; //returns a transition tag + direction see KDirection enum
+	};
+
+
+typedef MStateTransition* (*TStateTransitionCtor)(TDesC8& aMem, TAny* aContext);
+typedef MState* (*TStateCtor)(TDesC8& aMem, TAny* aContext);
+typedef MStateFork* (*TStateForkCtor)(TDesC8& aMem, TAny* aContext);
+
+struct TStateTriple
+	{
+	TStateTransitionCtor iTCtor;
+	TStateCtor iSCtor;
+	TStateForkCtor iFCtor;
+	TInt iTransitionTag : 30;
+	const TText8* iName; //For logging purposes only but present in all configurations to preserve BC. Static const (ROM), 4B.
+	};
+
+template <class TSTATETRANSITION>
+struct TStateTransitionSizeChecker
+    {
+    inline static MStateTransition* GetVTablePtr(TDesC8& aMem, TAny* aContext)
+    	{
+    	__ASSERT_COMPILE(sizeof(TSTATETRANSITION) < KMaxStateClassByteSize); //size of the class is greater than KMaxStateClassByteSize
+    	return TSTATETRANSITION::GetVTablePtr(aMem,aContext);
+    	}
+    };
+
+template <class TSTATE>
+struct TStateSizeChecker
+    {
+    inline static MState* GetVTablePtr(TDesC8& aMem, TAny* aContext)
+    	{
+    	__ASSERT_COMPILE(sizeof(TSTATE) < KMaxStateClassByteSize); //size of the class is greater than KMaxStateClassByteSize
+    	return TSTATE::GetVTablePtr(aMem,aContext);
+    	}
+    };
+
+template <class TSTATEFORK>
+struct TStateForkSizeChecker
+    {
+    inline static MStateFork* GetVTablePtr(TDesC8& aMem, TAny* aContext)
+    	{
+    	__ASSERT_COMPILE(sizeof(TSTATEFORK) < KMaxStateClassByteSize); //size of the class is greater than KMaxStateClassByteSize
+    	return TSTATEFORK::GetVTablePtr(aMem,aContext);
+    	}
+    };
+
+} //namespace NetStateMachine
+
+#endif //_SM_StateTriple_H_
+
+