--- /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