genericopenlibs/cstdlib/INC/FDESC.H
changeset 0 e4d67989cc36
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/genericopenlibs/cstdlib/INC/FDESC.H	Tue Feb 02 02:01:42 2010 +0200
@@ -0,0 +1,413 @@
+// 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:
+// Abstraction representing a UNIX file descriptor
+// CFileDescBase maintains the simple semantics of
+// Dup() and Close(), so the final Close() will
+// delete the object and hence call the destructor.
+// 
+//
+
+#ifndef _FDESC_H
+#define _FDESC_H
+
+#include <e32std.h>
+#include <e32cons.h>
+#include <f32file.h>
+#include <es_sock.h>
+#include <c32comm.h>
+
+
+#include <stddef.h>
+#include <redircli.h>
+#include <redircliinternal.h>
+
+// Queuing support for asynchronous requests
+//
+class CPosixRequest;
+class TPosixRequestQueue : public TSglQue<CPosixRequest>
+/**
+@internalComponent
+*/
+	{
+public:
+	inline TPosixRequestQueue();
+	};
+
+//  The base class for all flavours of FileDescriptor
+//
+class CSerialTimer;
+class CPosixRequest;
+class CSocketDesc;
+NONSHARABLE_CLASS(CFileDescBase) : public CBase
+/**
+@internalComponent
+*/
+	{
+public:
+
+	static CFileDescBase* Open(RSessionBase& aSession, const wchar_t* name, int mode, int perms, TInt& err);
+	static CFileDescBase* Socket(RSocketServ& aSs, int family, int style, int protocol, TInt& err);
+
+	virtual void Read(TDes8& aDesc, TRequestStatus& aStatus);
+	virtual TInt ReadCompletion(TDes8& aDesc, TInt aStatus);
+	virtual void ReadCancel();
+
+	virtual void Write(TDes8& aDesc, TRequestStatus& aStatus);
+	virtual TInt WriteCompletion(TDes8& aDesc, TInt aStatus);
+	virtual void WriteCancel();
+
+	virtual void Ioctl(int aCmd, void* aParam, TRequestStatus& aStatus);
+	virtual TInt IoctlCompletion(int aCmd, void* aParam, TInt aStatus);
+	virtual void IoctlCancel();
+
+	virtual void RecvFrom(TDes8& aDesc, TSockAddr& from, int flags, TRequestStatus& aStatus);
+	virtual TInt RecvFromCompletion(TInt& aLength, TInt aStatus);
+	virtual void RecvFromCancel();
+
+	virtual void SendTo(TDes8& aDesc, TSockAddr& to, int flags, TRequestStatus& aStatus);
+	virtual TInt SendToCompletion(TDes8& aDesc, TInt aStatus);
+	virtual void SendToCancel();
+
+	virtual void Sync(TRequestStatus& aStatus);
+	virtual void SyncCancel();
+
+	virtual void Accept(CSocketDesc*& aNewSocket, TRequestStatus& aStatus, RSocketServ& aSs);
+	virtual void AcceptCancel();
+
+	virtual void Connect(TSockAddr& anAddr,TRequestStatus& aStatus);
+	virtual void ConnectCancel();
+
+	virtual void Shutdown(TUint aHow,TRequestStatus& aStatus);
+	virtual void ShutdownCancel();
+
+	virtual TBool TimedRead() {return EFalse;}	//default implementation
+	TInt TimeoutValue() const {return iReadTimeout;}
+
+	virtual TInt LSeek(int& offset, int whence);
+	virtual TInt FStat(struct stat* st);
+	virtual TInt Bind(TSockAddr& anAddr);
+	virtual TInt Listen(TUint qSize);
+	virtual TInt SockName(int anEnd, TSockAddr& anAddr);
+	virtual TInt GetSockOpt(TUint anOptionName,TUint anOptionLevel,TDes8& anOption);
+	virtual TInt SetSockOpt(TUint anOptionName,TUint anOptionLevel,TDesC8& anOption);
+
+	static void Cleanup(TAny *aPtr);
+	void PushLC();
+
+	TInt Close();
+	virtual void UserClose() {return;}
+	inline CFileDescBase* Dup();
+	
+	enum IOQueues 
+		{ 
+		IOreadQ=0, IOwriteQ=1, IOioctlQ=2,IOioctlNQ=3,
+		IOmaxQ=IOioctlNQ 
+		};
+
+	void AddLast(CPosixRequest& aRequest, IOQueues aQueue);
+	void Remove(CPosixRequest& aRequest, IOQueues aQueue);
+
+	TBool ReadIsTimed;
+	TBool ReadWasCancelled;
+	CSerialTimer * TimedMessage;
+
+protected:
+	CFileDescBase();
+	virtual TInt FinalClose();
+	static void Complete(TRequestStatus& aStatus, TInt aResult);
+	TInt iReadTimeout;
+
+private:
+	TInt iDupCount;
+	TFixedArray<TPosixRequestQueue,IOmaxQ+1> iQueues;
+	};
+
+inline CFileDescBase* CFileDescBase::Dup () 
+	{ iDupCount += 1; return this; }
+
+
+NONSHARABLE_CLASS(CTtyDesc) : public CFileDescBase
+/**
+Abstraction of a teletype device, which will be used for
+the console.
+@internalComponent
+*/
+	{
+public:
+	inline CTtyDesc(CConsoleBase *c);
+	inline CTtyDesc();
+	~CTtyDesc();
+
+	void Read(TDes8& aDesc, TRequestStatus &aStatus);
+	void ReadCancel();
+	TInt ReadCompletion(TDes8& aDesc, TInt aStatus);
+	void Write(TDes8& aDesc, TRequestStatus& aStatus);
+	void Ioctl(int aCmd, void* aParam, TRequestStatus& aStatus);
+	TInt IoctlCompletion(int aCmd, void* aParam, TInt aStatus);
+
+protected:
+	virtual TInt FinalClose();
+private:
+	void MapCodeAndEcho(TDes8& aDesc, TKeyCode aCode);
+	void CheckConsoleCreated();
+	void Write(TDes8& aDesc);
+	CConsoleBase *iConsole;
+	};
+
+inline CTtyDesc::CTtyDesc(CConsoleBase *c) : CFileDescBase(), iConsole(c) {}
+inline CTtyDesc::CTtyDesc() : CFileDescBase() {}
+
+NONSHARABLE_CLASS(CRedirDesc) : public CFileDescBase
+/**
+client-side connection to the redirection server
+@internalComponent
+*/
+	{
+public:
+	CRedirDesc();
+	virtual TInt Connect();
+	virtual void Read(TDes8& aDesc, TRequestStatus& aStatus);
+	virtual void Write(TDes8& aDesc, TRequestStatus& aStatus);
+	virtual void Sync(TRequestStatus& aStatus);
+	TInt FinalClose();
+private:
+	RRedirSession2 iRedirSession;
+	TBool iAttemptedConnection;
+	};
+
+NONSHARABLE_CLASS(CFileDesc) : public CFileDescBase
+/**
+Abstractions for a plain file and a temporary file
+@internalComponent
+*/
+	{
+public:
+	CFileDesc();
+	~CFileDesc();
+
+	TInt Open(RFs& aSession, const TDesC& aName, int mode, int perms);
+	TInt LSeek(int& offset, int whence);
+	void Read(TDes8& aDesc, TRequestStatus& aStatus);
+	void Write(TDes8& aDesc, TRequestStatus& aStatus);
+	TInt FStat(struct stat *st);
+	void Sync(TRequestStatus &aStatus);
+	TInt IoctlCompletion(int aCmd, void* aParam, TInt aStatus);
+
+	static void MapStat(struct stat& st, const TTime& aModTime, TUint& aAttr);
+
+protected:
+	virtual TInt FinalClose();
+private:
+	TInt FileRead(TUint8* aPtr,TInt aLength);
+	TInt FileWrite(TUint8* aPtr,TInt aLength);
+	TInt Flush();
+	TInt DoSync();
+	TInt DoRead(TDes8& aDesc);
+	TInt DoWrite(TDes8& aDesc);
+	TInt Pos();
+	TInt Ext();
+	TInt Alloc();
+private:
+	enum {EAlloc,EReading,EWriting};
+	enum {EBufferSize = 0x600,EReadAhead = 0x200};
+protected:
+	RFile	iFile;
+	TInt16	iDrive;	// for use with stat()
+private:
+	TUint8 iState;
+	TUint8* iBuffer;
+	TUint8* iPtr;
+	TUint8* iEnd;
+	TInt iSize;
+	TInt iPos;
+	TInt iExt;
+	};
+
+NONSHARABLE_CLASS(CTempFileDesc) : public CFileDesc
+/**
+@internalComponent
+*/
+	{
+public:
+	TInt Open(RFs& aSession, const TDesC& aPath);
+protected:
+	virtual TInt FinalClose();
+private:
+	RFs iSession;
+	TFileName iName;
+	};
+
+NONSHARABLE_CLASS(CSocketDesc) : public CFileDescBase
+/**
+Abstraction for a socket
+@internalComponent
+*/
+	{
+public:
+	CSocketDesc() : CFileDescBase(), iIoctlBuf(0,0) {}
+
+	TInt Socket(RSocketServ& aSs, int family, int style, int protocol);
+
+	TInt LSeek(int& offset, int whence);
+	void Read(TDes8& aDesc, TRequestStatus& aStatus);
+	void ReadCancel();
+	void Write(TDes8& aDesc, TRequestStatus& aStatus);
+	void WriteCancel();
+	TInt FStat(struct stat* st);
+	void Sync(TRequestStatus& aStatus);
+	void Ioctl(int aCmd, void* aParam, TRequestStatus& aStatus);
+	TInt IoctlCompletion(int aCmd, void* aParam, TInt aStatus);
+	void IoctlCancel();
+
+	void RecvFrom(TDes8& aDesc, TSockAddr& from, int flags, TRequestStatus& aStatus);
+	TInt RecvFromCompletion(TInt& aLength, TInt aStatus);
+	void RecvFromCancel();
+	void SendTo(TDes8& aDesc, TSockAddr& to, int flags, TRequestStatus& aStatus);
+	void SendToCancel();
+
+	void Shutdown(TUint aHow,TRequestStatus& aStatus);
+	void Accept(CSocketDesc*& aNewSocket, TRequestStatus& aStatus, RSocketServ& aSs);
+	void AcceptCancel();
+	void Connect(TSockAddr& anAddr,TRequestStatus& aStatus);
+	void ConnectCancel();
+
+	TInt Bind(TSockAddr& anAddr);
+	TInt Listen(TUint qSize);
+	TInt SockName(int anEnd, TSockAddr& anAddr);
+	TInt GetSockOpt(TUint anOptionName,TUint anOptionLevel,TDes8& anOption);
+	TInt SetSockOpt(TUint anOptionName,TUint anOptionLevel,TDesC8& anOption);
+
+protected:
+	TInt FinalClose();
+private:
+	inline TInt isStream() const;
+
+	RSocket iSocket;
+	TInt iStyle;
+	TSockXfrLength iLength;
+	TPtr8 iIoctlBuf;
+	};
+
+class TUSockAddr : public TSockAddr
+/**
+Utility class for converting struct sockaddr to and from EPOC32 TSockAddr
+@internalComponent
+*/
+	{
+public:
+	TUSockAddr() : TSockAddr() {}
+
+	TUSockAddr(TAny* addr);			// constructor form of Prepare
+	TUSockAddr(TAny* addr, TUint len);	// constructor form of Set
+
+	void Prepare(TAny* addr);
+	void Set(TAny* addr, TUint len);
+	void Get(TAny* addr, unsigned long* len);
+	};
+
+NONSHARABLE_CLASS(CSerialTimer) : public CTimer
+/**
+the serial timer class
+@internalComponent
+*/
+  	{
+public:
+	CSerialTimer();
+	~CSerialTimer();
+
+public:
+	static CSerialTimer* NewLC(CFileDescBase*);
+	static CSerialTimer* NewL(CFileDescBase*);
+
+public:
+	void ConstructL(CFileDescBase*);
+	void IssueRequest(); 
+	void DoCancel();
+	void RunL();
+
+private:
+	CFileDescBase* iFile;
+	};
+
+
+class CNotifier;
+
+NONSHARABLE_CLASS(CSerialDesc) : public CFileDescBase
+/**
+@internalComponent
+*/
+	{
+
+	friend class CNotifier;
+
+	public:
+	CSerialDesc() : CFileDescBase(), iReadThreshold(-1), iRequestedSignals(0),
+					iNotifyStatus(NULL), iNotifyParamPtr(NULL) {}
+
+	TInt Open(RCommServ& aSession, const wchar_t* name, int mode, int perms);
+	TInt FinalClose();
+
+	void Read(TDes8& aDesc, TRequestStatus& aStatus);
+	void ReadCancel();
+	
+	TInt& TimeoutValue() const;
+	void Write(TDes8& aDesc, TRequestStatus& aStatus);
+	
+	void Ioctl(int aCmd, void* aParam, TRequestStatus& aStatus);
+	TInt IoctlCompletion(int aCmd, void* aParam, TInt aStatus);
+	void IoctlCancel();
+
+	TBool TimedRead();
+	void UserClose();
+
+protected:
+
+private:
+
+	void NotifyDataAvailable(TRequestStatus& aStatus);
+	void NotifyOutputEmpty(TRequestStatus& aStatus);
+	void NotifyBreak(TRequestStatus& aStatus);
+	void NotifyWriteErrors(TRequestStatus& aStatus, TUint* aRequestParams, TUint aSignalsMask);
+	void NotifySignalChange(TRequestStatus& iStatus, TUint& aRequestParam, TUint aSignalsMask);
+	void NotifyDataAvailableCancel();
+	void NotifyOutputEmptyCancel();
+	void NotifyBreakCancel();
+	void NotifyWriteErrorsCancel();
+	void NotifySignalChangeCancel();
+	void Notify(TInt aVal);		//complete the notify request
+	TInt NotifiesSupported();	//return the notifies supported at the moment
+	TBool RequestedNotifiesSupported(TInt aRequested);	//see if the notifies requested are supported
+	void CancelNotifiers(const CNotifier* aCompletedNotifier);	//cancel them all apart from the passed one
+	TUint Signals();
+
+	TInt ReadCompletion (TDes8& aBuf, TInt aStatus);	
+
+	TInt iReadThreshold;
+	RComm iCommPort;
+
+	TInt iRequestedSignals;
+	TRequestStatus* iNotifyStatus;
+	TUint* iNotifyParamPtr;
+	TUint* iRequestDataPtr;
+
+	CNotifier* iDataAvailableNotifier;
+	CNotifier* iOutputEmptyNotifier;
+	CNotifier* iBreakNotifier;
+	CNotifier* iErrorsNotifier;
+	CNotifier* iSignalsNotifier;
+
+	};
+
+
+#endif // !_FDESC_H