00001 #ifndef __NONBLOCKINGREADER_H__
00002 #define __NONBLOCKINGREADER_H__
00003
00004 namespace jcpp {
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00020 class NonblockingReader : public virtual Reader {
00021 private:
00022
00023 CDELETE Reader* in;
00024
00025 char* cb;
00026 char* tmp;
00027 int nChars;
00028 int nextChar;
00029 int maxChars;
00030 int incrChars;
00031 int defaultCharBufferSize;
00032 int defaultExpectedLineLength;
00033
00037 void compactBuffer();
00040 boolean fillNonblocking();
00044 void expandBufferMemory();
00045
00046 public:
00047
00048 NonblockingReader(Reader* in);
00049 virtual ~NonblockingReader();
00051 virtual void close() {
00052 in->close();
00053 }
00055 virtual void mark() {
00056 en((char *)"not allowed to use mark() in Reader");
00057 }
00059 virtual boolean markSupported() {
00060 return FALSE;
00061 }
00063 virtual int read();
00065 virtual int read(char* cbuf, int length) {
00066 return read(cbuf, 0 , length);
00067 }
00068
00069 private:
00070
00074 int preRead(char* cbuf, int off, int length);
00077 int nonblockingRead(char* cbuf, int off, int length);
00078
00079 public:
00080
00084 virtual int read(char* cbuf, int off, int length);
00086 virtual boolean ready() {
00087 return (nextChar < nChars) || in->ready();
00088 }
00091 virtual void reset() {
00092 en((char *)":-( Reader::reset() not supported");
00093 }
00095 virtual long skip(long length);
00099 virtual CFREE char* readLine();
00100 private:
00101
00102 int findLineInBuffer();
00103
00104 };
00105
00106 } ENDSEMI
00107
00108
00109
00110 #endif // __NONBLOCKINGREADER_H__