/* * Ivy League * * File descriptors, channels * * Copyright 1990-2000 * Laboratoire de Recherche en Informatique (LRI) * Centre d'Etudes de la Navigation Aerienne (CENA) * * original code by Michel Beaudouin-Lafon, * heavily modified by Stephane Chatty and Stephane Sire * * $Id$ * */ #ifndef Channel_H_ #define Channel_H_ #ifdef __GNUG__ #pragma interface #endif #include "cplus_bugs.h" #include "ivl/bool.h" #include "IOS.h" class IvlMsgBuffer; class IvlString; // we need read and write system calls #include #ifndef NFILE #define NFILE 64 #endif enum IOMODE { IONone = 0, IORead = 1, IOWrite = 2, IOReadWrite = 3, IOSelect = 4, IOReadSelect = 5, IOWriteSelect = 6, IOAll = 7 }; extern char* StrReprBuf; class IvlFd { private: static void Use (int); static void Unuse (int); protected: int Fd; public: inline IvlFd () : Fd (-1) { } inline IvlFd (const IvlFd& fd) { Use (Fd = fd.Fd); } inline IvlFd (int fd) { Use (Fd = fd); } inline ~IvlFd () { Unuse (Fd); } inline operator int () const { return Fd; } inline IvlFd& operator = (const IvlFd& fd) { Unuse (Fd); Fd = fd.Fd; Use (Fd); return *this; } inline void Open (int fd) { Unuse (Fd); Use (Fd = fd); } inline void Close () { Unuse (Fd); Fd = -1; } inline bool Opened () { return bool (Fd >= 0); } inline int Read (byte* b, int n) { return read (Fd, (char*) b, n); } inline int Write (byte* b, int n) { return write (Fd, (const char*) b, n); } char* StrRepr (char* = StrReprBuf); }; // This class defines channels, ie file descriptors with handlers for read/write. // The file descriptor of a channel is immutable: once created, it cannot change; // this is crucial for channel sets, for instance. // Be careful with Copy and operator= if redefined because this can // potentially bypass immutability. // class IvlChannel : public IvlIOS { friend class IvlBaseScheduler; protected: IvlFd Fd; IOMODE Mode; IvlBaseScheduler* Mpx; virtual void Added (); virtual void Removed (); public: IvlChannel (); IvlChannel (int, IOMODE = IOReadWrite); IvlChannel (const IvlChannel& ch); ~IvlChannel (); inline void Open (int fd) { if (Fd < 0) Fd.Open (fd); } inline void Close () { if (Fd.Opened ()) Fd.Close (); } inline IOMODE IOMode () const { return Mode; } inline void SetMode (IOMODE io) { Mode = io; } int Read (IvlMsgBuffer&); int Write (IvlMsgBuffer&); bool ReadBuffer (IvlMsgBuffer&); bool WriteBuffer (IvlMsgBuffer&); void Add (IvlBaseScheduler*); void Remove (); virtual void HandleWrite (); virtual void HandleRead (); inline int GetFd () const { return Fd; } inline int Read (byte* b, int n) { return read (Fd, (char*) b, n); } inline int Write (const byte* b, int n) { return write (Fd, (const char*) b, n); } inline operator int () { return Fd; } inline IvlBaseScheduler* GetScheduler () const { return Mpx; } inline char* StrRepr (char* s = StrReprBuf) { return Fd.StrRepr (s); } virtual void WriteLong (lword); virtual void WriteShort (sword); virtual void WriteByte (byte); virtual void WriteChar (char); virtual void WriteString (const char*); virtual void WriteBuf (const byte*, int); virtual bool ReadLong (lword&); virtual bool ReadShort (sword&); virtual bool ReadByte (byte&); virtual bool ReadChar (char&); virtual int ReadString (char*, int); virtual int ReadString (IvlString&); virtual bool ReadBuf (byte*, int); }; #endif /* Channel_H_ */