--- /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
+