commsfwsupport/commselements/meshmachine/inc/mm_activities.h
branchRCL_3
changeset 29 9644881fedd0
parent 0 dfb7c4ff071f
child 66 cbb19216b74d
--- a/commsfwsupport/commselements/meshmachine/inc/mm_activities.h	Tue May 11 17:20:19 2010 +0300
+++ b/commsfwsupport/commselements/meshmachine/inc/mm_activities.h	Tue May 25 14:00:39 2010 +0300
@@ -91,7 +91,7 @@
 	#define DEFINE_EXPORT_CUSTOM_NODEACTIVITY( id, name, msgtype, ctor ) \
 		EXPORT_C const MeshMachine::TNodeActivity& name :: Self() {return iSelf;} \
 		EXPORT_C const NetStateMachine::TStateTriple& name :: FirstTriple() {return iData[1];} \
-		const MeshMachine::TNodeActivity name :: iSelf = {id, msgtype::EId, msgtype::ERealm, name :: iData[1], &ctor, _S8(#name)}; \
+		const MeshMachine::TNodeActivity name :: iSelf = {id, 0, msgtype::EId, msgtype::ERealm, name :: iData[1], (TAny*)&ctor, _S8(#name)}; \
 		DEFINE_TRIPLES_TABLE( name :: iData )
 
 /**
@@ -110,7 +110,7 @@
 @see CNodeActivityBase
 */
 	#define DEFINE_CUSTOM_NODEACTIVITY( id, name, msgtype, ctor ) \
-		const MeshMachine::TNodeActivity name :: iSelf = {id, msgtype::EId, msgtype::ERealm, name :: iData[1], &ctor, _S8(#name)}; \
+		const MeshMachine::TNodeActivity name :: iSelf = {id, 0, msgtype::EId, msgtype::ERealm, name :: iData[1], (TAny*)&ctor, _S8(#name)}; \
 		DEFINE_TRIPLES_TABLE( name :: iData )
 
 #else
@@ -128,7 +128,7 @@
 	#define DEFINE_EXPORT_CUSTOM_NODEACTIVITY( id, name, msgtype, ctor ) \
 		EXPORT_C const MeshMachine::TNodeActivity& name :: Self() {return iSelf;} \
 		EXPORT_C const NetStateMachine::TStateTriple& name :: FirstTriple() {return iData[1];} \
-		const MeshMachine::TNodeActivity name :: iSelf = {id, msgtype::EId, msgtype::ERealm, name :: iData[1], &ctor, NULL}; \
+		const MeshMachine::TNodeActivity name :: iSelf = {id, 0, msgtype::EId, msgtype::ERealm, name :: iData[1], (TAny*)&ctor, NULL}; \
 		DEFINE_TRIPLES_TABLE( name :: iData )
 
 /**
@@ -147,7 +147,7 @@
 @see CNodeActivityBase
 */
 	#define DEFINE_CUSTOM_NODEACTIVITY( id, name, msgtype, ctor ) \
-		const MeshMachine::TNodeActivity name :: iSelf = {id, msgtype::EId, msgtype::ERealm, name :: iData[1], &ctor, NULL}; \
+		const MeshMachine::TNodeActivity name :: iSelf = {id, 0, msgtype::EId, msgtype::ERealm, name :: iData[1], (TAny*)&ctor, NULL}; \
 		DEFINE_TRIPLES_TABLE( name :: iData )
 
 #endif
@@ -417,6 +417,126 @@
 	};
 
 /**
+RESERVED MACROS NOT TO BE USED.
+The following are new macro definitions allowing the context to be passed as a parameter rather than the node.
+In time the ability to pass context rather than node will be placed in the original macros. For the meantime,
+only critical commsFw activities which must have the context passed instead of the node should use these macros.
+All other activities should continue to use original macros declared above.
+*/
+/**
+Declare and export a node activity.
+
+@param name  The name of the activity, which will be used to put it into the node's activity map
+
+@see DECLARE_NODEACTIVITY
+*/
+#define DECLARE_RESERVED_EXPORT_NODEACTIVITY( name ) \
+	struct name \
+		{ \
+		IMPORT_C static const MeshMachine::TNodeActivity& Self(); \
+		IMPORT_C static const NetStateMachine::TStateTriple& FirstTriple(); \
+		static const MeshMachine::TNodeActivity iSelf; \
+		static const NetStateMachine::TStateTriple iData[]; \
+		};
+
+/**
+Declares a node activity. A node activity is a state machine. It contains multiple nodeactivity
+entries, which respresent the states, transitions and forks of the state machine.
+
+@param name  The name of the activity, which will be used to put it into the node's activity map
+
+@see DEFINE_NODEACTIVITY
+@see NODEACTIVITY_ENTRY
+*/
+#define DECLARE_RESERVED_NODEACTIVITY( name ) \
+	struct name \
+		{ \
+		inline static const MeshMachine::TNodeActivity& Self() {return iSelf;} \
+		inline static const NetStateMachine::TStateTriple& FirstTriple() {return iData[1];} \
+		static const MeshMachine::TNodeActivity iSelf; \
+		static const NetStateMachine::TStateTriple iData[]; \
+		};
+
+#ifdef SYMBIAN_TRACE_ENABLE
+
+/**
+Define a custom node activity. A custom node activity is a node activity which defines its own
+node activity class. This is used, for example, if the activity wishes to share some custom context
+information between the states and transition in the activity.
+
+Node activity class must derive from CNodeActivityBase.
+
+@param id        Identifier for the activity
+@param name      The name of the activity
+@param msgtype   Message which will kickoff this activity
+@param ctor      Constructor for the custom activity class
+
+@see DEFINE_RESERVED_NODEACTIVITY
+@see CNodeActivityBase
+	
+*/
+	#define DEFINE_RESERVED_CUSTOM_NODEACTIVITY( id, name, msgtype, ctor ) \
+		const MeshMachine::TNodeActivity name :: iSelf = {id, 1, msgtype::EId, msgtype::ERealm, name :: iData[1], (TAny*)&ctor, _S8(#name)}; \
+		DEFINE_TRIPLES_TABLE( name :: iData )
+
+#else
+
+/**
+Define and export a custom node activity.
+
+@param id        Identifier for the activity
+@param name      The name of the activity
+@param msgtype   Message which will kickoff this activity
+@param ctor      Constructor for the custom activity class
+
+@see DEFINE_RESERVED_CUSTOM_NODEACTIVITY
+*/
+	#define DEFINE_RESERVED_EXPORT_CUSTOM_NODEACTIVITY( id, name, msgtype, ctor ) \
+		EXPORT_C const MeshMachine::TNodeActivity& name :: Self() {return iSelf;} \
+		EXPORT_C const NetStateMachine::TStateTriple& name :: FirstTriple() {return iData[1];} \
+		const MeshMachine::TNodeActivity name :: iSelf = {id, 1, msgtype::EId, msgtype::ERealm, name :: iData[1], (TAny*)&ctor, NULL}; \
+		DEFINE_TRIPLES_TABLE( name :: iData )
+
+/**
+Define a custom node activity. A custom node activity is a node activity which defines its own
+node activity class. This is used, for example, if the activity wishes to share some custom context
+information between the states and transition in the activity.
+
+Node activity class must derive from CNodeActivityBase.
+
+@param id        Identifier for the activity
+@param name      The name of the activity
+@param msgtype   Message which will kickoff this activity
+@param ctor      Constructor for the custom activity class
+
+@see DEFINE_RESERVED_NODEACTIVITY
+@see CNodeActivityBase
+*/
+	#define DEFINE_RESERVED_CUSTOM_NODEACTIVITY( id, name, msgtype, ctor ) \
+		const MeshMachine::TNodeActivity name :: iSelf = {id, 1, msgtype::EId, msgtype::ERealm, name :: iData[1], (TAny*)&ctor, NULL}; \
+		DEFINE_TRIPLES_TABLE( name :: iData )
+
+#endif
+
+/**
+Define and declare a custom node activity
+
+@param id        Identifier for the activity
+@param name      The name of the activity
+@param msgtype   Message which will kickoff this activity
+@param ctor      Constructor for the custom activity class
+
+@see DEFINE_RESERVED_CUSTOM_NODEACTIVITY
+*/
+#define DECLARE_DEFINE_RESERVED_CUSTOM_NODEACTIVITY( id, name, msgtype, ctor ) \
+	DECLARE_RESERVED_NODEACTIVITY( name ) \
+	DEFINE_RESERVED_CUSTOM_NODEACTIVITY( id, name, msgtype, ctor )
+
+/**
+END OF RESERVED MACROS
+*/
+
+/**
 Mark the end of an activity map. This macro should be used for an activity map based
 on other activity maps.
 
@@ -432,6 +552,7 @@
 
 namespace MeshMachine
 {
+
 /**
 Base class for all node activity objects. Non custom node activities will use this by default.
 **/
@@ -516,10 +637,13 @@
 	Get the id of the node that the last request from this activity was sent to.
 	   @return Node id of the last node the activity has posted a request to
 	*/
-	const Messages::TNodeId PostedToId() const
-		{
-		return iPostedToId;
-		}
+	IMPORT_C const Messages::TNodeId& PostedToNodeId() const;
+	
+    /**
+    Get the id of the node that the last request from this activity was sent to.
+       @return Node id of the last node the activity has posted a request to
+    */
+	IMPORT_C const Messages::RNodeInterface* PostedToPeer() const;
 
 	/**
 	Get the id of the message that started this activity.
@@ -576,6 +700,13 @@
 	   @param aNodeId Node id to set the postedTo id to
 	*/
 	IMPORT_C void SetPostedTo(const Messages::TNodeId& aNodeId);
+	
+    /**
+       Manually set the postedTo id
+
+       @param aNodeId Node id to set the postedTo id to
+    */
+	IMPORT_C void SetPostedTo(const Messages::RNodeInterface& aRecipient);
 
 	/**
 	   Clear the postedTo id
@@ -809,8 +940,60 @@
 
 	const TNodeActivity& iActivitySig;
 
-	// Last node a message was sent to
-	Messages::TNodeId iPostedToId;
+	class RPostedToNodeOrPeer
+	/*
+	 * Class is used to store the recipient of the last request sent from the 'this' 
+	 * (the activity). This recipient can be represented either by its TNodeId address 
+	 * or, if it's a peer of the local node, by RNodeInterface. 
+     * The implementation may seem awkward or overengineered. This is to protect binary
+     * compatibility (it used to be TNodeId here and sizeof TNodeId was all there was at hand).
+     * 
+     * Rules of the game are that RPostedToNodeOrPeer:iBuf is a shared dwelling for either:
+     * - address of an RNodeInterface (in case posted to is a peer)
+     * - TNodeId (in case posted to is not a peer)
+     * Inspecting the content of iBuf and the assumptions around it are a little fragile 
+     * (based on TNodeId class layout a bit), so the code must be viligent. 
+     * _Node and _Peer perform arbitral happy conversion, so there can be 3 reasons why _Node()->Ptr() is NULL:
+     * (1) iBuf stores a 4 byte ptr to RNodeInterface and what Ptr normally returns is beyond these 4 bytes in a land hopefully zeroed by ::Close
+     * (2) iBuf stores nothing. 
+     * (3) iBuf stores a TNodeId pointing a NULL node (effectivelly TNodeId::NullId()). (3) is only theoretical as Open(TNodeId) prevens Ptr be NULL
+     * Therefore it is safe to assume that if Ptr() is NULL, it is either a valid pointer to a peer or NULL.
+     * Happily _Peer() will return that pointer or NULL respectivelly.* 
+	 */
+	    {
+	private:
+	    typedef Messages::RNodeInterface* TPeerType;
+    public:
+	    RPostedToNodeOrPeer();
+	    void Open(const Messages::RNodeInterface& aPeer);
+	    void Open(const Messages::TNodeId& aNode);
+	    void Close();
+	    
+	    const Messages::RNodeInterface* Peer() const;
+	    const Messages::TNodeId& NodeId() const;
+	    
+	private:
+	    TPeerType* _Peer() 
+	        {
+            return reinterpret_cast<TPeerType*>(&iBuf[0]);
+	        }
+        
+	    const TPeerType* _Peer() const 
+            {
+            return reinterpret_cast<const TPeerType*>(&iBuf[0]);
+            }	    
+	    
+	    Messages::TNodeId* _Node()
+	        {
+	        return reinterpret_cast<Messages::TNodeId*>(&iBuf[0]);
+	        }
+	    
+        const Messages::TNodeId* _Node() const
+            {
+            return reinterpret_cast<const Messages::TNodeId*>(&iBuf[0]);
+            }
+        TUint8 iBuf[__Align8(sizeof(Messages::TNodeId))];	    
+	    } iPostedToId;
 	};
 
 
@@ -846,7 +1029,14 @@
 	@param aNode        The node to which this activity will belong.
 	@return Generated unique component of activity id
 	*/
-	IMPORT_C static TUint GetNextActivityCountL( const TNodeActivity& aActivitySig, const AMMNodeBase& aNode );
+	static TUint GetNextActivityCountL( const TNodeActivity& aActivitySig, const AMMNodeBase& aNode );
+	/**
+	For use by custom activity News to generate the unique part of the activity id.
+	@param aActivitySig Context information about how the activity is to be started
+	@param aNode        The node to which this activity will belong.
+	@return Generated unique component of activity id
+	*/
+	IMPORT_C static TUint GetNextActivityCount( const TNodeActivity& aActivitySig, const AMMNodeBase& aNode );
 
 	/**
 	Constructor for CNodeParallelActivityBase
@@ -1387,6 +1577,13 @@
     static MeshMachine::CNodeActivityBase* NewL(const MeshMachine::TNodeActivity& aActivitySig, MeshMachine::AMMNodeBase& aNode);
 	};
 
+
+inline TUint CNodeParallelActivityBase::GetNextActivityCountL( const TNodeActivity& aActivitySig, const AMMNodeBase& aNode )
+    {
+    //Historical. Method ceased to leave, but must keep the old, L-ending overload.
+    return GetNextActivityCount(aActivitySig, aNode);
+    }
+
 } //namespace MeshMachine
 
 #endif //SYMBIAN_MM_ACTIVITIES_H