1 // ------------------------------------------------
7 // (c) 2002 peercast.org
8 // ------------------------------------------------
9 // This program is free software; you can redistribute it and/or modify
10 // it under the terms of the GNU General Public License as published by
11 // the Free Software Foundation; either version 2 of the License, or
12 // (at your option) any later version.
14 // This program is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 // GNU General Public License for more details.
18 // ------------------------------------------------
23 // -------------------------------------
32 // -------------------------------------
51 virtual int readUpto(void *,int) {return 0;}
52 virtual int read(void *,int)=0;
53 virtual void write(const void *,int) = 0;
56 throw StreamException("Stream can`t eof");
62 throw StreamException("Stream can`t rewind");
65 virtual void seekTo(int)
67 throw StreamException("Stream can`t seek");
70 void writeTo(Stream &out, int len);
71 virtual void skip(int i);
77 virtual void setReadTimeout(unsigned int )
80 virtual void setWriteTimeout(unsigned int )
83 virtual void setPollRead(bool)
87 virtual int getPosition() {return 0;}
118 read(id.getData(),4);
136 int readString(char *s, int max)
151 virtual bool readReady() {return true;}
152 virtual int numPending() {return 0;}
155 void writeID4(ID4 id)
157 write(id.getData(),4);
160 void writeChar(char v)
164 void writeShort(short v)
169 void writeLong(long v)
174 void writeInt(int v) {writeLong(v);}
176 void writeTag(long v)
182 void writeTag(char id[4])
187 int writeUTF8(unsigned int);
190 int readLine(char *in, int max);
192 int readWord(char *, int);
193 int readBase64(char *, int);
195 void write(const char *,va_list);
196 void writeLine(const char *);
197 void writeLineF(const char *,...);
198 void writeString(const char *);
199 void writeStringF(const char *,...);
205 void updateTotals(unsigned int,unsigned int);
208 unsigned char bitsBuffer;
209 unsigned int bitsPos;
211 unsigned int totalBytesIn,totalBytesOut;
212 unsigned int lastBytesIn,lastBytesOut;
213 unsigned int bytesInPerSec,bytesOutPerSec;
214 unsigned int lastUpdate;
219 // -------------------------------------
220 class FileStream : public Stream
223 FileStream() {file=NULL;}
225 void openReadOnly(const char *);
226 void openWriteReplace(const char *);
227 void openWriteAppend(const char *);
228 bool isOpen(){return file!=NULL;}
232 virtual void seekTo(int);
233 virtual int getPosition() {return pos();}
234 virtual void flush();
235 virtual int read(void *,int);
236 virtual void write(const void *,int);
238 virtual void rewind();
239 virtual void close();
243 // -------------------------------------
244 class MemoryStream : public Stream
255 MemoryStream(void *p, int l)
271 ~MemoryStream() {free2();}
273 void readFromFile(FileStream &file)
293 virtual int read(void *p,int l)
297 memcpy(p,&buf[pos],l);
307 virtual void write(const void *p,int l)
310 throw StreamException("Stream - premature end of write()");
311 memcpy(&buf[pos],p,l);
320 virtual void rewind()
325 virtual void seekTo(int p)
330 virtual int getPosition()
335 void convertFromBase64();
342 // --------------------------------------------------
343 class IndirectStream : public Stream
352 virtual int read(void *p,int l)
354 return stream->read(p,l);
357 virtual void write(const void *p,int l)
364 return stream->eof();
375 // -------------------------------------
377 class SockBufStream : public Stream
380 SockBufStream(Stream &sockStream, int bufsize=128*1024)
381 : sock(sockStream), mem(bufsize)
391 virtual int read(void *p,int l)
393 return sock.read(p, l);
396 virtual void write(const void *p, int len)
398 if ( mem.pos+len > mem.len )
407 sock.write(mem.buf, mem.pos);
412 void clearWriteBuffer()
422 // -------------------------------------
423 class WriteBufferStream : public Stream
426 WriteBufferStream(Stream *out_)
435 WriteBufferStream(void *p, int l, Stream *out_)
444 WriteBufferStream(int l, Stream *out_)
451 buf = (char*)malloc(l);
453 throw GeneralException("cannot allocate memory", 0x1234);
456 virtual ~WriteBufferStream()
460 } catch (StreamException &) {}
464 void readFromFile(FileStream &file)
475 if (!out || !buf) return;
476 out->write(buf, pos);
491 virtual int read(void *p,int l)
496 virtual void write(const void *p,int l)
498 char *cp = (char *) p;
499 while ((pos + l) >= len) {
501 memcpy(&buf[pos], cp, n);
506 if (pos != 0) return;
509 memcpy(&buf[pos], cp, l);
519 virtual void rewind()
524 virtual void seekTo(int p)
529 virtual int getPosition()
534 void convertFromBase64();
543 // write
\82³
\82ê
\82½
\82à
\82Ì
\82ð
\8eÌ
\82Ä
\82Ä
\83o
\83C
\83g
\90\94\82¾
\82¯
\83J
\83E
\83\93\83g
\82·
\82é
\83X
\83g
\83\8a\81[
\83\80
544 class DummyStream : public Stream
547 unsigned long length;
550 DummyStream() : length(0) {};
552 void write(const void *p, int l)
557 unsigned long getLength()
563 int read(void *, int) { return 0; }