commsfwsupport/commselements/nodemessages/src/nm_node.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwsupport/commselements/nodemessages/src/nm_node.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,192 @@
+// Copyright (c) 2007-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
+*/
+
+#include "nm_node.h"
+#include "nm_messages_base.h"
+
+
+#ifdef _DEBUG
+// Panic category for "absolutely impossible!" vanilla ASSERT()-type panics from this module
+// (if it could happen through user error then you should give it an explicit, documented, category + code)
+_LIT(KSpecAssert_ElemNodeMessNodC, "ElemNodeMessNodC");
+#endif
+
+using namespace Messages;
+
+
+EXPORT_C NetInterfaces::TInterfaceControl* ANode::FetchNodeInterfaceControlL(TInt /*aInterfaceId*/)
+    {
+    User::Leave(KErrInterfaceNotSupported);
+    return NULL;
+    }
+
+EXPORT_C TAny* ANode::FetchNodeInterfaceL(TInt aInterfaceId)
+    {
+    NetInterfaces::TInterfaceControl* ic = FetchNodeInterfaceControlL(aInterfaceId);
+    return ic->FetchInterfaceL(aInterfaceId);
+    }
+
+EXPORT_C const TNodeId& ASimpleNodeIdBase::NodeId() const
+    {
+    return ANodeId::Id();
+    }
+
+EXPORT_C const TNodeId& ANodeIdBase::NodeId() const
+    {
+    return ANodeId::Id();
+    }
+
+EXPORT_C ANodeBase::ANodeBase(const TNodeId& aNodeId)
+:	TIfStaticFetcherNearestInHierarchy(this)
+	{
+	iSelfInterface.Open(aNodeId);
+	}
+
+EXPORT_C void ANodeBase::ReturnInterfacePtrL(ANodeBase*& aInterface)
+    {
+    aInterface = this;
+    }
+
+EXPORT_C ANodeBase::~ANodeBase()
+	{
+	//There can be no clients left in the array.
+	//No Data Clients
+	//No Control Clients
+	//No Service Providers
+	//No Control Provider
+
+	TClientIter<TDefaultClientMatchPolicy> iter(GetClientIter<TDefaultClientMatchPolicy>(TClientType(TClientType::EAll)));
+	while(*iter)
+		{
+	    NM_LOG((KNodeMessagesSubTag, _L8("ERROR: ~ANodeBase(%08x) - Client %08x Type %04x"),
+	        Id().Ptr(), &((*iter)->RecipientId()), (*iter)->Type()));
+		++iter;
+		}
+
+	__ASSERT_DEBUG(iClients.Count()==0, User::Panic(KSpecAssert_ElemNodeMessNodC, 1)); //Please fix your node.
+    iClients.ResetAndDestroy();
+    iSelfInterface.Close();
+	}
+
+EXPORT_C RNodeInterface* ANodeBase::NewClientInterfaceL(const TClientType& /*aClientType*/, TAny* /*aClientInfo*/)
+    {
+    return new(ELeave)RNodeInterface();
+    }
+
+/**
+ * Find specified client identified by id specified
+ * @return A pointer to RNodeInterface, or NULL, if not found
+ */
+EXPORT_C RNodeInterface* ANodeBase::FindClient(const TRuntimeCtxId& aId) const
+    {
+	TInt dummy = 0;
+	return DoFindClient(aId, dummy);
+    }
+
+//As FindClient but must not return NULL
+EXPORT_C RNodeInterface* ANodeBase::FindClientL(const TRuntimeCtxId& aId) const
+    {
+	TInt dummy = 0;
+	RNodeInterface* c = DoFindClient(aId, dummy);
+	User::LeaveIfError(c? KErrNone : KErrNotFound);
+	return c;
+    }
+
+EXPORT_C RNodeInterface* ANodeBase::DoFindClient(const TRuntimeCtxId& aId, TInt& aFoundAtIndex) const
+	{
+	aFoundAtIndex = KErrNotFound;
+	for (TInt i = iClients.Count() - 1; i>=0; i--)
+        {
+        if (*iClients[i] == aId)
+            {
+	        aFoundAtIndex = i;
+            return iClients[i];
+            }
+        }
+    return NULL;
+	}
+
+EXPORT_C TUint ANodeBase::CountClients(TClientIterBase& aClientIterator) const
+	{
+	TUint count = 0;
+	while ((aClientIterator++) != NULL)
+		{
+		count++;
+		}
+	return count;
+	}
+
+EXPORT_C TInt ANodeBase::PostToClients(TClientIterBase& aClientIterator, const TRuntimeCtxId& aPostFrom, const TSignalBase& aMessage, TUint32 aFlagsToSet, TUint32 aFlagsToClear) const
+	{
+	TInt count = 0;
+
+    RNodeInterface* ctl;
+	while ((ctl = aClientIterator++) != NULL)
+		{
+		if (!(ctl->Flags() & TClientType::ELeaving))
+    		{
+    		count++;
+    		ctl->PostMessage(aPostFrom, aMessage);
+    		ctl->ClearFlags(aFlagsToClear);
+    		ctl->SetFlags(aFlagsToSet);
+    		}
+		}
+	return count;
+	}
+
+EXPORT_C RNodeInterface* ANodeBase::AddClientL(const TNodeId& aClientId, const TClientType& aClientType, TAny* aClientInfo)
+	{
+	NM_LOG((KNodeMessagesSubTag, _L8("ANodeBase %08x:\tAddClientL(%08x, flags=%04x, type=%04x)"), Id().Ptr(), aClientId.Ptr(), aClientType.Flags(), aClientType.Type()));
+	RNodeInterface* client = FindClient(aClientId);
+	if (NULL == client)
+		{
+		RNodeInterface* cc = NewClientInterfaceL(aClientType, aClientInfo);
+		CleanupStack::PushL(cc);
+		iClients.AppendL(cc); //don't change it some states may rely on the fact that clients
+		//are appended
+		CleanupStack::Pop(cc);
+		cc->Open(aClientId, aClientType);
+		client = cc;
+		}
+	else
+		{
+		client->SetFlags(aClientType.Flags());
+		}
+
+	return client;
+	}
+
+EXPORT_C void ANodeBase::RemoveClient(RNodeInterface& aClient)
+	{
+	TInt foundAt = iClients.Find(&aClient);
+	__ASSERT_DEBUG(KErrNotFound!=foundAt, User::Panic(KSpecAssert_ElemNodeMessNodC, 2));
+	RemoveClient(foundAt);
+	}
+
+EXPORT_C void ANodeBase::RemoveClient(TInt aIndex)
+	{
+	__ASSERT_ALWAYS(aIndex >= 0 && aIndex < iClients.Count(), User::Panic(Messages::KMessagesPanic,Messages::EClientNotValidPanic));
+	RNodeInterface* client = iClients[aIndex];
+	NM_LOG((KNodeMessagesSubTag, _L8("ANodeBase %08x:\tRemoveClient(%08x, flags=%04x, type=%04x)"), Id().Ptr(), client->RecipientId().Ptr(), client->Flags(), client->Type()));
+	client->Close();
+	delete client;
+	iClients.Remove(aIndex);
+	}
+
+