00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef _DECAF_IO_INPUTSTREAM_H_
00019 #define _DECAF_IO_INPUTSTREAM_H_
00020
00021 #include <decaf/io/IOException.h>
00022 #include <decaf/io/Closeable.h>
00023 #include <decaf/util/concurrent/Synchronizable.h>
00024 #include <decaf/util/concurrent/Mutex.h>
00025 #include <decaf/lang/exceptions/UnsupportedOperationException.h>
00026 #include <decaf/lang/exceptions/NullPointerException.h>
00027 #include <decaf/lang/exceptions/IndexOutOfBoundsException.h>
00028 #include <decaf/util/Config.h>
00029
00030 namespace decaf{
00031 namespace io{
00032
00039 class DECAF_API InputStream: public Closeable, virtual public util::concurrent::Synchronizable {
00040 private:
00041
00042
00043 util::concurrent::Mutex mutex;
00044
00045 private:
00046
00047 InputStream(const InputStream&);
00048 InputStream& operator=(const InputStream&);
00049
00050 public:
00051
00052 InputStream();
00053
00054 virtual ~InputStream();
00055
00064 virtual void close();
00065
00082 virtual void mark(int readLimit);
00083
00111 virtual void reset();
00112
00122 virtual bool markSupported() const {
00123 return false;
00124 }
00125
00139 virtual int available() const {
00140 return 0;
00141 }
00142
00156 virtual int read();
00157
00186 virtual int read(unsigned char* buffer, int size);
00187
00233 virtual int read(unsigned char* buffer, int size, int offset, int length);
00234
00256 virtual long long skip(long long num);
00257
00265 virtual std::string toString() const;
00266
00267 protected:
00268
00269 virtual int doReadByte() = 0;
00270
00271 virtual int doReadArray(unsigned char* buffer, int size);
00272
00273 virtual int doReadArrayBounded(unsigned char* buffer, int size, int offset, int length);
00274
00275 public:
00276
00277 virtual void lock() {
00278 mutex.lock();
00279 }
00280
00281 virtual bool tryLock() {
00282 return mutex.tryLock();
00283 }
00284
00285 virtual void unlock() {
00286 mutex.unlock();
00287 }
00288
00289 virtual void wait() {
00290 mutex.wait();
00291 }
00292
00293 virtual void wait(long long millisecs) {
00294 mutex.wait(millisecs);
00295 }
00296
00297 virtual void wait(long long millisecs, int nanos) {
00298 mutex.wait(millisecs, nanos);
00299 }
00300
00301 virtual void notify() {
00302 mutex.notify();
00303 }
00304
00305 virtual void notifyAll() {
00306 mutex.notifyAll();
00307 }
00308
00309 };
00310
00311 }}
00312
00313 #endif