datacommsserver/esockserver/inc/ss_dispatchers.h
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/inc/ss_dispatchers.h	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,231 @@
+// 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
+ @internalTechnology
+*/
+
+#ifndef SS_DISPATCHERS_H
+#define SS_DISPATCHERS_H
+
+#include <elements/nm_node.h>
+#include <comms-infras/ss_nodeinterfaces.h>
+#include <comms-infras/ss_common.h>
+
+namespace ESock
+{
+
+//in-process,in/cross-thread node extension message
+struct TCFItfExt
+    {
+protected:
+	explicit TCFItfExt()
+		{
+		}
+
+	IMPORT_C void ForwardMessageL(const Messages::TRuntimeCtxId& aSender,
+	                              Messages::TSignalBase& aMessage,
+	                              Messages::ANode& aNode,
+	                              const Messages::TClientType& aClientType,
+	                              const Messages::TClientType& aClientTypeExclude = Messages::TClientType(0, Messages::TClientType::ELeaving));
+    IMPORT_C TAny* FetchInterfaceL(Messages::ANode& aNode, TInt aInterface);
+	IMPORT_C TAny* FetchInterfaceOrForwardMsgL(const Messages::TRuntimeCtxId& aSender,
+	                                           Messages::TSignalBase& aMessage,
+	                                           Messages::ANode& aNode, TInt aInterface,
+	                                           const Messages::TClientType& aClientType,
+	                                           const Messages::TClientType& aClientTypeExclude = Messages::TClientType(0, Messages::TClientType::ELeaving));
+	IMPORT_C NetInterfaces::TInterfaceControl* FetchInterfaceControlOrForwardMsgL(const Messages::TRuntimeCtxId& aSender,
+	                                                                              Messages::TSignalBase& aMessage,
+	                                                                              Messages::ANode& aNode,
+																				  TInt aInterface,
+									  		   		  							  const Messages::TClientType& aClientType,
+									  		   		  							  const Messages::TClientType& aClientTypeExclude = Messages::TClientType(0, Messages::TClientType::ELeaving));
+    };
+
+template <TUint32 CLIENT_TYPE, TUint32 CLIENT_FLAGS = 0, TUint32 CLIENT_TYPE_EXCLUDE = 0, TUint32 CLIENT_FLAGS_EXCLUDE = Messages::TClientType::ELeaving>
+struct TCFClientItfExt : protected TCFItfExt
+    {
+protected:
+	explicit TCFClientItfExt()
+	:	TCFItfExt()
+		{
+		}
+
+	inline void ForwardMessageL(const Messages::TRuntimeCtxId& aSender, Messages::TSignalBase& aMessage, Messages::ANode& aNode)
+		{
+		TCFItfExt::ForwardMessageL(aSender, aMessage, aNode, Messages::TClientType(CLIENT_TYPE,CLIENT_FLAGS), Messages::TClientType(CLIENT_TYPE_EXCLUDE,CLIENT_FLAGS_EXCLUDE));
+		}
+
+	inline TAny* FetchInterfaceOrForwardMsgL(const Messages::TRuntimeCtxId& aSender, Messages::TSignalBase& aMessage, Messages::ANode& aNode, TInt aInterface)
+		{
+		return TCFItfExt::FetchInterfaceOrForwardMsgL(aSender, aMessage, aNode, aInterface, Messages::TClientType(CLIENT_TYPE,CLIENT_FLAGS), Messages::TClientType(CLIENT_TYPE_EXCLUDE,CLIENT_FLAGS_EXCLUDE));
+		}
+
+	inline NetInterfaces::TInterfaceControl* FetchInterfaceControlOrForwardMsgL(const Messages::TRuntimeCtxId& aSender, Messages::TSignalBase& aMessage, Messages::ANode& aNode, TInt aInterface)
+		{
+		return TCFItfExt::FetchInterfaceControlOrForwardMsgL(aSender, aMessage, aNode, aInterface, Messages::TClientType(CLIENT_TYPE,CLIENT_FLAGS), Messages::TClientType(CLIENT_TYPE_EXCLUDE,CLIENT_FLAGS_EXCLUDE));
+		}
+    };
+
+//TCFClientItfExt and its hierarchy is supposed to have 0 lenght (when merged into a hierarchy that is).
+//There are several functions taking (for example) TCFSigRMessage2Ext as Messages::TSignalBase
+//which explicitly work with this assumtion. If considering adding data members to TCFClientItfExt
+//hierarchy, find and fix all of these functions.
+class TCFClientItfExtSizeTest : public Messages::TSignalBase, public TCFItfExt {};
+__ASSERT_COMPILE(sizeof(TCFClientItfExtSizeTest)==sizeof(Messages::TSignalBase));
+
+/**
+	Template to assemble a function dispatching message suitable for use as a MESSAGE
+	template parameter of the TCFMessageDispatcher template.
+*/
+template <TInt INTERFACE_ID, class INTERFACE, typename PARAM_STRUCT,
+          TUint32 CLIENT_TYPE, TUint32 CLIENT_FLAGS = 0, TUint32 CLIENT_TYPE_EXCLUDE = 0, TUint32 CLIENT_FLAGS_EXCLUDE = 0>
+struct TCFFunctionDispatcher : public TCFClientItfExt<CLIENT_TYPE, CLIENT_FLAGS, CLIENT_TYPE_EXCLUDE, CLIENT_FLAGS_EXCLUDE>
+    {
+protected:
+    typedef void (INTERFACE::*TFunction)(PARAM_STRUCT&);
+
+public:
+    explicit TCFFunctionDispatcher()
+    :	TCFClientItfExt<CLIENT_TYPE, CLIENT_FLAGS, CLIENT_TYPE_EXCLUDE, CLIENT_FLAGS_EXCLUDE>()
+        {
+        }
+
+	explicit TCFFunctionDispatcher(TFunction aFunction, const PARAM_STRUCT& aParams)
+	:	TCFClientItfExt<CLIENT_TYPE, CLIENT_FLAGS, CLIENT_TYPE_EXCLUDE, CLIENT_FLAGS_EXCLUDE>(),
+		iParam(aParams),
+		iFunction(aFunction)
+		{
+		}
+
+protected:
+	void DispatchL(Messages::TSignalBase& aThisDispatcher, Messages::ANode* aItf, TPtrC8& /* aParams */)
+        {
+        INTERFACE* itf = reinterpret_cast<INTERFACE*>(TCFClientItfExt<CLIENT_TYPE, CLIENT_FLAGS, CLIENT_TYPE_EXCLUDE, CLIENT_FLAGS_EXCLUDE>::FetchInterfaceOrForwardMsgL(aThisDispatcher, *aItf, INTERFACE_ID));
+        if (itf)
+            {
+            (itf->*iFunction)(iParam);
+            }
+        }
+    PARAM_STRUCT iParam;
+    TFunction iFunction;
+    };
+
+/* Example of using TCFFunctionDispatcher in combination with TCFMessageDispatcher
+Interface Id must be in api_ext_list.h enum TInt.
+
+Let's assume it's EApiExtSomeInterface
+
+*.h file would contain
+
+// The extension interface declaration (functions must follow the signature pattern given by TCFFunctionDispatcher)
+class MSomeExtensionInterface
+    {
+    public:
+    virtual Fn1(TSomeParametersNotMemoryAllocated& aParam) = 0;
+    virtual Fn2(TSomeOtherParametersNotMemoryAllocated& aParam) = 0;
+    };
+
+// The individual structures
+struct TSomeParametersNotMemoryAllocated
+    {
+    TUint iInt;
+    TBuf8<20> iBuf;
+    };
+
+struct TSomeOtherParametersNotMemoryAllocated
+    {
+    };
+
+// Declaration of dispatchers
+typedef TCFFunctionDispatcher<EApiExtSomeInterface, MSomeExtensionInterface, TSomeParametersNotMemoryAllocated,
+                        RNodeInterface::ECtrl> TFDSomeParametersNotMemoryAllocated;
+
+typedef TCFMessageDispatcher<ESomeMessageId, TFDSomeParametersNotMemoryAllocated, Messages::ANode> TMDSomeParametersNotMemoryAllocated;
+
+// There is a way how to get ESomeMessageId in case it needs to be unique amongst other messages
+
+****.cpp file would contain
+
+// The interface Uid
+const TInt KSomeExtensionInterfaceUid = 0xDEADBEEF
+
+// The interface messages implementation table
+const TImplementationProxy SomeParametersImplementationTable[] =
+	{
+	MVIP_CTR_ENTRY(ESomeParam1, TMDSomeParametersNotMemoryAllocated),
+	MVIP_CTR_ENTRY(ESomeParam2, TMDSomeOtherParametersNotMemoryAllocated),
+	};
+
+// Constructors
+DEFINE_MVIP_CTR(TMDSomeParametersNotMemoryAllocated);
+DEFINE_MVIP_CTR(TMDSomeOtherParametersNotMemoryAllocated);
+
+// Attribute table(s)
+START_ATTRIBUTE_TABLE(TMDSomeParametersNotMemoryAllocated, KSomeExtensionInterfaceUid, ESomeParam1)
+	REGISTER_ATTRIBUTE(TTMDSomeParametersNotMemoryAllocated, iInt, TMetaNumber)
+	REGISTER_ATTRIBUTE(TMDSomeParametersNotMemoryAllocated, iBuf, TMeta<TBuf8<20>>)
+END_ATTRIBUTE_TABLE_BASE(Messages::TSignalBase, 0)
+
+START_ATTRIBUTE_TABLE(TMDSomeOtherParametersNotMemoryAllocated, KSomeExtensionInterfaceUid, ESomeParam2)
+END_ATTRIBUTE_TABLE_BASE(Messages::TSignalBase, 0)
+
+// The registration functions
+void TSomeExtInterfaceMessageTables::RegisterL()
+	{
+	TlsGlobals().RegisterInterfaceL(TUid::Uid(KSomeExtensionInterfaceUid), sizeof(SomeParametersImplementationTable) / sizeof(SignatureImplementationTable[0]), SomeParametersImplementationTable);
+	}
+
+void TSomeExtInterfaceMessageTables::DeRegister()
+	{
+	TlsGlobals().DeregisterInterface(TUid::Uid(KSomeExtensionInterfaceUid));
+	}
+
+**/
+
+//most common signature for messages originating on user side
+class TCFSigRMessage2Ext : public Messages::TSignalBase, public TCFClientItfExt<TCFClientType::ECtrl>
+    {
+protected:
+    TCFSigRMessage2Ext(const RMessage2& aMessage)
+    :   TCFClientItfExt<TCFClientType::ECtrl>(),
+        iMessage(aMessage)
+            {
+            }
+
+    TCFSigRMessage2Ext()
+    	{
+    	}
+
+protected:
+	IMPORT_C virtual void Error(const Messages::TRuntimeCtxId& aSender, const Messages::TRuntimeCtxId& aRecipient, TInt aError);
+
+protected:
+    RMessage2 iMessage;
+
+public:
+    EXPORT_DATA_VTABLE_AND_FN
+    };
+
+} //namespace ESock
+
+#endif
+// SS_DISPATCHERS_H
+
+
+
+
+