datacommsserver/esockserver/ssock/ss_transporthook.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/ssock/ss_transporthook.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,129 @@
+// 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 ss_transporthook.CPP
+*/
+
+#include "ss_transporthook.h"
+#include <comms-infras/metatype.h>
+#include <comms-infras/ss_log.h>
+#include <ss_glob.h>
+#include <comms-infras/ss_thread.h>
+#include <comms-infras/ss_nodeinterfaces.h>
+
+
+using namespace ESock;
+using namespace Meta;
+using namespace CommsFW;
+using namespace Messages;
+
+
+//TODO[PROD] - reimplement hooks?
+#if 0
+
+#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_ESockSSockstrnsp, "ESockSSockstrnsp");
+#endif
+
+//class TCFRegisterMessageHook : public TCFRegisterHookSignal
+EXPORT_C TCFRegisterMessageHook::TCFRegisterMessageHook(const TNodeId& aSenderId, TUint aActivityId, const TNodeSignal::TMessageId& aMessageId):
+    TCFRegisterHookSignal( Messages::TSignatureBase::TypeId() ),
+    iMessageId(aMessageId),
+    iActivityId(aActivityId)
+    {
+    SetClientId(aSenderId());
+    }
+
+EXPORT_C CCFHookEntry* TCFRegisterMessageHook::NewHookEntryL() const
+    {
+    return new(ELeave)CCFMessageHookEntry(iMessageId,iActivityId,TNodeId(iNode),TNodeId(ClientId()));
+    }
+
+EXPORT_C void TCFRegisterMessageHook::Error(TAny* aItf, TInt aError)
+    {
+    Messages::ANode* itf = static_cast<Messages::ANode*>(aItf);
+    TNodeId itfid = itf ? itf->NodeId() : TNodeId::NullCommsId();
+    TCFMessage::TRegisterHookError(itfid,iActivityId,iMessageId,aError).PostTo(TNodeId(ClientId()));
+    }
+
+//class TCFDeregisterMessageHook : public TCFDeregisterHookSignal
+EXPORT_C TCFDeregisterMessageHook::TCFDeregisterMessageHook(const TNodeId& aSenderId, const TNodeSignal::TMessageId& aMessageId):
+    TCFDeregisterHookSignal(Messages::TSignatureBase::TypeId()),
+    iMessageId(aMessageId)
+    {
+    SetClientId(aSenderId());
+    }
+
+//class TTransportHookError : public Messages::TSignatureBase
+TInt TTransportHookError::VerifyDestination(const CommsFW::TCookie& aDestination, CommsFW::MTransportReceiver& aTransport)
+    {
+    //deregister local tag if any
+    TCFDeregisterMessageHook dereg(static_cast<const TNodeId&>(TNodeId(aDestination)),iHookedMessageId);
+    dereg.DeregisterLocalTag(aTransport);
+    return Messages::TSignatureBase::VerifyDestination(aDestination, aTransport);
+    }
+
+//class CCFMessageHooks : public CCFTransportHooks
+void CCFMessageHooks::WalkHooks( const TCFSignalBase& aMessage, const TCookie& aRecipient )
+    {//place to optimise wlak before calling the base class
+    CCFTransportHooks::WalkHooks( aMessage, aRecipient );
+    }
+
+void CCFMessageHooks::RegisterL( const CommsFW::TCFRegisterHookSignal& aMessage )
+    {//place to do some extra stuff for look-up optimisation
+    CCFTransportHooks::RegisterL( aMessage );
+    }
+
+void CCFMessageHooks::Deregister( const CommsFW::TCFDeregisterHookSignal& aMessage )
+    {//place to undo some extra stuff done for look-up optimisation
+    CCFTransportHooks::Deregister( aMessage );
+    }
+
+//class CCFMessageHookEntry : public CCFHookEntry
+EXPORT_C CCFMessageHookEntry::CCFMessageHookEntry( const TNodeSignal::TMessageId& aMessageId, TInt aActivityId, const TNodeId& aNode, const TNodeId& aListener ) :
+    CCFHookEntry(Messages::TSignatureBase::TypeId(),aNode(),aListener()),
+    iMessageId(aMessageId),
+    iActivityId(aActivityId)
+    {
+	LOG(ESockLog::Printf(KESockMessageHook, _L("CCFMessageHookEntry [this=%08x]:\t Registered [aMessagedId=%d] [aActivityId=%d] [aNode=%08x] [aListener=%08x]"),
+	    this, aMessageId.MessageId(), aActivityId, aNode.Printable(), aListener.Printable()));
+    }
+
+EXPORT_C TBool CCFMessageHookEntry::Match(const CommsFW::TCFSignalBase& aMessage, const TCookie& aRecipient)
+    {
+    return CCFHookEntry::Match( aMessage, aRecipient ) && static_cast<const Messages::TSignatureBase&>(aMessage).MessageId() == iMessageId;
+    }
+
+EXPORT_C void CCFMessageHookEntry::Notify(const CommsFW::TCFSignalBase& aMessage) const
+    {
+    __ASSERT_DEBUG(aMessage.IsTypeOf(TNodeSignal::TypeId()), User::Panic(KSpecAssert_ESockSSockstrnsp, 1));
+	TNodeSignal& sig = static_cast<TNodeSignal&>(const_cast<CommsFW::TCFSignalBase&>(aMessage));
+	TInt activityId = sig.ActivityId();
+	sig.SetActivity(iActivityId);
+	CCFHookEntry::Notify(sig);
+	sig.SetActivity(activityId);
+    }
+
+EXPORT_C TBool CCFMessageHookEntry::Match( const TCFDeregisterHookSignal& aReq ) const
+    {
+    return CCFHookEntry::Match( aReq );
+    }
+
+#endif
+
+