diff -r 000000000000 -r dfb7c4ff071f commsfwsupport/commselements/nodemessages/src/nm_node.cpp --- /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 iter(GetClientIter(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); + } + +