linklayerprotocols/ethernetnif/IRLAN/INTSOCK.H
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/linklayerprotocols/ethernetnif/IRLAN/INTSOCK.H	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,248 @@
+// 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:
+// Internal Sockets API 
+// Written by Mal September 1997
+// Based on work by AdamG
+// 
+//
+
+/**
+ @file
+ @internalComponent 
+*/
+
+#if !defined(__INTSOCK_H__)
+#define __INTSOCK_H__
+
+#include <e32std.h>
+#include <e32base.h>
+#include <es_prot.h>
+#include <es_sock.h>
+
+/**
+Specifies Internal Max buffer size.
+*/
+const TUint KInternalMaxBufSize=2048;
+
+enum TPanicCode
+{ 
+	EPanic_NotReady,
+	EPanic_InUse,
+	EPanic_StatusRecv,
+	EPanic_StatusComplete
+};
+
+class CInternalSocketTimers;
+/**
+Provides internal socket access direct to a SAP 
+Based on CServProviderBase
+@internalComponent
+*/
+NONSHARABLE_CLASS(CInternalSocket) : public CServProviderBase, public MSocketNotify
+{
+private:
+	enum TInternalSockState
+		{ ENew, EOpen, EConnecting, EConnected, 
+		  EListening, EClosing, EClosed, EFault };
+public:
+	CInternalSocket();
+	static CInternalSocket *NewL(CServProviderBase *aSock,MSocketNotify *aNotify);
+	~CInternalSocket();
+	//CInternalSocket* NewL();
+	TInt OpenL(const TDesC& aProtocolName,MSocketNotify* aNotify);
+
+	// inherited from CServProviderBase 
+	virtual void Start(void);
+	virtual TInt SetLocalName(TSockAddr& aAddr);
+	virtual void LocalName(TSockAddr& anAddr)const;
+	virtual TInt SetRemName(TSockAddr& aAddr);
+	virtual void RemName(TSockAddr& aAddr)const;
+	virtual TInt GetOption(TUint level,TUint name,TDes8& anOption)const;
+	virtual void Ioctl(TUint level,TUint name,TDes8* anOption);
+	virtual void CancelIoctl(TUint aLevel,TUint aName);
+	virtual TInt SetOption(TUint,TUint,const TDesC8&);
+	virtual TUint Write(const TDesC8 &,TUint,TSockAddr *);
+	virtual void GetData(TDes8 &,TUint,TSockAddr *);
+	virtual void ActiveOpen(const class TDesC8 &);
+	virtual void ActiveOpen(void);
+	virtual TInt PassiveOpen(TUint,const TDesC8 &);
+	virtual TInt PassiveOpen(TUint);
+	virtual void Shutdown(enum CServProviderBase::TCloseType,const TDesC8 &);
+	virtual void Shutdown(enum CServProviderBase::TCloseType);
+	virtual void AutoBind(void);
+	
+	TInt Connect(TSockAddr& aAddr);
+	TInt WaitForConnect(TUint aQSize);
+	void Close();
+	TUint Recv(TDes8& aDes,TSockAddr* anAddr,TRequestStatus& aStat,TUint aOptions);
+	void RecvFrom(TDes8& aDes, TSockAddr& aAddr,TUint aFlags,TRequestStatus& aStatus);
+    TUint Write(RMBufChain& aPdu,TUint options,TRequestStatus& aStat,TSockAddr* anAddr);
+	void SendTo(const TDesC8& aDes, const TSockAddr& aAddr,TUint aFlags,TRequestStatus& aStatus);
+	void CancelRecv();
+	void CancelSend();
+	
+	void SetNotify(MSocketNotify* aControl){ iNotify=aControl; };
+	static TInt InternalSocketTimerExpired(TAny *aCIntSock);
+protected:
+	virtual void NewData(TUint aCount);
+	virtual void CanSend();
+	virtual void CanClose(TDelete aDelete=EDelete);
+	virtual void Error(TInt anError,TUint anOperationMask=EErrorAllOperations);
+
+	// Pass the following up to layer above via iNotify 
+	virtual void ConnectComplete();
+    virtual void ConnectComplete(CServProviderBase& aSSP);
+	virtual void Disconnect(void);
+	virtual void IoctlComplete(TDesC8 *aBuf);
+	virtual void ConnectComplete(const TDesC8& aConnectData);
+	virtual void ConnectComplete(CServProviderBase& aSSP,const TDesC8& aConnectData);
+	virtual void Disconnect(TDesC8& aDisconnectData);
+	virtual void CanClose(const TDesC8& aDisconnectData,TDelete aDelete=EDelete);
+	virtual void NoBearer(const TDesC8& aConnectionParams);
+	virtual void Bearer(const TDesC8& aConnectionInfo);
+private:
+	void Panic(TPanicCode aPanic);
+	void DoRecv();
+	void CompleteRecv(TInt aStatus);
+	void DoSend();
+	void CompleteSend(TInt aStatus);
+public:
+/** A pointer to the object which signalled it is ready to StartSending. */
+	CProtocolBase* iProtocol;
+/** A pointer to the object to indicate the server socket. */
+	CServProviderBase* iCServSocket;	
+private:
+	MSocketNotify* iNotify;
+	TInternalSockState iState;
+	CInternalSocketTimers *iTimers;
+	TUint iSockType;
+
+	TUint iSendBufLength;
+	HBufC8* iSendBuffer;
+	TPtr8 iSendBufPtr;
+
+	TUint iFlags;
+	TInt iRecvNotifyCount;
+	const TDesC8* iSendDes;
+	TUint iSendFlags;
+	TSockAddr* iSendAddr;
+	TRequestStatus* iSendStat;
+
+	TDes8* iRecvDes;
+	TUint iRecvFlags;
+	TSockAddr* iRecvAddr;
+	TRequestStatus* iRecvStat;
+};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CInternalHostResolver) : public CBase, public MResolverNotify
+{
+private:
+	enum TInternalHRState
+		{ ENew, EConnected, EDiscovering,
+		  EClosed, EFault };
+public:
+	CInternalHostResolver();
+	~CInternalHostResolver();
+	static CInternalHostResolver* NewL();
+	TInt OpenL(const TDesC& aProtocolName,MResolverNotify *aEngine);
+	// Notifier call back 
+	void QueryComplete(TInt aError);
+	// Need the following to mimic CHostResolvProvdBase 
+	TInt GetByName(TNameRecord& aName);
+	void GetByAddress(TNameRecord& aName);
+	void SetHostName(TDes8& aNameBuf);
+	void GetHostName(TDes8& aNameBuf);
+protected:
+	void SetNotify(MResolverNotify* aControl){ iNotify=aControl; };
+public:
+	CHostResolvProvdBase* iHostResolver;
+	CProtocolBase* iProtocol;
+	/** Set to MResolverNotify ABOVE. */
+	MResolverNotify* iNotify;	
+private:
+	TInternalHRState iState;
+	TBool iBusy;
+};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CInternalNetDB) : public CBase , public MResolverNotify
+{
+private:
+	enum TInternalNetDBState
+		{ ENew, EOpen, EQuery,
+		  EClosed, EFault };
+public:
+	CInternalNetDB();
+	~CInternalNetDB();
+	static CInternalNetDB* NewL();
+	TInt OpenL(const TDesC& aProtocolName,MResolverNotify *aEngine);
+
+	// Notifier call back 
+	void QueryComplete(TInt aError);
+	// Need the following to mimic CNetDBProvdBase 
+	TInt Query(TDes8& aBuffer);
+	void Add(TDes8& aBuffer);
+	void Remove(TDes8& aBuffer);
+protected:
+	void SetNotify(MResolverNotify* aControl){ iNotify=aControl; };
+public:
+	CProtocolBase* iProtocol;
+	CNetDBProvdBase* iNetDatabase;
+	/** Set to MResolverNotify ABOVE. */
+	MResolverNotify* iNotify;	
+private:
+	TInternalNetDBState iState;
+	TBool iBusy;
+};
+
+/**
+@internalComponent
+*/
+NONSHARABLE_CLASS(CInternalSocketTimers) : public CBase
+{
+public:
+	friend class CInternalSocket;
+	virtual ~CInternalSocketTimers();
+	static CInternalSocketTimers *NewL(CInternalSocket *aIntSock);
+	void StartInternalSocketTimer(TCallBack aCallBack,TInt aTimeout);
+	void StopInternalSocketTimer();
+	void DoInternalSocketTimerExpired();
+private:
+	CInternalSocketTimers(CInternalSocket *aIntSock);
+private:
+	CInternalSocket *iInternalSocket;
+	TDeltaTimerEntry iInternalSocketTimer;
+	TDeltaTimerEntry *iInternalSocketTimerH;
+};
+
+// Added back in as the new stack does not contain sock.h
+const TUint KSoConnectPending = 0x0001;	 //< Connect request pending
+const TUint KSoIoctlPending = 0x0002; //< Ioctl request pending
+const TUint KSoRecvPending = 0x0004; //< Recv/RecvFrom request pending
+const TUint KSoSendPending = 0x0008; //< Send/SendTo request pending
+const TUint KSoConnectionless = 0x0020;	 //< Does not need to Connect
+const TUint KSoCantRecvMore = 0x0100; //< Recvd EOF indication from peer - used with RecvNotifyCount
+const TUint KSoCantSendMore = 0x0200; //< Send EOF idication to peer
+const TUint KSoSendFlowOff = 0x0400; //< Send is flowed off
+const TUint KSoUseCanSend = 0x0800;	//< Use CanSend()
+const TUint KSoGracefulClose = 0x1000;	//< Use Graceful close
+
+
+#endif
+