diff -r e20de85af2ee -r ce057bb09d0b genericopenlibs/cstdlib/INC/FDESC.H --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/cstdlib/INC/FDESC.H Fri Jun 04 16:20:51 2010 +0100 @@ -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 +#include +#include +#include +#include + + +#include +#include +#include + +// Queuing support for asynchronous requests +// +class CPosixRequest; +class TPosixRequestQueue : public TSglQue +/** +@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 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