00001 #ifndef BOOSTER_STREAMBUF_H
00002 #define BOOSTER_STREAMBUF_H
00003
00004 #include <booster/config.h>
00005 #include <streambuf>
00006 #include <stdio.h>
00007 #include <booster/hold_ptr.h>
00008 #include <memory>
00009 #include <vector>
00010
00011 namespace booster {
00012
00018
00019 class io_device {
00020 public:
00024 typedef enum {
00025 set,
00026 cur,
00027 end
00028 } pos_type;
00029
00036 virtual size_t read(char * ,size_t )
00037 {
00038 return 0;
00039 }
00046 virtual size_t write(char const * ,size_t )
00047 {
00048 return 0;
00049 }
00058 virtual long long seek(long long ,pos_type = set)
00059 {
00060 return -1;
00061 }
00062 virtual ~io_device()
00063 {
00064 }
00065 };
00066
00070 class BOOSTER_API streambuf : public std::streambuf {
00071 public:
00072
00076 streambuf();
00077 ~streambuf();
00078
00082 void device(std::auto_ptr<io_device> d);
00086 void device(io_device &d);
00087
00091 void reset_device();
00092
00096 io_device &device();
00101 void set_buffer_size(size_t n);
00102
00103 protected:
00104
00105
00106
00107 virtual std::streampos seekoff( std::streamoff off,
00108 std::ios_base::seekdir way,
00109 std::ios_base::openmode m = std::ios_base::in | std::ios_base::out);
00110 virtual std::streampos seekpos( std::streampos pos,
00111 std::ios_base::openmode m = std::ios_base::in | std::ios_base::out);
00112
00113
00114
00115 virtual int underflow();
00116 virtual int pbackfail(int c = EOF);
00117
00118
00119
00120 virtual int overflow(int c = EOF);
00121 virtual int sync();
00122
00123 private:
00124
00125 std::vector<char> buffer_out_;
00126 std::vector<char> buffer_in_;
00127
00128 size_t buffer_size_;
00129
00130 struct _data;
00131 hold_ptr<_data> d;
00132
00133 std::auto_ptr<io_device> device_auto_ptr_;
00134 io_device *device_;
00135
00136 };
00137 }
00138
00139
00140 #endif