diff options
| author | Pixel <pixel@nobis-crew.org> | 2011-10-10 19:36:55 -0700 | 
|---|---|---|
| committer | Pixel <pixel@nobis-crew.org> | 2011-10-10 19:36:55 -0700 | 
| commit | 965148b43b5b859934b7af2e8447ba1026a43a19 (patch) | |
| tree | 290ff60cd1ebc9a065109620b2e9a5ff4e5b3d17 /includes/Handle.h | |
| parent | cf9a801ebcb4df0a8b1ea75e58ca8ea8960ba13b (diff) | |
Adding the basic "Handle" structure, and adding an early version of Input.
Renamed suspend() to yield().
Fixed a couple of bugs, and reorganized slightly some code.
Diffstat (limited to 'includes/Handle.h')
| -rw-r--r-- | includes/Handle.h | 64 | 
1 files changed, 64 insertions, 0 deletions
diff --git a/includes/Handle.h b/includes/Handle.h new file mode 100644 index 0000000..d2e1f8c --- /dev/null +++ b/includes/Handle.h @@ -0,0 +1,64 @@ +#pragma once + +#include <Exceptions.h> + +namespace Balau { + +class EAgain : public GeneralException { +  public: +      EAgain() : GeneralException("Try Again") { } +}; + +class IO; + +class Handle { +  public: +      virtual ~Handle() { Assert(m_refCount == 0); } +    virtual void close() throw (GeneralException) = 0; +    virtual bool isClosed() = 0; +    virtual bool canSeek(); +    virtual bool canRead(); +    virtual bool canWrite(); +    virtual const char * getName() = 0; +    virtual ssize_t read(void * buf, size_t count) throw (GeneralException); +    virtual ssize_t write(const void * buf, size_t count) throw (GeneralException); +    virtual void rseek(off_t offset, int whence = SEEK_SET) throw (GeneralException); +    virtual void wseek(off_t offset, int whence = SEEK_SET) throw (GeneralException); +    virtual off_t rtell() throw (GeneralException); +    virtual off_t wtell() throw (GeneralException); +    virtual off_t getSize(); +  protected: +      Handle() : m_refCount(0) { } +  private: +    void addRef() { m_refCount++; } +    void delRef() { if (--m_refCount == 0) { if (!isClosed()) close(); delete this; } } +    int refCount() { return m_refCount; } +    friend class IO; + +    int m_refCount; +}; + +class IO { +  public: +      template<class T> IO(T * h) { setHandle(h); } +      ~IO() { m_h->delRef(); } +      IO(const IO & io) { setHandle(io.m_h); } +    Handle * operator->() { return m_h; } +  protected: +    void setHandle(Handle * h) { m_h = h; m_h->addRef(); } +  private: +    Handle * m_h; +}; + +class SeekableHandle : public Handle { +  public: +    virtual bool canSeek(); +    virtual void rseek(off_t offset, int whence = SEEK_SET) throw (GeneralException); +    virtual void wseek(off_t offset, int whence = SEEK_SET) throw (GeneralException); +    virtual off_t rtell() throw (GeneralException); +    virtual off_t wtell() throw (GeneralException); +  private: +    off_t m_wOffset, m_rOffset; +}; + +};  | 
