datacommsserver/esockserver/inc/SS_PMAN.H
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/inc/SS_PMAN.H	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,272 @@
+// 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:
+//
+
+/**
+ @file
+ @internalComponent 
+*/
+
+#ifndef __SS_PMAN_H__
+#define __SS_PMAN_H__
+
+#include <es_prot.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <es_prot_internal.h>
+#endif
+
+#include <comms-infras/api_ext_msg.h>
+
+#ifdef SYMBIAN_ZERO_COPY_NETWORKING
+#include <comms-infras/commsbufpond.h>
+#endif 
+
+namespace ESock
+{
+class CSocket;
+class CHostResolver;
+class CServiceResolver;
+class CNetDatabase;
+}
+class CSocketServer;
+class CProtocolBase;
+class CMBufManager;
+class CSockSession;
+struct TProtocolDesc;
+class CProtocolRef;
+class CMBufManager;
+class CDeltaTimer;
+class CESockIniData;
+
+  //
+  // Housekeeping structures used internally by the Protocol manager.
+  //
+class CProtocolFamilyBase;
+class CProtocolBase;
+
+typedef TSglQue<CProtocolRef> TProtocolRefList;
+NONSHARABLE_CLASS(CProtocolFamilyRef) : public CBase
+/**
+@internalComponent
+*/
+	{
+#ifdef __FLOG_ACTIVE
+	friend class TProtocolManagerLogger;
+#endif
+public:
+	enum TManagerProtFamilyFlags
+		{
+		EInstalled=0x00000001,
+		};
+	TSglQueLink iLink;
+public:
+	~CProtocolFamilyRef();
+	static CProtocolFamilyRef* GetProtocolFamilyL(TDesC& aName);
+	void LoadL();
+	CProtocolFamilyBase& ProtocolFamilyL(TBool aInstall=ETrue);
+	inline void Close();
+	inline void FamilyClosed();
+private:
+	CProtocolFamilyRef();
+private:
+	TInt iFlags;
+	CProtocolFamilyBase* iProtocolFamily;
+	HBufC* iLibFileName;
+	};
+
+class Nif;
+NONSHARABLE_CLASS(CProtocolRef) : public CBase
+/**
+@internalComponent
+*/
+	{
+friend class Nif;
+public:
+	enum TManagerProtocolFlags
+		{
+		EInited=0x00000001,
+		EStarted=0x00000002,
+		EBound=0x00000004,
+		EThreePlaneCommsBased=0x00000008,
+		};
+	TSglQueLink iLink;
+
+public:
+	~CProtocolRef();
+	TBool Matches(TUint anAddrFamily,TUint aSocketType,TUint aProtocol);
+	static CProtocolRef* GetProtocolL(const TDesC& aName);
+	static CProtocolRef* MakeRefL(const TDesC& aName,CProtocolFamilyRef* aFamily=NULL,TServerProtocolDesc* info=NULL);
+	static CProtocolRef* MakeRefL(const TDesC& aName, TServerProtocolDesc* info);
+	inline void LoadAndBindL();
+	CProtocolBase* Protocol();
+	inline CProtocolFamilyBase* Family();
+	TServerProtocolDesc& Info();
+	inline void ProtocolClosed();
+	inline void Close();
+	inline TPtrC Tag();
+	inline void SetFlag(TUint aFlag){iFlags=aFlag;};
+	inline TUint GetFlag(){return iFlags;};
+
+private:
+	void StartL();
+	void ResolveBindingL();
+	void LoadL(TBool aLoadForBinding);
+	CProtocolRef();
+	void DoBindingL(const CESockIniData& anIniFile);
+	void ProcessBindListL(TPtrC aBindList, const CESockIniData& aIniFile);
+	static void Cleanup(TAny* aFamily);
+	static CProtocolRef* GetProtocolNoCreate(TProtocolRefList* aProtocolList, const TDesC& aTag);
+
+private:
+	TUid iUid;
+	HBufC* iTag;
+	TUint iFlags;
+	TServerProtocolDesc iInfo;
+	CProtocolBase* iProtocol;
+	CProtocolFamilyRef* iFamily;
+	};
+
+class SocketServer;
+class CSocketServExtBase;
+NONSHARABLE_CLASS(CSocketServExtRef) : public CBase
+/**
+@internalComponent
+*/
+	{
+	friend class CSockManData;
+public:
+	CSocketServExtRef();
+	virtual ~CSocketServExtRef();
+	void InstallL(const TDesC& aDllName, const TDesC& aParam);
+	void Remove();
+	void Close();
+private:
+	TDblQueLink iExtLink;
+	RLibrary iLibrary;
+	CSocketServExtBase* iExtension;
+	CAsyncCallBack* iDestructor;
+public:
+	inline CSocketServExtBase* Extension() { return iExtension; }
+	};
+
+/**
+@internalComponent
+*/
+typedef CSocketServExtBase* (*TSocketServExtInstallFn)();
+
+#if !defined (__WINS__)
+#define VERBOSE
+#endif
+
+#if defined (VERBOSE)
+#define VERBOSE_ONLY(x) x
+#else
+#define VERBOSE_ONLY(x)
+#endif
+
+class CPlayer;
+struct TServerProtocolDesc;
+
+namespace ESock
+{
+class CTransportFlowShim;
+}
+
+class CInternalSocketImpl;
+class ProtocolManager
+/**
+@internalComponent
+*/
+	{
+	friend class SocketServer;
+	friend class ESock::CTransportFlowShim;
+	friend class ESock::CSocket;
+	friend class CPlayer;
+
+public:
+	static void LoadProtocolL(TUint anAddrFamily, TUint aSocketType, TUint aProtocol, CPlayer* aPlayer);
+	static void UnLoadProtocolL(TUint anAddrFamily, TUint aSocketType, TUint aProtocol, CPlayer* aPlayer);
+	static ESock::CHostResolver* NewHostResolverL(TUint anAddrFamily, TUint aSocketType, CPlayer* aPlayer, const TSubSessionUniqueId aSubSessionUniqueId);
+	static ESock::CServiceResolver* NewServiceResolverL(TUint anAddrFamily, TUint aSocketType, TUint aProtocolId, CPlayer* aPlayer, const TSubSessionUniqueId aSubSessionUniqueId);
+	static ESock::CNetDatabase* NewNetDatabaseL(TUint anAddrFamily, TUint aSocketType, CPlayer* aPlayer, const TSubSessionUniqueId aSubSessionUniqueId);
+	static TUint NumProtocols(void);
+	static TInt ProtocolInfo(TUint anIndex,TProtocolDesc& aProtocol);
+	static TInt ProtocolInfo(const TDesC& aName,TProtocolDesc& aProtocol);
+	static TInt ProtocolInfo(const TDesC& aName,TServerProtocolDesc& aProtocol);
+	static CProtocolBase* FindAndLoadProtocolL(const TDesC& aName, TProtocolType aType=ENormalProtocol);
+	static CProtocolBase* FindAndLoadProtocolL(TUint aAddrFamily,TUint aSockType,TUint aProtocol);
+	static void TransferSocketL(ESock::CSocket* aSocket, CPlayer* aPlayer);
+	static TBool GetDependency(const TDesC& aTag,TPtrC& aList);
+	static void ProcessIniDataL();
+	static void InitL();
+	static CInternalSocketImpl* NewInternalSocketL ( TAny* aParams, const TDesC& aName );
+	static CInternalSocketImpl* NewInternalSocketL ( TAny* aParams, TUint aAddrFamily, TUint aSockType, TUint aProtocol );
+private:
+	static void ShutDown(void);
+	static CProtocolRef* FindProtocolL(TInt anAddrFamily,TUint aSocketType,TInt aProtocol);
+	static void CleanupProtocol(TAny* aProtocol);
+	static void AddDependencyL(const TDesC& aDependentsList, const TDesC& aModuleToLoad);
+	static void SafeCleanupProtocol(TAny* aProtocolRef);
+	};
+
+class CWorkerThread;
+class SocketServer
+/**
+@internalComponent
+*/
+	{
+public:
+	static void InitL(CWorkerThread* aWorker);
+	static void ShutDown(void);
+	static RHeap* Heap();
+#ifdef SYMBIAN_ZERO_COPY_NETWORKING	
+	static RCommsBufPond GetCommsBufPond();
+#else
+	static CMBufManager* GetMBufManager();
+#endif
+	static CDeltaTimer* GetTimer();
+	static CSocketServer* GetSocketServer();
+	static void NewSession();
+	static void SessionClosing();
+	static TBool IsShuttingDown();
+	static void ShutdownExtensions();
+	static void InstallExtensionL(const TDesC& aDllName, const TDesC& aArgs);
+	static IMPORT_C void __DbgForceLoadMBufManagerL();
+	static IMPORT_C void __DbgForceKillMBufManager();
+	};
+
+#ifdef __MARM__
+//const TInt KTimerGranularity = 100000;
+
+/**
+@internalComponent
+*/
+const TInt KTimerGranularity = 15500;
+#else
+const TInt KTimerGranularity = 80000;
+#endif
+
+#ifdef __FLOG_ACTIVE
+// Dumping out the set of loaded families and protocols aids debugging shutdown hangs
+NONSHARABLE_CLASS(TProtocolManagerLogger)
+	{
+public:
+	static void LogLoadedInfo();
+	};
+#endif
+
+
+#include <ss_pman.inl>
+
+#endif