commsfwsupport/commselements/meshmachine/inc/mm_node.h
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwsupport/commselements/meshmachine/inc/mm_node.h	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,180 @@
+// 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:
+//
+
+/**
+ @file 
+ @publishedPartner
+ @released
+*/
+
+#ifndef SYMBIAN_MM_NODE_H
+#define SYMBIAN_MM_NODE_H
+
+#include <elements/nm_node.h>
+#include <elements/sm_core.h>
+#include <elements/nm_signatures.h>
+
+namespace MeshMachine
+{
+
+static const TInt KUseDefaultPreallocatedSize = -1;
+
+class CNodeActivityBase;
+struct TNodeActivity;
+struct TNodeActivityMap;
+class TNodeContextBase;
+
+//-=========================================================
+//
+//AMMNodeBase
+//
+//-=========================================================
+class AMMNodeBase : public Messages::ANodeBase,
+                    public ITFHIERARCHY_LINK_1(AMMNodeBase, Messages::ANodeBase, AMMNodeBase)
+/**
+@internalTechnology
+*/
+	{
+	friend class CNodeActivityBase;
+	friend class AContextStore; //to access HandleMessageReturnValue from Retry
+	friend class AActivitySemaphore; //to access HandleMessageReturnValue from Retry
+
+public:
+	typedef ITFHIERARCHY_LINK_1(AMMNodeBase, Messages::ANodeBase, AMMNodeBase) TIfStaticFetcherNearestInHierarchy;
+
+    static const TInt KInterfaceId = 0x102864E5;
+
+	/**	@internalAll */
+    IMPORT_C void ReturnInterfacePtrL(AMMNodeBase*& aInterface);
+
+protected:
+	IMPORT_C explicit AMMNodeBase(const TNodeActivityMap& aActivityMap, const Messages::TNodeId& aNodeId);
+	IMPORT_C ~AMMNodeBase();
+    IMPORT_C void ConstructL(TInt aSize = KUseDefaultPreallocatedSize); //When KUseDefaultPreallocatedSize, KDefaultMaxPreallocatedActivitySize will be used
+
+public:
+	/**	@internalAll */
+	IMPORT_C void Received(const Messages::TNodeSignal::TMessageId aNoPeerMsgIds[], TNodeContextBase& aContext);
+
+	/**
+	This function may delete the object pointed to by aCurrentActivity. So don't use it after this function is called.
+	@internalAll
+	*/
+	IMPORT_C void PostReceived(TNodeContextBase& aContext);
+
+	/**	@publishedPartner @released */
+	IMPORT_C void RemoveClient(const Messages::TRuntimeCtxId& aClientId, TNodeContextBase& aContext);
+
+public:
+	/**	@internalAll */
+	IMPORT_C void RemoveClient(const Messages::TRuntimeCtxId& aClientId);
+
+	/**	@publishedPartner @released */
+    IMPORT_C TUint CountActivities(TUint8 aActivitySigId) const; //Counts only active activities (not idle)
+	/**	@publishedPartner @released */
+    IMPORT_C TUint CountAllActivities(TUint8 aActivitySigId) const;  //Counts all activities with the specified sig id
+	/**	@publishedPartner @released */
+    IMPORT_C TUint CountAllActivities() const; //Count all activities
+	/**	@publishedPartner @released */
+	IMPORT_C CNodeActivityBase* FindActivityById(TUint aActivityId) const;
+
+    /**	@internalAll */
+    IMPORT_C const RPointerArray<CNodeActivityBase>& Activities() const;
+	/**	@internalAll */
+    IMPORT_C CNodeActivityBase* FindAddressedActivity(const TNodeContextBase& aContext) const;
+	/**	@internalAll */
+	IMPORT_C CNodeActivityBase* FindActivityOriginatedBy(const Messages::TRuntimeCtxId& aPeerId);
+	/**	@internalAll */
+    IMPORT_C void AbortActivitiesOriginatedBy(TNodeContextBase& aContext, const Messages::TNodeId& aNodeId = Messages::TNodeId::NullId(), TBool aIsNodeBeingDestroyed = EFalse);
+
+protected:
+	/**	@internalAll */
+	IMPORT_C virtual void HandlePassThroughMessage(TNodeContextBase& aContext);
+	/**	@internalAll */
+	IMPORT_C virtual void HandleMessageReturnValue(TNodeContextBase& aContext);
+	/**	@internalAll */	
+	void SignalActivities();
+
+private:
+	/**	@internalAll */
+    void StartNewActivitiesL(TNodeContextBase& aContext, CNodeActivityBase* aSendersActivity);
+	/**	@internalAll */
+    void StartActivityL(TNodeContextBase& aContext, const TNodeActivity& aActivitySig, const NetStateMachine::TStateTriple& aFirst);
+	/**	@internalAll */
+    TBool Accept(TNodeContextBase& aContext, CNodeActivityBase*& aFoundActivity);
+	/**	@internalAll */
+    TAny* BorrowPreallocatedSpace(TUint aSize);
+	/**	@internalAll */
+    void ReturnPreallocatedSpace(TAny* aSpace);
+
+protected:
+	/**	@internalAll */
+	const TNodeActivityMap& iActivityMap;
+
+private:
+	/**	@internalAll */
+	RPointerArray<CNodeActivityBase> iActivities;
+
+	//-===============================================================================
+    //PREALLOCATION:
+    //This facility is designed to assist in securing sensitive behaviour that
+    //shouldn't fail and/but needs to allocate memory (usually cleanup tasks).
+    //
+    //The memory is allocated using User::AllocZL(aSize), the same way the CBase new
+    //operator does it. CBase doesn't override delete operator and hence makes the same
+    //assumption we make herein.
+    //-===============================================================================
+	/**	@internalAll */
+	void PreallocateSpaceL(TUint aSize); //Utility function
+	TUint MaxPreallocatedActivityCount() const;
+	TAny* GetPreallocatedCell(TUint aIndex) const;
+	/**	@internalAll */
+	TAny* iPreallocatedSpace;
+	};
+
+//-=========================================================
+//
+//AMMNodeIdBase
+//
+//-=========================================================
+
+class AMMNodeIdBase : protected Messages::ANode, public Messages::ANodeId, public AMMNodeBase
+/**
+@publishedPartner
+@released
+
+Aggregation base class for mesh-machine based nodes.
+*/
+	{
+protected:
+    explicit AMMNodeIdBase(const TNodeActivityMap& aActivityMap)
+    :	Messages::ANodeId(static_cast<Messages::ANode&>(*this)),
+    	AMMNodeBase(aActivityMap, Messages::ANodeId::Id())
+        {
+        }
+
+    IMPORT_C virtual const Messages::TNodeId& NodeId() const;
+public:
+	//this needs to be here provisionally - subclasses complain about imbiguous access to ::Id()
+	const Messages::TNodeId& Id() const
+		{
+		return NodeId();	
+		}    
+	};
+
+} //namespace MeshMachine
+
+#endif //SYMBIAN_NM_NODE_H
+