datacommsserver/esockserver/inc/SS_GLOB.H
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/inc/SS_GLOB.H	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,182 @@
+// Copyright (c) 1997-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:
+// Socket server global (TLS) data
+// Structure of the pseudo statics stored in Dll local storage.
+// 
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#ifndef __SS_GLOB_H__
+#define __SS_GLOB_H__
+
+#include <comms-infras/ss_common.h>
+#include <elements/cftransport.h> // TCookie
+#include <ss_pman.h>
+#include <comms-infras/ss_factorycontainermap.h>
+#include <comms-infras/cfperfmetrics.h>
+#include <comms-infras/ss_apiext_register.h>
+
+class CWorkerThread;
+class CPlayer;
+
+class CSocketServer;
+class CMBufManager;
+
+namespace ESock
+{
+
+class CCommsFactoryBase;
+class CConnectionFactoryContainer;
+class CSubConnectionFactoryContainer;
+class CSubConnectionFlowFactoryContainer;
+class CProtocolFamilyFactoryContainer;
+class CProtocolIntfFactoryContainer;
+class CConnectionServer;
+
+enum EFactoryType
+	{
+	EProtocolFamilyFactory = 1,
+	ESubConnectionFactory
+	};
+
+class CMetaConnectionFactoryContainer;
+class CTierManagerFactoryContainer;
+class CCFFactoryContainerBroker;
+}
+
+class CSockManData : public CBase
+/**
+@internalTechnology
+*/
+	{
+public:
+	// Some accessor functions to try to reduce the coupling
+	IMPORT_C CPlayer* SelfPlayer();
+	const CESockIniData* IniData();
+	IMPORT_C CWorkerThread* SelfWorker() const;
+
+#ifdef ESOCK_HOME_THREAD_CHECK_ENABLED
+	void AssertOwnThread() const;
+#endif
+
+#ifdef _DEBUG
+	void LogActiveProtocols();
+#endif
+
+public:
+//TODO Move some of this stuff to Den::Globals?
+	CWorkerThread* iWorkerThread;			//
+	CSocketServer* iSocketServer;			//< Back pointer to the CServer (for shutdown)
+	TProtocolRefList* iProtocols;			//< List of all socket types available
+	TSglQue<CProtocolFamilyRef>* iProtocolFamilies;	//< List of all protocol families used
+	CESockIniData* iEskData;
+	TUint iNumProtocols;					//< Count of protocols.
+#ifdef SYMBIAN_ZERO_COPY_NETWORKING	
+	RCommsBufPond iCommsBufPond;			//< The Comms buf pond
+#else
+	 CMBufManager* iMBufManager;             //< The MBuf manager
+#endif
+	CDeltaTimer* iTimer;					//< The global delta timer.
+	TInt iNumFamilies;
+	TBool iShutdownGracefully;              //< Flag that shutdown should be done when there's no more sessions or loaded families.
+	HBufC *iDeps;							//< List of protocols requiring other protocols to be loaded first
+	Messages::CGlobals& iTransportGlobals;
+
+public:
+	IMPORT_C static ESock::CCommsFactoryBase* InstallFactoryL( ESock::EFactoryType aFactoryType, const TDesC8& aName, TUid aFactoryUid );
+	IMPORT_C Messages::TNodeId GetPlaneFC(const Den::TPlayerRole& aPlane);
+
+	TBool ShutdownGracefully();
+	void InstallFactoryContainersL();
+	void UninstallFactoryContainers();
+
+	ESock::CTierManagerFactoryContainer* iTierManagerFactories;
+	ESock::CMetaConnectionFactoryContainer* iMetaConnectionFactories;
+	ESock::CConnectionFactoryContainer* iConnectionFactories; // Connection Provider factories
+	ESock::CSubConnectionFactoryContainer* iSubConnectionFactories; //< Sub-Connection Provider factories
+	ESock::CSubConnectionFlowFactoryContainer* iSubConnectionFlowFactories; //< Sub-Connection Flow factories
+	ESock::CProtocolFamilyFactoryContainer* iProtocolFamilyFactories; //< ProtocolFamily Provider factories
+	ESock::CProtocolIntfFactoryContainer* iProtocolIntfFactories;
+
+	ESock::RPlaneFCMap iFCMap;
+
+	//Register of api extensions opened in this thread.
+	//This register does not belong with the interfaces because their lifetime is implementation (or host) specific
+	//This register also does not belong with the sessions, because they can disappear at any time (plus it would
+	//not be possible to access the count of opened interfaces)
+	ESock::TCommsApiExtRegister iCommsApiExtRegister;
+
+	Messages::TNodeId iCommsFactoryContainerBroker;
+	ESock::CCFFactoryContainerBroker* iCommsFactoryContainerBrokerSingleton;
+
+	void AddFactoryContainerObjectBrokerClient(
+		const Messages::TNodeId& aNodeId,
+		const TCFPlayerRole& aType);
+
+#ifdef SYMBIAN_NETWORKING_PERFMETRICS
+	void IncludePerformanceData(TInt aDeltaClientRxBytes, TInt aDeltaClientRxBuffBytes, TInt aDeltaClientTxBytes);
+private:
+	static TBool AddToPerfLog(TAny* aSelf, TDes8& aBuffer, TDes8Overflow* aOverflowHandler);
+
+	struct TXferStats
+		{
+		enum
+			{
+			KNumBuckets = 6 // power series from 128 - >65536
+			};
+		// No ctor; relying on embedding object to zero fill RAM
+		void AccumulateXfer(TUint aValue);
+
+		TUint iBuckets[KNumBuckets];
+		TUint iTotal;
+		TUint iCount;
+		};
+	TXferStats iRxStats;
+	TXferStats iRxBuffStats;
+	TXferStats iTxStats;
+public:
+#endif
+
+	/** List of socket server extensions */
+	TDblQue<CSocketServExtRef> iExtensions;
+public:
+	static CSockManData* NewL(Messages::CGlobals& aGlobals, CWorkerThread* aWorker);
+	~CSockManData();
+private:
+	CSockManData(Messages::CGlobals& aGlobals, CWorkerThread* aWorker);
+	void ConstructL();
+	};
+
+class SockManGlobals
+/**
+@internalTechnology
+*/
+	{
+public:
+	static IMPORT_C CSockManData* Get();
+	static void Set(CSockManData * aGlobals);	//lint -sem(SockManGlobals::Set, custodial(1))
+	};
+
+/** Test that the current thread is the "home thread" */
+#ifdef ESOCK_HOME_THREAD_CHECK_ENABLED
+#define ASSERT_HOME_THREAD SockManGlobals::Get()->AssertOwnThread();
+#else
+#define ASSERT_HOME_THREAD
+#endif
+
+#endif