datacommsserver/esockserver/test/protocols/ipc/IPC_MAIN.H
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/test/protocols/ipc/IPC_MAIN.H	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,187 @@
+// 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:
+//
+
+#if !defined(__IPC_MAIN_H__)
+#define __IPC_MAIN_H__
+
+#include <es_sock.h>
+#include <es_prot.h>
+#include <e32base_private.h>
+
+class CIpcProtocolFamily: public CProtocolFamilyBase
+/**
+@internalComponent
+*/
+	{
+private:
+	CIpcProtocolFamily();	
+public:
+	static CIpcProtocolFamily * NewL();
+	TInt Install();
+	TInt Remove();
+	CProtocolBase * NewProtocolL(TUint aSockType,TUint aProtocol);
+	TUint ProtocolList(TServerProtocolDesc *& aProtocolList);
+	};
+
+class CIpcProvdBase;
+class CIpcProtocolHolder : public CBase
+/**
+@internalComponent
+*/
+	{
+friend class CIpcProtocol;
+private:
+	CIpcProtocolHolder();
+public:
+	static CIpcProtocolHolder* NewL();
+// Protocol internal functions.
+	void SocketRemoved(TInt aPort);
+	TInt GetNextFreePort();
+	TInt CheckAndAllocatePortNumber(TInt aPort);
+	void Add(CIpcProvdBase* aSAP);
+	CIpcProvdBase* FindPeerForConnection(TInt aPort);
+	~CIpcProtocolHolder();
+private:
+	TDblQue<CIpcProvdBase> iSAPs;
+	TInt iNumSockets;
+	CBitMapAllocator* iPortNumbers;
+	};
+
+class CIpcProtocol: public CProtocolBase
+/**
+@internalComponent
+*/
+	{
+public:
+	virtual ~CIpcProtocol();
+	static CIpcProtocol *NewL(TInt aProtocol);
+
+// Calls from the socket server which we implement
+	CServProviderBase *NewSAPL(TUint aProtocol);
+	void InitL(TDesC& aTag);
+	void StartL(void);
+	TBool CanCreateSockets();
+	void Identify(TServerProtocolDesc *)const;
+
+// Calls from the socket server which we don't implement
+	virtual CHostResolvProvdBase *NewHostResolverL();
+	virtual CServiceResolvProvdBase *NewServiceResolverL();
+	virtual CNetDBProvdBase* NewNetDatabaseL();
+
+// Calls from the socket server and other protocols which we just panic
+	void BindL(CProtocolBase *aProtocol, TUint anId);
+	virtual void BindToL(CProtocolBase *protocol);
+	TInt Send(RMBufChain &,CProtocolBase* aSourceProtocol);
+	void Process(RMBufChain &,CProtocolBase* aSourceProtocol);
+	TInt Send(TDes8 &, TSockAddr *to,TSockAddr *from,CProtocolBase* aSourceProtocol);
+	void Process(TDes8 & ,TSockAddr *from,TSockAddr *to,CProtocolBase* aSourceProtocol);
+	TInt GetOption(TUint level,TUint name,TDes8 &anOption,CProtocolBase* aSourceProtocol);
+	TInt SetOption(TUint level,TUint name,const TDesC8& option,CProtocolBase* aSourceProtocol);
+	void Error(TInt anError,CProtocolBase* aSourceProtocol);
+private:
+	CIpcProtocol(TInt aProtocol);
+private:
+	TInt iProtocol;
+	CIpcProtocolHolder* iStreamProtocolSAPs;
+	};
+
+class CIpcProvdBase : public CServProviderBase
+/**
+@internalComponent
+*/
+	{
+friend class CIpcProtocolHolder;
+public:
+	enum TIpcProvdState {ECreated=0,EConnected,EWaitingConnect,EDisconnected};
+	virtual void RemName(TSockAddr &anAddr)const;
+	virtual void LocalName(TSockAddr &anAddr)const;
+	virtual TInt SetLocalName(TSockAddr &anAddr);
+	virtual TInt SetRemName(TSockAddr& anAddr);
+	virtual TInt GetOption(TUint level,TUint name,TDes8 &anOption)const;
+	virtual TInt SetOption(TUint level,TUint name,const TDesC8 &anOption);
+	virtual void AutoBind( void );
+	virtual void Ioctl(TUint level,TUint name,TDes8 *anOption);
+	virtual void CancelIoctl(TUint aLevel,TUint aName);
+	virtual TInt PassiveOpen(TUint aQue,const TDesC8 &aConnectionData);
+	virtual void Shutdown(TCloseType option,const TDesC8 &aDisconnectData);
+	virtual void ActiveOpen(const TDesC8 &aConnectionData);
+	virtual ~CIpcProvdBase();
+	virtual void Start();
+	virtual void ActiveOpen(void);
+	virtual void Shutdown(TCloseType option);
+	virtual TInt PassiveOpen(TUint aQue);
+	virtual void Disconnect();
+	void Connected(CIpcProvdBase& aSocket);
+// Pure virtual
+	virtual CIpcProvdBase* GetCloneSocket()=0;
+	virtual void NewData(TInt aLen)=0;
+	virtual void CanSend()=0;
+protected:
+	CIpcProvdBase(CIpcProtocolHolder* aProtocol);
+protected:
+	TIpcProvdState iState;
+	CIpcProtocolHolder* iProtocol;
+	TInt iLocalAddr;
+	TInt iRemoteAddr;
+	CIpcProvdBase* iConnection;
+public:
+	TDblQueLink iLink;
+	};
+
+class CIpcStreamProvd : public CIpcProvdBase
+/**
+@internalComponent
+*/
+	{
+public:
+	void NewData(TInt aLen);
+	void CanSend();
+	virtual TUint Write(const TDesC8& aDesc,TUint options, TSockAddr* anAddr=NULL);
+	virtual void GetData(TDes8 &aDesc,TUint options,TSockAddr *anAddr=NULL);
+	static CIpcStreamProvd* NewL(CIpcProtocolHolder* aProtocol);
+	virtual CIpcProvdBase* GetCloneSocket();
+private:
+	CIpcStreamProvd(CIpcProtocolHolder* aProtocol);
+	CCirBuffer iBuffer;
+	};
+
+/**
+@internalComponent
+*/
+enum TIPCProtPanic
+	{
+	ECantBind,
+	ECantBindTo,
+	ESendCallCantBind,
+	EProcessCallCantBind,
+	EErrorUpCallCantBind,
+	ESetOptionCallCantBind,
+	EGetOptionCallCantBind,
+	ECantCreateNetDatabase,
+	ECantCreateServiceResolver,
+	ECantCreateHostResolver,
+	EBadWriteCall,
+	EBadGetDataCall,
+	EReadGetTooMuch,
+	ECloseWithoutDeleteingAllSockets,
+	EBMABroken
+	};
+
+/**
+@internalComponent
+*/
+void Panic(TIPCProtPanic aPanic);
+
+#endif