diff -r 000000000000 -r dfb7c4ff071f commsfwsupport/commselements/nodemessages/src/nm_interfaces.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commsfwsupport/commselements/nodemessages/src/nm_interfaces.cpp Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,244 @@ +// 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_common.h" +#include "nm_interfaces.h" +#include +#include +#include "nm_signals.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_ElemNodeMessIntC, "ElemNodeMessIntC"); +#endif + +using namespace Messages; +using namespace Meta; + +// +//TClientType +namespace Mem4NullType +{ +static const TUint8 mem[sizeof(TClientType)] = {0}; +} + +EXPORT_C const TClientType& TClientType::NullType() {return *reinterpret_cast(Mem4NullType::mem);} + +/****************************************************************************************************** +* +* +* RClientInterface +* +* +*******************************************************************************************************/ +EXPORT_C RClientInterface::RClientInterface() +: iTransportSender(NULL) + { + Mem::FillZ(iRecipientAddress, sizeof(iRecipientAddress)); + } + +EXPORT_C RClientInterface::~RClientInterface() + { + } + +EXPORT_C void RClientInterface::Open(const TRuntimeCtxId& aPostTo, MTransportSender* aSender) + { + iTransportSender = aSender? aSender : &TlsGlobals::Get().TransportSender(); + RecipientRef() = aPostTo; //This a deep copy + } + +EXPORT_C void RClientInterface::Close() + { + iTransportSender = NULL; + Mem::FillZ(iRecipientAddress, sizeof(iRecipientAddress)); + } + +EXPORT_C TBool RClientInterface::IsOpen() const + { + return iTransportSender != NULL; + } + + +EXPORT_C /*static*/ void RClientInterface::OpenPostMessageClose(const TRuntimeCtxId& aPostFrom, const TRuntimeCtxId& aPostTo, const TSignalBase& aMessage) + { + RClientInterface client; + client.Open(aPostTo); + client.PostMessage(aPostFrom, aMessage); + client.Close(); + } + +EXPORT_C void RClientInterface::PostMessage(const TRuntimeCtxId& aPostFrom, const TSignalBase& aMessage) const + { + PostMessage(aPostFrom, RecipientId(), aMessage); + } + +EXPORT_C TBool RClientInterface::operator==(const TRuntimeCtxId& aRHS) const + { + return RecipientRef() == aRHS; + } + +EXPORT_C TBool RClientInterface::operator==(const RClientInterface& aRHS) const + { + return RecipientRef() == aRHS.RecipientRef(); + } + +void RClientInterface::PostMessage(const TRuntimeCtxId& aPostFrom, const TRuntimeCtxId& aPostTo, const TSignalBase& aMessage) const + { + __ASSERT_DEBUG(iTransportSender, User::Panic(KMessagesPanic, ETransportNotOpened)); // Interface not properly initialised; needs transport for this sending thread + __ASSERT_DEBUG(aPostTo.Size() > 0, User::Panic(KMessagesPanic, EAddressNotValidPanic)); + + iTransportSender->PostMessage(aPostFrom, aPostTo, aMessage); + } + +/****************************************************************************************************** +* +* +* RNodeInterface +* +* +*******************************************************************************************************/ +EXPORT_C void RNodeInterface::Open(TNodeId aPostTo, const TClientType& aClientType, MTransportSender* aSender) +/* +Opens 'this'. +aPostTo by value on purpose as clients may be calling ::Open with subclasses of TNodeId, we must trunkate. +*/ + { + RClientInterface::Open(aPostTo, aSender); + iClientType = aClientType; + } + +EXPORT_C void RNodeInterface::Close() + { + RClientInterface::Close(); + iClientType = TClientType::NullType(); + } + + +EXPORT_C void RNodeInterface::PostMessage(const TRuntimeCtxId& aPostFrom, const TNodeId::TRemainder& aPostTo, const TSignalBase& aMessage) const + { + TUint8 postTo[__Align8(TRuntimeCtxId::KMaxInlineAddressSize)]; + Mem::Copy(postTo, &RecipientId(), sizeof(TNodeId)); + Mem::Copy(postTo + sizeof(TNodeId), aPostTo.iRemainder, aPostTo.Size()); + postTo[0] = aPostTo.Size() + sizeof(TNodeId); + postTo[0] |= TRuntimeCtxId::KIsNullMask8; + + RClientInterface::PostMessage(aPostFrom, *reinterpret_cast(postTo), aMessage); + } + + +EXPORT_C TBool RNodeInterface::operator==(const RNodeInterface& aRHS) const + { + return RecipientId() == aRHS.RecipientId(); + } + +/****************************************************************************************************** +* +* +* TClientIterBase +* +* +*******************************************************************************************************/ +EXPORT_C RNodeInterface* TClientIterBase::operator[](TInt aInd) + { + // assuming at present that array indices start from beginning of array + // rather than current location of iterator, and array access doesn't + // change location of iterator. + TInt prevIndex = iIndex; + TInt start = 0; + RNodeInterface* cli = Find(start, +1, aInd + 1); + iIndex = prevIndex; + return cli; + } + +EXPORT_C RNodeInterface* TClientIterBase::Find(TInt& aInd, TInt aDir, TInt aCount) + { + while (aInd >= 0 && aInd < iClients.Count()) + { + RNodeInterface* ctl = iClients[aInd]; + if (TypeMatch(*ctl) && --aCount <= 0) + { + iIndex = aInd; + return ctl; + } + aInd += aDir; + } + return NULL; + } + + +/****************************************************************************************************** +* +* +* RRequestOriginator +* +* +*******************************************************************************************************/ +EXPORT_C TInt RRequestOriginator::Open(Messages::RNodeInterface& aNode, const Messages::TRuntimeCtxId& aRequestOriginator) + { + if (aNode == aRequestOriginator) + { + iNode = &aNode; + iRemainder = aRequestOriginator; + return KErrNone; + } + return KErrArgument; + } + +EXPORT_C void RRequestOriginator::Open(RRequestOriginator& aOriginalRequest) + { + __ASSERT_DEBUG(aOriginalRequest.IsOpen(), User::Panic(KSpecAssert_ElemNodeMessIntC, 1)); + iNode = aOriginalRequest.iNode; + iRemainder = aOriginalRequest.iRemainder; + aOriginalRequest.Close(); + } + +EXPORT_C TBool RRequestOriginator::IsOpen() const + { + return iNode != NULL; + } + +EXPORT_C TBool RRequestOriginator::operator==(const RRequestOriginator& aRHS) const + { + return (Node().RecipientId() == aRHS.Node().RecipientId()) && (iRemainder == aRHS.iRemainder); + } + +EXPORT_C TBool RRequestOriginator::operator==(const TRuntimeCtxId& aRHS) const + { + return (iNode->RecipientId() == aRHS) && (iRemainder == aRHS); + } + +EXPORT_C void RRequestOriginator::Close() + { + iNode = NULL; + } + +EXPORT_C void RRequestOriginator::PostMessage(const Messages::TRuntimeCtxId& aPostFrom, const Messages::TSignalBase& aMessage) const + { + __ASSERT_DEBUG(IsOpen(), User::Panic(KMessagesPanic, EClientNotValidPanic)); + iNode->PostMessage(aPostFrom, iRemainder, aMessage); + } + +EXPORT_C void RRequestOriginator::ReplyTo(const Messages::TRuntimeCtxId& aReplyFrom, const Messages::TSignalBase& aMessage) + { + PostMessage(aReplyFrom, aMessage); + Close(); + } +