--- /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
+
+
+
+
+