#ifndef TOOLBOX_SELECT_H #define TOOLBOX_SELECT_H #include "tools/tools.h" #include /* cTBSelect provides an interface for polling UNIX-like file descriptors. */ class cTBSelect { private: int m_MaxFiled; fd_set m_Rfds; fd_set m_Wfds; public: cTBSelect(void); virtual ~cTBSelect(); /* Clear() resets the object for use in a new Select() call. All file descriptors and their previous states are invalidated. */ virtual void Clear(void); /* Add() adds a file descriptor to be polled in the next Select() call. That call polls if the file is readable if Output is set to false, writeable otherwise. */ virtual bool Add(int Filed, bool Output = false); /* Select() polls all descriptors added by Add() and returns as soon as one of those changes state (gets readable/writeable), or after TimeoutMs milliseconds, whichever happens first. It returns the number of filedescriptors that have changed state. On error, -1 is returned and errno is set appropriately. */ virtual int Select(uint TimeoutMs); /* Select() polls all descriptors added by Add() and returns as soon as one of those changes state (gets readable/writeable). It returns the number of filedescriptors that have changed state. On error, -1 is returned and errno is set appropriately. */ virtual int Select(void); /* CanRead() returns true if the descriptor has changed to readable during the last Select() call. Otherwise false is returned. */ virtual bool CanRead(int FileNo) const; /* CanWrite() returns true if the descriptor has changed to writeable during the last Select() call. Otherwise false is returned. */ virtual bool CanWrite(int FileNo) const; }; inline void cTBSelect::Clear(void) { FD_ZERO(&m_Rfds); FD_ZERO(&m_Wfds); m_MaxFiled = -1; } inline bool cTBSelect::Add(int Filed, bool Output /* = false */) { if (Filed < 0) return false; FD_SET(Filed, Output ? &m_Wfds : &m_Rfds); if (Filed > m_MaxFiled) m_MaxFiled = Filed; return true; } inline bool cTBSelect::CanRead(int FileNo) const { if (FileNo < 0) return false; return FD_ISSET(FileNo, &m_Rfds); } inline bool cTBSelect::CanWrite(int FileNo) const { if (FileNo < 0) return false; return FD_ISSET(FileNo, &m_Wfds); } #endif // TOOLBOX_SELECT_H