diff -r 000000000000 -r dfb7c4ff071f datacommsserver/esockserver/inc/ss_thread.h --- /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 + +#include +#include +#include +#include +#include + +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 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 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 + { + 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__ +