00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef __io_BufferedInputStream__
00037 #define __io_BufferedInputStream__
00038
00039 #include <stdnet/system/Abstract>
00040 #include <stdnet/io/IOException>
00041 #include <stdnet/io/FilterInputStream>
00042 #include <stdnet/config.h>
00043
00044 namespace stdbase {
00045 namespace io {
00046
00054 class BufferedInputStream
00055 : public FilterInputStream
00056 {
00057 protected:
00058 BufferedInputStream( InputStreamRef input);
00059 virtual ~BufferedInputStream() {};
00060
00061 public:
00062 static system::reference< BufferedInputStream >
00063 create( InputStreamRef r);
00064
00065 virtual int
00066 available() throw (IOException);
00067
00071
00072
00073
00082 virtual void
00083 mark( int readlimit);
00084
00093 virtual void
00094 reset() throw (IOException);
00095
00100 virtual bool
00101 markSupported();
00102
00106 virtual int
00107 read( byte buffer[], int len) throw (IOException);
00108
00115 virtual int
00116 read() throw (IOException);
00117
00123
00124
00125
00126 private:
00127 void prepare_buffer() throw (IOException);
00128
00129 void advance_start_pos( int count) throw (IOException);
00130
00131 private:
00132 enum {
00133 BUFFER_MAX = 2048,
00134 BUFF_CHUNK = 512
00135 };
00136
00137 char buffer[ BUFFER_MAX ];
00138 int start_pos;
00139 int end_pos;
00140 int mark_pos;
00141 int mark_read_limit;
00142 int mark_read_count;
00143
00144 enum {
00145 MARK_READ_LIMIT_NULL = 0,
00146 MARK_READ_LIMIT_EXCEEDED = -1,
00147 MARK_POS_UNSET = -1,
00148 MARK_POS_OVERWRITTEN = -2
00149 };
00150 };
00151
00152 typedef system::reference< BufferedInputStream >
00153 BufferedInputStreamRef;
00154
00155
00156 }
00157 }
00158
00159 #endif // __io_BufferedInputStream__
00160