datacommsserver/esockserver/inc/ss_thread.h
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/inc/ss_thread.h	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,185 @@
+// Copyright (c) 2004-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
+*/
+
+#if !defined(__SS_THREAD_H__)
+#define __SS_THREAD_H__
+
+#include <elements/sd_thread.h>
+
+#include <es_sock.h>
+#include <comms-infras/ss_common.h>
+#include <comms-infras/ss_threadtransport.h>
+#include <comms-infras/api_ext_msg.h>
+#include <ss_fact.h>
+
+class CSockManData;
+class CSockManData;
+class CPlayer;
+class CPitBoss;
+class CSockSession;
+
+namespace Den
+	{
+	class TWorkerTransportMsg;
+	}
+
+NONSHARABLE_CLASS(TCFWorkerThreadPublicInfo) : public Den::TWorkerThreadPublicInfo
+	{
+public:
+    enum TType
+        {
+        //see Den::TWorkerThreadPublicInfo
+		EBtPlayerThread = 2,	//< BT Group Player
+		EIrPlayerThread = 3,	//< IR Group Player
+		ESmsWapPlayerThread	= 4,//< SMS + WAP Group Player
+		EIpPlayerThread = 5		//< IP Group Player
+		};
+	};
+
+/**
+Granularity and default number of values in the list of EskMasks.
+@internalComponent
+*/
+const TInt KEskMaskListGranularity=2;
+
+NONSHARABLE_CLASS(CWorkerThread) : public Den::CCommonWorkerThread
+/**
+@internalComponent
+*/
+	{
+public:
+	static CWorkerThread* NewL(CommsFW::TCFModuleInfo* aModuleInfo);
+	~CWorkerThread();
+
+	const CSockManData* SockManGlobals() const
+		{
+		return iSockManGlobals;
+		}
+
+	CSockManData* SockManGlobals()
+		{
+		return iSockManGlobals;
+		}
+
+	CPlayer* Player() const;
+	CPitBoss& PitBoss() const;
+	Den::CCommonWorkerDealer* WorkerDealer() const;
+
+	Den::CCommonPitBoss* DoCreatePitBossL(Den::CCommonWorkerThread* aWorkerThread);
+	Den::CCommonPlayer* DoCreatePlayerL(Den::CCommonWorkerThread* aWorkerThread, Den::TPlayerRole aPlayerRole);
+	Den::CCommonDealer* DoCreateDealerL(Den::CCommonWorkerThread* aWorkerThread, Den::TPlayerRole aPlayerRole);
+
+	void CFBindMessageReceived(const CommsFW::TCFBindMsg& aMsg);
+	void CFMessageForward(const CommsFW::TCFForwardMsg& aMessage);
+
+	// From MLegacyMessageReciever
+	TBool DoDispatchL(const CommsFW::TCFMessage& aMessage, CommsFW::TWorkerId aSenderId);
+	void OnDispatchLeave(const CommsFW::TCFMessage& aMessage, CommsFW::TWorkerId aSenderId, TInt aError);
+	// For external use
+	IMPORT_C static TInt CookieForProtocol(TUint aAddrFamily, TUint aSockType, TUint aProtocol, Messages::TRuntimeCtxId& aCookie);
+	IMPORT_C static TInt CookieForProtocolByName(const TProtocolName& aName, Messages::TRuntimeCtxId& aCookie);
+	IMPORT_C static TBool ResolveWorkerNameToId(const TDesC8& aWorkerName, CommsFW::TWorkerId& aWorkerId);
+	IMPORT_C static TInt CookieForWorkerId(CommsFW::TWorkerId aWorkerId, Messages::TRuntimeCtxId& aCookie);
+	IMPORT_C static TInt CurrentWorkerId(CommsFW::TWorkerId& aWorkerId);
+
+	/**
+	This is the main thread function used by the RootServer when creating a new ESock thread.
+	The RootServer will know the DLL ordinal for it, as specified in the .CMI file, and this is where
+	an ESock instance starts and ends operation (unless it PANICs).
+	@param aArg Will be the module info structure from the RootServer.
+	@see CommsFW::TCFModuleInfo
+	*/
+	IMPORT_C static TInt ThreadEntrypoint(TAny* aArg);
+
+protected:
+	void ConstructL(CommsFW::TCFModuleInfo* aModuleInfo);
+	CWorkerThread();
+	void CreateTransportUserL(TTransportUser& aTemplateUser);
+	void DoProcessWorkerIntroductionL(const Den::TWorkerIntroductionMsg& aMessage);
+	void DoFillIntroMessage(CommsFW::TWorkerId aPeerId, Den::TWorkerIntroductionMsg& aIntroMsg);
+	void DoCompleteUnbinding(CommsFW::TWorkerId aWorker);
+	void DoDeterminePlayerRoleL(HBufC8* aIniData, Den::TPlayerRole &aPlayerRole);
+	void DoSetShuttingDown();
+	void DoPostMortemCleanup();
+	void DoSendOtherIntroductionMessagesL(const CommsFW::TWorkerId& aPeerId);
+
+private:
+	void MaybeIncorporateFCL(const Den::TPlayerRole& aPlane, const Messages::TNodeId& aPeerId);
+	void ProcessMatchingEskFilesL(const CommsFW::COwnEntryList* aEskFiles);
+	void ProcessIniDataL();
+	TInt TransportMessageReceived(const Den::TWorkerTransportMsg& aMessage, TRequestWrapper& aRequestWrapper, CommsFW::TWorkerId aWorkerId);
+
+	void SendObjectBrokerIntroductionMessage(const CommsFW::TWorkerId& aPeerId);
+
+private:
+	CSockManData* iSockManGlobals;					//< Cache pointer to global variables to avoid TLS lookups
+
+	enum
+		{
+		/** Max length of the EskMask value */
+		KMaxEskMaskLength = 16,
+		/** Max number of optional EskMasks, e.g. EskMask0, EskMask1, etc... */
+		KEskMaskLabelMax = 8,
+		/** Max length of label searched for, e.g. length of "EskMask0" */
+		KEskMaskLabelLength
+		};
+
+	/** Buffer type holding the ESK mask defined in the .CMI files, e.g. "IP.*.ESK". */
+	typedef TBuf<KMaxEskMaskLength> TEskMask;
+
+	/**
+	Array of ESK masks as defined in the .CMI file loading this instance of ESock.
+	The Player will load all .ESK files matching these masks.
+	*/
+	RArray<TEskMask> iEskMaskList;
+
+	/**
+	A holder of plug-ins capable of consuming transport messages not internal to ESock and
+	some methods to manage them.
+	*/
+	class RTransportUsers : public RArray<TTransportUser>
+		{
+	public:
+		void Shutdown(TBool aAlreadyDead);
+		void NotifyPeerDeath(CommsFW::TWorkerId aPeer);
+		};
+
+	/**
+	The array of transport users for this instance of ESock. Will be populated when
+	the appropriate ECOM plug-ins are loaded on demand (as messages with unknown message ID arrives
+    and causes the appropriate ECOM plugins to be loaded and inserted).
+	@see TTransportUser
+	*/
+	RTransportUsers iTransportUsers;
+
+//Keep conditional data members at the end, even if this class is not supposed to be derived from
+#ifdef ESOCK_HOME_THREAD_CHECK_ENABLED
+public:
+	TThreadId OwnThread() const
+		{
+		return iOwnThread;
+		}
+private:
+	TThreadId iOwnThread;
+#endif
+	};
+
+#endif	// __SS_THREAD_H__
+